日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

redis3.0.2 分布式集群安装详细步骤

發布時間:2025/7/14 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis3.0.2 分布式集群安装详细步骤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • redis3.0.2 分布式集群安裝詳細步驟

  • ????????????????????????????? --(centos5.8 X64系統)

    版本歷史

    時間

    版本

    說明

    編寫者

    2015-06-5

    1.0

    redis3.0.2 分布式集群安裝詳細步驟

    csc













    ?

    ?

    ?

    : redis cluster介紹篇

    1:redis cluster的現狀

    目前redis支持的cluster特性(已親測):

    1):節點自動發現

    2):slave->master 選舉,集群容錯

    3):Hot resharding:在線分片

    4):進群管理:cluster xxx

    5):基于配置(nodes-port.conf)的集群管理

    6):ASK 轉向/MOVED 轉向機制.

    2:redis cluster 架構

    1)redis-cluster架構圖

    ?

    架構細節:

    (1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.

    (2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.

    (3)客戶端與redis節點直連,不需要中間proxy.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可

    (4)redis-cluster把所有的物理節點映射到[0-16383]slot,cluster 負責維護node<->slot<->value

    2) redis-cluster選舉:容錯

    ?

    (1)領著選舉過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉.

    (2):什么時候整個集群不可用(cluster_state:fail),當集群不可用時,所有對集群的操作做都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤

    ? ? a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成進群的slot映射[0-16383]不完成時進入fail狀態.

    ? ? b:如果進群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.

    ?

    ?

    二.Redis集群安裝篇(centos5.8X64系統)

    ?

    (要讓集群正常工作至少需要3個主節點,在這里我們要創建6redis節點,其中三個為主節點,三個為從節點,對應的redis節點的ip和端口對應關系如下)

    ?

    127.0.0.1:7000

    127.0.0.1:7001

    127.0.0.1:7002

    127.0.0.1:7003

    127.0.0.1:7004

    127.0.0.1:7005

    ?

    1:下載redis。

    官網下載3.0.0版本,之前2.幾的版本不支持集群模式

    下載地址:http://download.redis.io/releases/redis-3.0.2.tar.gz

    ?

    2:上傳服務器,解壓,編譯

    tar -zxvf redis-3.0.2.tar.gz.tar.gz

    mv redis-3.0.2.tar.gz.tar.gz redis3.0

    cd /usr/local/redis3.0

    make

    make install

    ?

    3:創建集群需要的目錄

    mkdir -p /usr/local/cluster

    cd /usr/local/cluster

    mkdir 7000

    mkdir 7001

    mkdir 7002

    mkdir 7003

    mkdir 7004

    mkdir 7005

    ?

    4:修改配置文件redis.conf

    cp /usr/local/redis3.0/redis.conf? /usr.local/cluster

    vi redis.conf

    ##修改配置文件中的下面選項

    port 7000

    daemonize yes

    cluster-enabled yes

    cluster-config-file nodes.conf

    cluster-node-timeout 5000

    appendonly yes

    ##修改完redis.conf配置文件中的這些配置項之后把這個配置文件分別拷貝到7000/7001/7002/7003/7004/7005目錄下面

    cp /usr/local/cluster/redis.conf/usr/local/cluster/7000

    cp /usr/local/cluster/redis.conf/usr/local/cluster/7001

    cp /usr/local/cluster/redis.conf /usr/local/cluster/7002

    cp /usr/local/cluster/redis.conf/usr/local/cluster/7003

    cp /usr/local/cluster/redis.conf/usr/local/cluster/7004

    cp /usr/local/cluster/redis.conf/usr/local/cluster/7005

    ?

    ##注意:拷貝完成之后要修改7001/7002/7003/7004/7005目錄下面redis.conf文件中的port參數,分別改為對應的文件夾的名稱

    ?

    5:分別啟動這6個redis實例

    cd /usr/local/cluster/7000

    redis-server redis.conf

    ?

    cd /usr/local/cluster/7001

    redis-server redis.conf

    ?

    cd /usr/local/cluster/7002

    redis-server redis.conf

    ?

    cd /usr/local/cluster/7003

    redis-server redis.conf

    ?

    cd /usr/local/cluster/7004

    redis-server redis.conf

    ?

    cd /usr/local/cluster/7005

    redis-server redis.conf

    ?

    ?

    ##啟動之后使用命令查看redis的啟動情況ps -ef|grep redis

    如下顯示則說明啟動成功

    ?# ps -ef|grepredis

    root????13703???? 1? 0 10:03 ???????? 00:00:00 redis-server *:7000 [cluster]

    root????14015???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7002 [cluster]

    root????14133???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7003 [cluster]

    root????14172???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7004 [cluster]

    root????14187???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7005 [cluster]

    root????14323???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7001 [cluster]

    6.升級ruby 安裝gem

    ?

    安裝gem 需要ruby的版本在 1.8.7 以上,默認的centos5 上都是1.8.5 版本,所以首先你的升級你的ruby

    rpm -ivh http://yum.puppetlabs.com/el/5/products/x86_64/puppetlabs-release-5-6.noarch.rpm

    ?

    yum install ruby ruby-devel rubygems rpm-build

    ?

    檢查 ruby 版本:

    #ruby? -v

    ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

    ?

    是否安裝rubygems

    # rpm -qa|grep ruby

    ruby-rdoc-1.8.7.374-2.el5

    ruby-1.8.7.374-2.el5

    ruby-devel-1.8.7.374-2.el5

    ruby-devel-1.8.7.374-2.el5

    ruby-mode-1.8.5-24.el5

    ruby-irb-1.8.7.374-2.el5

    ruby-libs-1.8.7.374-2.el5

    ruby-libs-1.8.7.374-2.el5

    rubygems-1.3.7-1.el5

    ?

    7.gem 安裝redis ruby 接口

    gem install redis

    8:執行redis的創建集群命令創建集群

    #redis-trib.rbcreate子命令構建?

    #--replicas 則指定了為Redis Cluster中的每個Master節點配備幾個Slave節點?

    #節點角色由順序決定,master之后是slave

    創建方式:

    cd /usr/local/redis3.0/src

    ./redis-trib.rb?create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

    錯誤筆記備注:

    ?

    8.1執行上面的命令的時候會報錯,因為是執行的ruby的腳本,需要ruby的環境

    錯誤內容:/usr/bin/env: ruby: No suchfile or directory

    所以需要安裝ruby的環境,這里推薦使用yum install ruby安裝

    yum install ruby

    ?

    8.2然后再執行第6步的創建集群命令,還會報錯,提示缺少rubygems組件,使用yum安裝

    ?

    錯誤內容:

    ./redis-trib.rb:24:in `require': no such file to load-- rubygems (LoadError)

    from ./redis-trib.rb:24

    yum install rubygems

    8.3再次執行第8步的命令,還會報錯,提示不能加載redis,是因為缺少redisruby的接口,使用gem 安裝

    錯誤內容:

    /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in`gem_original_require': no such file to load -- redis (LoadError)

    from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

    from ./redis-trib.rb:25

    ?

    gem install redis

    ?

    ?

    8.4 再次執行第8步的命令,正常執行

    輸入yes,然后配置完成。

    注意觀察主從的配置:

    默認是前三個節點 7000? 7001?7002 是主,

    3個節點 7003? 7004?? 7005 是從

    如果是部署在不同的服務器,請根據主從分部規則,分開在不同的服務器

    ?

    ?

    至此redis集群即搭建成功!

    9:使用redis-cli命令進入集群環境

    redis-cli?-c?-p?7000

    ?

    三.測試篇

    1).檢查集群狀態,

    # /usr/local/redis-3.0.2/src/redis-trib.rb check 127.0.0.1:7000

    Connecting to node 127.0.0.1:7000: OK

    Connecting to node 127.0.0.1:7005: OK

    Connecting to node 127.0.0.1:7002: OK

    Connecting to node 127.0.0.1:7003: OK

    Connecting to node 127.0.0.1:7004: OK

    Connecting to node 127.0.0.1:7001: OK

    >>> Performing Cluster Check (using node 127.0.0.1:7000)

    M: 6bce685c31ed91d5da07048a8e130bd2cf810690 127.0.0.1:7000

    ? ?slots:0-5460 (5461 slots) master

    ? ?1 additional replica(s)

    S: a2ed19aaae15d625ff4279d0d8adfb812db9da29 127.0.0.1:7005

    ? ?slots: (0 slots) slave

    ? ?replicates af47fc62aacfe80257f820626389693e5f19598e

    M: af47fc62aacfe80257f820626389693e5f19598e 127.0.0.1:7002

    ? ?slots:10923-16383 (5461 slots) master

    ? ?1 additional replica(s)

    S: 5addc020d00fcccf8858e908b5a44d90d3c1ef8e 127.0.0.1:7003

    ? ?slots: (0 slots) slave

    ? ?replicates 6bce685c31ed91d5da07048a8e130bd2cf810690

    S: d5278a2bf6cd50fbc171bc5e9898402cf815c0a9 127.0.0.1:7004

    ? ?slots: (0 slots) slave

    ? ?replicates 0a16fe3fab8a468d402071dcea9f13aac28325c2

    M: 0a16fe3fab8a468d402071dcea9f13aac28325c2 127.0.0.1:7001

    ? ?slots:5461-10922 (5462 slots) master

    ? ?1 additional replica(s)

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.



    #redis-trib.rbcheck子命令構建?

    #ip:port可以是集群的任意節點?

    ./redis-trib.rb check ?127.0.0.1:7000

    ?最后輸出如下信息,沒有任何警告或錯誤,表示集群啟動成功并處于ok狀態

    ?

    ?

    2):添加新master節點

    (1)添加一個master節點:創建一個空節點(empty node),然后將某些slot移動到這個空節點上,這個過程目前需要人工干預

    a):根據端口生成配置文件(ps:establish_config.sh是我自己寫的輸出配置腳本)

    ?

    ?

    sh establish_config.sh 6386 >conf/redis-6386.conf?

    ?

    b):啟動節點

    ?

    ?

    nohup redis-server /opt/redis/conf/redis-6386.conf> /opt/redis/logs/redis-6386.log 2>&1 &?

    ?

    c):加入空節點到集群

    add-node? 將一個節點添加到集群里面,第一個是新節點ip:port, 第二個是任意一個已存在節點ip:port

    ?

    ?

    redis-trib.rb add-node 10.10.34.14:638610.10.34.14:6381?

    ?

    node:新節點沒有包含任何數據,因為它沒有包含任何slot。新加入的加點是一個主節點,當集群需要將某個從節點升級為新的主節點時,這個新節點不會被選中

    d):為新節點分配slot

    ?

    ?

    redis-trib.rb reshard 10.10.34.14:6386?

    #根據提示選擇要遷移的slot數量(ps:這里選擇500)?

    How many slots do you want to move (from 1 to 16384)?500?

    #選擇要接受這些slotnode-id?

    What is the receiving node ID?f51e26b5d5ff74f85341f06f28f125b7254e61bf?

    #選擇slot來源:?

    #all表示從所有的master重新分配,?

    #或者數據要提取slotmaster節點id,最后用done結束?

    Please enter all the source node IDs.?

    ? Type 'all' touse all the nodes as source nodes for the hash slots.?

    ? Type 'done'once you entered all the source nodes IDs.?

    Source node #1:all?

    #打印被移動的slot后,輸入yes開始移動slot以及對應的數據.?

    #Do you want to proceed with the proposed reshard plan(yes/no)? yes?

    #結束?

    3):添加新的slave節點

    a):前三步操作同添加master一樣

    b)第四步:redis-cli連接上新節點shell,輸入命令:cluster replicate 對應masternode-id

    ?

    ?

    cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835?

    ?

    note:在線添加slave 時,需要dump整個master進程,并傳遞到slave,再由 slave加載rdb文件到內存,rdb傳輸過程中Master可能無法提供服務,整個過程消耗大量io,小心操作.

    例如本次添加slave操作產生的rdb文件

    ?

    ?

    -rw-r--r-- 1 root root?34946 Apr 17 18:23 dump-6386.rdb?

    -rw-r--r-- 1 root root?34946 Apr 17 18:23 dump-7386.rdb?

    ?

    4):在線reshard 數據:

    對于負載/數據均勻的情況,可以在線reshard slot來解決,方法與添加新masterreshard一樣,只是需要reshardmaster節點是老節點.

    5):刪除一個slave節點

    ?

    #redis-trib del-node ip:port '<node-id>'?

    redis-trib.rb del-node 10.10.34.14:7386'c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378'?

    ?6):刪除一個master節點

    ?

    a):刪除master節點之前首先要使用reshard移除master的全部slot,然后再刪除當前節點(目前只能把被刪除

    masterslot遷移到一個節點上)

    ?

    ?

    #10.10.34.14:6386當前master遷移到10.10.34.14:6380?

    redis-trib.rb reshard 10.10.34.14:6380?

    #根據提示選擇要遷移的slot數量(ps:這里選擇500)?

    How many slots do you want to move (from 1 to 16384)?500(被刪除master的所有slot數量)?

    #選擇要接受這些slotnode-id(10.10.34.14:6380)?

    What is the receiving node ID?c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:10.10.34.14:6380node-id)?

    Please enter all the source node IDs.?

    ? Type 'all' touse all the nodes as source nodes for the hash slots.?

    ? Type 'done'once you entered all the source nodes IDs.?

    Source node#1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被刪除masternode-id)?

    Source node #2:done?

    #打印被移動的slot后,輸入yes開始移動slot以及對應的數據.?

    #Do you want to proceed with the proposed reshard plan(yes/no)? yes?

    ?

    b):刪除空master節點

    ?

    ?

    redis-trib.rb del-node 10.10.34.14:6386'f51e26b5d5ff74f85341f06f28f125b7254e61bf'?

    四:redis cluster 客戶端(Jedis)

    1:客戶端基本操作使用

    ?

    ?

    <span style="color: #333333; font-family:Arial, sans-serif;"><span style="color: #333333; font-family:Arial, sans-serif;"> private static BinaryJedisCluster jc;?

    ? static {?

    ?????? //只給集群里一個實例就可以?

    ???????Set<HostAndPort> jedisClusterNodes = newHashSet<HostAndPort>();?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6380));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6381));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6382));?

    ??????? jedisClusterNodes.add(newHostAndPort("10.10.34.14", 6383));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6384));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7380));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7381));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7382));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7383));?

    ???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7384));?

    ??????? jc = newBinaryJedisCluster(jedisClusterNodes);?

    ??? }?

    @Test?

    ??? public voidtestBenchRedisSet() throws Exception {?

    ??????? finalStopwatch stopwatch = new Stopwatch();?

    ??????? Listlist = buildBlogVideos();?

    ??????? for (inti = 0; i < 1000; i++) {?

    ???????????String key = "key:" + i;?

    ???????????stopwatch.start();?

    ???????????byte[] bytes1 = protostuffSerializer.serialize(list);?

    ???????????jc.setex(key, 60 * 60, bytes1);?

    ???????????stopwatch.stop();?

    ??????? }?

    ??????? System.out.println("time="+ stopwatch.toString());?

    ???}</span></span>?

    2:jedis客戶端的坑.

    1)cluster環境下redisslave不接受任何讀寫操作,

    2)client端不支持keys批量操作,不支持select dbNum操作,只有一個db:select 0

    3)JedisCluster info()等單機函數無法調用,返回(No way to dispatch thiscommand to Redis Cluster)錯誤,.

    4)JedisCluster 沒有針對byte[]API,需要自己擴展(附件是我加的基于byte[]BinaryJedisCluster? api)

    ?

    ?


    轉載于:https://blog.51cto.com/2574526/1658806

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的redis3.0.2 分布式集群安装详细步骤的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。