Redis Cluster原理介绍和部署实战

  |   1 评论   |   2,022 浏览

    Redis单实例性能不错,能应付不少场景,随着网站流量增大,业务增多,单实例已经扛不住了,需要有新的方案出来。

    有朋友说,单实例不行,那就多个呗,多几个实例,采用分片技术使key落到不同的实例上。

    Twemproxy就是这个思路, 是在多个redis实例和应用之间充当proxy,采用一致性hash思想。

    当然还可以直接在客户端做分片的,ShardedJedis 算一个,这个实现有个坏处,一旦客户端有bug,升级起来麻烦,还要重启。

    分片技术也是一个方案,但扩容和缩容时,需要用脚本移动key,不够灵活,操作很麻烦。

    Redis3推出集群方案后,目前已经有越来越多的互联网项目间接或直接使用了此方案。


    原理介绍(只写要点

    Redis Cluster 被设计成了无中心节点,利于扩展,集群中的任意一个节点都能保存和获取集群的信息,下面是官方提供的一个描述节点之间关系的架构图

    集群中节点之间通过Gossip 协议来传播关于集群的信息,以此来发现新的节点,并且节点之间发送ping命令,以此来检测节点的健康情况,当节点异常时选举新的主节点。 Gossip协议参考


    集群中每个节点都要开启2个TCP端口,一个供Client使用 比如 7000,另一个供集群中的其他节点与本节点交换信息用,这个端口不用指点,它是由 7000 + 10000 得来的,即第二个端口为 17000 。

    tcp        0      0 0.0.0.0:17000               0.0.0.0:*                   LISTEN      14166/redis-server  
    tcp        0      0 0.0.0.0:17001               0.0.0.0:*                   LISTEN      14170/redis-server  
    tcp        0      0 0.0.0.0:17002               0.0.0.0:*                   LISTEN      14174/redis-server  
    tcp        0      0 0.0.0.0:17003               0.0.0.0:*                   LISTEN      14178/redis-server  
    tcp        0      0 0.0.0.0:17004               0.0.0.0:*                   LISTEN      14182/redis-server  
    tcp        0      0 0.0.0.0:17005               0.0.0.0:*                   LISTEN      14186/redis-server  
    tcp        0      0 0.0.0.0:7000                0.0.0.0:*                   LISTEN      14166/redis-server  
    tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      14170/redis-server  
    tcp        0      0 0.0.0.0:7002                0.0.0.0:*                   LISTEN      14174/redis-server  
    tcp        0      0 0.0.0.0:7003                0.0.0.0:*                   LISTEN      14178/redis-server  
    tcp        0      0 0.0.0.0:7004                0.0.0.0:*                   LISTEN      14182/redis-server  
    tcp        0      0 0.0.0.0:7005                0.0.0.0:*                   LISTEN      14186/redis-server  
    上面的信息,是我们接下来部署集群的时候,我先贴出来,可以很清楚看到端口占用情况。


    Redis Cluster为了保证集群的高可用,采用Master-Slave的部署方式,就是一个Master节点可以有一个或多个Slave,当Master挂掉时,会自动选举Slave为Master。 其实Redis Cluster已经集成了Sentinel模块,会自动failover的。


    Redis Cluster中的数据采用预分槽思想,整个集群有 16384个hash slot,在创建集群的时候,预先把这些slot分配到不同的节点上。 集群部署的时候,建议至少6个节点,3主3从的方式部署。

    比如 M1-S1,M2-S2,M3-S3,hash slot分布假设如下

    节点M1上的hash slots 分配是 :0 to 5500
    节点M2上的hash slots 分配是 :5501 to 11000
    节点M3上的hash slots 分配是 :11001 to 16383

    集群中的任意一个key都属于这16384个槽中的其中一个,集群使用公式 CRC16(key) % 16384 来计算键key属于哪个槽。

    其实以后扩容或缩容也是移动槽,扩容时,添加加点后,把其他节点上的槽移到新节点就完成了扩容;缩容时,把该实例上的全部槽移动别的节点上,再从集群中摘除该节点就完成了缩容。


    集群中的16384个槽要全部分出去,集群转态才OK,这在业务数据访问当中也是必须的。

    但是如果仅用作cache使用,即使集群中某个节点挂掉,也是只影响一部分槽不可用,其他槽还是可用的,只需要设置  cluster-require-full-coverage no ,集群还是可以对外服务的。


    集群中的节点要开启AOF持久化,这个是必须的。


    集群中节点只使用0库,当然一些命令也是不支持的,比如 keys , 一次不允许同时操作多个key。


    集群中节点是主从异步复制,数据不保证强一致性,由于当Master挂掉,slave被选举Master时,可能有部分数据未复制到slave。


    向集群中的节点publish消息,集群中的任意一个节点都能subscribe都这个消息。

    更详细的Cluster信息,请直接参考官方文档 Redis cluster tutorial


    目前java版本的客户端 Jedis,RedisSon都已经实现了RedisCluster的相关接口。


    部署实战 

    集群的安装需要一个个节点的安装,首先请参考单节点的安装,单节点安装参考

    1)安装节点

    mkdir -p /data/apps/redis-cluster
    mkdir -p /data/apps/redis-cluster/7000
    mkdir -p /data/apps/redis-cluster/7001
    mkdir -p /data/apps/redis-cluster/7002
    mkdir -p /data/apps/redis-cluster/7003
    mkdir -p /data/apps/redis-cluster/7004
    mkdir -p /data/apps/redis-cluster/7005


    单个安装redis的目录和文件内容包括

    [root@test1 redis-3.0.7]# pwd
    /data/apps/redis-3.0.7
    [root@test1 redis-3.0.7]# tree -l
    .
    |-- bin
    |   |-- dump.rdb
    |   |-- redis-benchmark
    |   |-- redis-check-aof
    |   |-- redis-check-dump
    |   |-- redis-cli
    |   |-- redis-sentinel
    |   |-- redis-server
    |   `-- redis-trib.rb
    |-- data
    `-- redis.conf
    把以前单个安装的 /data/apps/redis-3.0.7 里面的文件全部复制到刚才创建的 6 个目录里面
    cd /data/apps/redis-3.0.7
    cp -rfp * /data/apps/redis-cluster/7000
    cp -rfp * /data/apps/redis-cluster/7001
    cp -rfp * /data/apps/redis-cluster/7002
    cp -rfp * /data/apps/redis-cluster/7003
    cp -rfp * /data/apps/redis-cluster/7004
    cp -rfp * /data/apps/redis-cluster/7005


    2)节点的配置

    vim /data/apps/redis-cluster/7000/redis.conf 里面配置如下

    port 7000
    cluster-enabled yes
    daemonize yes
    pidfile /var/run/redis_7000.pid
    cluster-config-file /data/apps/redis-cluster/7000/nodes.conf
    cluster-node-timeout 5000
    dir /data/apps/redis-cluster/7000/data
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    loglevel notice
    logfile /data/apps/redis-cluster/7000/redis.log

    其他7001,7002,7003,7004,7005的节点配置和上面配置一样,只需要把文件内容中的7000修改即可。


    3)启动各节点

    /data/apps/redis-cluster/7000/bin/redis-server /data/apps/redis-cluster/7000/redis.conf
    /data/apps/redis-cluster/7001/bin/redis-server /data/apps/redis-cluster/7001/redis.conf
    /data/apps/redis-cluster/7002/bin/redis-server /data/apps/redis-cluster/7002/redis.conf
    /data/apps/redis-cluster/7003/bin/redis-server /data/apps/redis-cluster/7003/redis.conf
    /data/apps/redis-cluster/7004/bin/redis-server /data/apps/redis-cluster/7004/redis.conf
    /data/apps/redis-cluster/7005/bin/redis-server /data/apps/redis-cluster/7005/redis.conf


    4)创建集群工具介绍

    注意:创建集群需要借助官方提供的工具,文件名是redis-trib.rb,执行此文件需要安装Ruby,ruby安装参考

    [root@test1 bin]# ./redis-trib.rb 
    Usage: redis-trib <command> <options> <arguments ...>
      create          host1:port1 ... hostN:portN                - 创建集群 ip:port ,假如6个节点,前3个节点为主节点,后3个节点则为对应从节点
                      --replicas <arg>                                  - slave节点的个数
      check           host:port                                        - 检查集群的状态,节点信息,slots是否分配正确
      info            host:port                                         - 当前集群的信息,包括Master的信息,slots信息
      fix             host:port                                          - 修复集群 
                      --timeout <arg>
      reshard         host:port                                   - 移动slots
                      --from <arg>                                - 源节点
                      --to <arg>                                  - 目标节点
                      --slots <arg>                               - 移动slots数量
                      --yes
                      --timeout <arg>
                      --pipeline <arg>
      rebalance       host:port                                    - slots再分配
                      --weight <arg>
                      --auto-weights
                      --use-empty-masters
                      --timeout <arg>
                      --simulate
                      --pipeline <arg>
                      --threshold <arg>
      add-node        new_host:new_port existing_host:existing_port - 添加节点
                      --slave
                      --master-id <arg>
      del-node        host:port node_id                                - 移除节点 
      set-timeout     host:port milliseconds
      call            host:port command arg arg .. arg              - 校验节点之间的通讯   
      import          host:port                                     - 
                      --from <arg>
                      --copy
                      --replace
      help            (show this help)
    For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

    5)创建集群

    cd /data/apps/redis-3.0.7/bin

    ./redis-trib.rb create --replicas 1 10.10.10.126:7000 10.10.10.126:7001 10.10.10.126:7002 10.10.10.126:7003 10.10.10.126:7004 10.10.10.126:7005

    出现如下信息,则Cluster创建成功

    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    10.10.10.126:7000
    10.10.10.126:7001
    10.10.10.126:7002
    Adding replica 10.10.10.126:7003 to 10.10.10.126:7000
    Adding replica 10.10.10.126:7004 to 10.10.10.126:7001
    Adding replica 10.10.10.126:7005 to 10.10.10.126:7002
    M: fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000
       slots:0-5460 (5461 slots) master
    M: d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001
       slots:5461-10922 (5462 slots) master
    M: 547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002
       slots:10923-16383 (5461 slots) master
    S: 6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003
       replicates fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3
    S: ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004
       replicates d035c1ef0f1095787705c2a2904f061e9de003db
    S: ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005
       replicates 547b3d30f4a559377c13d82be11db98c3f4e4da9
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join....
    >>> Performing Cluster Check (using node 10.10.10.126:7000)
    M: fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000
       slots:0-5460 (5461 slots) master
    M: d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001
       slots:5461-10922 (5462 slots) master
    M: 547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002
       slots:10923-16383 (5461 slots) master
    M: 6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003
       slots: (0 slots) master
       replicates fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3
    M: ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004
       slots: (0 slots) master
       replicates d035c1ef0f1095787705c2a2904f061e9de003db
    M: ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005
       slots: (0 slots) master
       replicates 547b3d30f4a559377c13d82be11db98c3f4e4da9
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

    以上信息说明了,创建了3主3从,每个redis实例都对应一个runid, 7000()->7003(), 7001()->7004(),7002()->7005()

    10.10.10.126:7000 分配:slots:0-5460 (5461 slots)

    10.10.10.126:7001 分配:slots:5461-10922 (5462 slots)

    10.10.10.126:7002 分配:slots:10923-16383 (5461 slots)


    集群创建后,会在各自的目录下面创建了 nodes.conf,里面存储了当前集群的信息。


    6)集群命令

    可以连接任意一个节点上

    [root@test1 bin]# ./redis-cli -c -p 7000
    127.0.0.1:7000> 
    127.0.0.1:7000> 
    127.0.0.1:7000> cluster nodes
    6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003 slave fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 0 1461118257812 4 connected
    d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001 master - 0 1461118256812 2 connected 5461-10922
    fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000 myself,master - 0 0 1 connected 0-5460
    ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004 slave d035c1ef0f1095787705c2a2904f061e9de003db 0 1461118257912 5 connected
    ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005 slave 547b3d30f4a559377c13d82be11db98c3f4e4da9 0 1461118257412 6 connected
    547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002 master - 0 1461118256412 3 connected 10923-16383
    127.0.0.1:7000> 
    127.0.0.1:7000> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_sent:6152
    cluster_stats_messages_received:6152
    127.0.0.1:7000> 

    集群环境下支持命令
    集群  
    CLUSTER INFO 打印集群的信息  
    CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
    节点  
    CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。  
    CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。  
    CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。  
    CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  
    槽(slot)  
    CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。  
    CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。  
    CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。  
    CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。  
    CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。  
    CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。  
    CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  
    键  
    CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。  
    CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。  
    CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

    其实官方提供的集群管理工具 redis-trib.rb 就是实现了上面的命令,我们也可以基于此开发定制自己的集群管理工具。


    7)添加节点

    在10.10.10.118机器上部署了2个节点 8000和8003 ,方式和先前部署集群节点时的一样。

    [root@test1 bin]# ./redis-trib.rb add-nodes 10.10.10.118:8000 10.10.10.126:7000
    Unknown redis-trib subcommand 'add-nodes'
    [root@test1 bin]# ./redis-trib.rb add-node 10.10.10.118:8000 10.10.10.126:7000 
    >>> Adding node 10.10.10.118:8000 to cluster 10.10.10.126:7000
    >>> Performing Cluster Check (using node 10.10.10.126:7000)
    M: fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: 6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003
       slots: (0 slots) slave
       replicates fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3
    M: d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004
       slots: (0 slots) slave
       replicates d035c1ef0f1095787705c2a2904f061e9de003db
    S: ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005
       slots: (0 slots) slave
       replicates 547b3d30f4a559377c13d82be11db98c3f4e4da9
    M: 547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002
       slots:10923-16383 (5461 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.
    >>> Send CLUSTER MEET to node 10.10.10.118:8000 to make it join the cluster.
    [OK] New node added correctly.
    以上看到 10.10.10.118:8000 已经加入集群,做为master


    [root@test1 bin]# ./redis-trib.rb add-node --slave --master-id 23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 10.10.10.118:8003 10.10.10.126:7000
    >>> Adding node 10.10.10.118:8003 to cluster 10.10.10.126:7000
    >>> Performing Cluster Check (using node 10.10.10.126:7000)
    M: fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    S: 6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003
       slots: (0 slots) slave
       replicates fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3
    M: d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004
       slots: (0 slots) slave
       replicates d035c1ef0f1095787705c2a2904f061e9de003db
    S: ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005
       slots: (0 slots) slave
       replicates 547b3d30f4a559377c13d82be11db98c3f4e4da9
    M: 23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 10.10.10.118:8000
       slots: (0 slots) master
       0 additional replica(s)
    M: 547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002
       slots:10923-16383 (5461 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.
    >>> Send CLUSTER MEET to node 10.10.10.118:8003 to make it join the cluster.
    Waiting for the cluster to join.
    >>> Configure node as replica of 10.10.10.118:8000.
    [OK] New node added correctly.
    以上把从节点加入到集群。


    127.0.0.1:7000> cluster nodes
    6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003 slave fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 0 1461119822197 4 connected
    d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001 master - 0 1461119821897 2 connected 5461-10922
    fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000 myself,master - 0 0 1 connected 0-5460
    ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004 slave d035c1ef0f1095787705c2a2904f061e9de003db 0 1461119822697 5 connected
    700df6e5afc62b10e3aa0ef36aa5ed77d46e54cd 10.10.10.118:8003 slave 23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 0 1461119823198 0 connected
    ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005 slave 547b3d30f4a559377c13d82be11db98c3f4e4da9 0 1461119823797 6 connected
    23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 10.10.10.118:8000 master - 0 1461119823598 0 connected
    547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002 master - 0 1461119821697 3 connected 10923-16383
    可以看到新加入的节点已经在集群里面了,只是还没有分配slots


    8)分配slot给新节点

    ./redis-trib.rb reshard 10.10.10.126:7000   回车

    How many slots do you want to move (from 1 to 16384)? 1000    - 移动多少slots
    What is the receiving node ID? 23ecb8e0988d9e31ff976c14fa84e1c3e2896a58  - 目标master的runid
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
    Source node #1:fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3    -源master的runid,就是从这个master分配出去slots
    Source node #2:d035c1ef0f1095787705c2a2904f061e9de003db
    Source node #3:done  - 结束标志


    127.0.0.1:7000> cluster nodes
    6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003 slave fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 0 1461120705572 4 connected
    d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001 master - 0 1461120705072 2 connected 5962-10922
    fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000 myself,master - 0 0 1 connected 499-5460
    ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004 slave d035c1ef0f1095787705c2a2904f061e9de003db 0 1461120704072 5 connected
    700df6e5afc62b10e3aa0ef36aa5ed77d46e54cd 10.10.10.118:8003 slave 23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 0 1461120704373 7 connected
    ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005 slave 547b3d30f4a559377c13d82be11db98c3f4e4da9 0 1461120706072 6 connected
    23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 10.10.10.118:8000 master - 0 1461120705773 7 connected 0-498 5461-5961
    547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002 master - 0 1461120704272 3 connected 10923-16383

    可以看到 10.10.10.118:8000 这个实例上分配了1000个slots


    9)移除节点

    移除节点前需要把节点上的slots全部分配出去才可以移除

    假如我们现在准备把 10.10.10.118:8000 上的1000个slots,分配给 10.10.10.126:7000上,直接执行命令这样

    ./redis-trib.rb reshard --from 23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 --to fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 --slots 1000 --yes 10.10.10.126:7000

    然后通过 cluster nodes 可以看到 10.10.10.118:8000 已经无slots,先移除 slave,再移除master

     ./redis-trib.rb del-node 10.10.10.118:8003  700df6e5afc62b10e3aa0ef36aa5ed77d46e54cd

    ./redis-trib.rb del-node 10.10.10.118:8000  23ecb8e0988d9e31ff976c14fa84e1c3e2896a58 

    再执行 cluster nodes  可以看到节点已经摘除了

    127.0.0.1:7000> cluster nodes
    6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003 slave fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 0 1461121843177 8 connected
    d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001 master - 0 1461121844177 2 connected 5962-10922
    fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000 myself,master - 0 0 8 connected 0-5961
    ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004 slave d035c1ef0f1095787705c2a2904f061e9de003db 0 1461121841777 5 connected
    ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005 slave 547b3d30f4a559377c13d82be11db98c3f4e4da9 0 1461121842777 6 connected
    547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002 master - 0 1461121843777 3 connected 10923-16383


    10)故障测试

    我们部署6个节点,3主3从,对外服务时,是3个主对外服务,3个从异步复制主的数据,当主挂掉时,集群自动提升相应的从为主,以此来保证集群的高可用。

    现在我们停掉一个主,假如我们停掉 10.10.10.126:7000

    127.0.0.1:7001> cluster nodes
    ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005 slave 547b3d30f4a559377c13d82be11db98c3f4e4da9 0 1461129361182 6 connected
    6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003 master - 0 1461129361682 9 connected 0-5961
    547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002 master - 0 1461129360682 3 connected 10923-16383
    d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001 myself,master - 0 0 2 connected 5962-10922
    fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000 master,fail - 1461129349154 1461129347654 8 disconnected
    ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004 slave d035c1ef0f1095787705c2a2904f061e9de003db 0 1461129360180 5 connected
    可以看到 红色标粗的部分,是以前 7000端口的从已经变成主节点了


    假如我们把 7000 重新启动起来,会发现7000 会自动变成 7003 的从了。

    127.0.0.1:7001> cluster nodes
    ad1d649585bc4891faf3a156032e6421a99366d7 10.10.10.126:7005 slave 547b3d30f4a559377c13d82be11db98c3f4e4da9 0 1461129551523 6 connected
    6b747852963751aba26ca4d6cc04370f9a67adc6 10.10.10.126:7003 master - 0 1461129550923 9 connected 0-5961
    547b3d30f4a559377c13d82be11db98c3f4e4da9 10.10.10.126:7002 master - 0 1461129551923 3 connected 10923-16383
    d035c1ef0f1095787705c2a2904f061e9de003db 10.10.10.126:7001 myself,master - 0 0 2 connected 5962-10922
    fb7fd07071a8e9cd47d1c7a7a0fcf564ea3bfbe3 10.10.10.126:7000 slave 6b747852963751aba26ca4d6cc04370f9a67adc6 0 1461129550726 9 connected
    ee99cc8ce0fddfd93953c09686abbad67e316486 10.10.10.126:7004 slave d035c1ef0f1095787705c2a2904f061e9de003db 0 1461129552023 5 connected

    评论

    发表评论

    validate