一.概述

Redis集群创建后,可能会出现互为主从关系的节点从属于同一台服务器的情况。在此种情况下,若
服务器故障宕机或需要停机维护,互为主从关系的节点同时停止运行,导致redis集群暂时失去一部
分slot插槽。此时,redis集群为fail状态,对其进行的数据读写操作均无法正常进行。为避免此种情
况的发生,应对redis集群节点的主从关系进行调整,使互为主从关系的节点分属于不同的服务器。

二.调整方法描述

1.使用redis-trib.rb脚本将待调整的从节点从redis集群中删除。(执行此步操作时,从节点会从redis集群中去除。同时,此从节点进程会被杀掉。)命令如下:
redis-trib.rb del-node 集群中某节点IP:PORT 待调整的从节点ID
2.删除待调整从节点rdb子目录下的所有文件。(包括“dump.rdb”和“nodes-节点端口号.conf”文件。)
3.重新启动待调整的从节点。
4.使用redis-trib.rb脚本将待调整的从节点加入到redis集群中,使其与合适的主节点对应,建立起新的主从关系。命令如下:
redis-trib.rb add-node --slave --master-id 主节点ID 待调整的从节点IP:PORT 集群中某节点IP:PORT

三.具体操作方法举例

1.redis集群节点主从关系信息

                                                 图一 redis集群节点主从关系

Redis集群节点主从关系调整
主节点信息 从节点信息

主节点ID 主节点地址 从节点ID 从节点地址
487247ac4e34c0102d54eaca3256dce9b24667f4 132.46.115.146:6580 23b674847132d82c355b3f440aa3f1f940316b69 132.46.115.148:6581
3e745792f2a1f179501aea3264186aa55103a434 132.46.115.148:6580 06b296c1d87fbf69638076d53054d89bd15ef2ad 132.46.115.146:6581
2d93e76a04d20ca0a91e22694201f3b4b18c740b 132.46.115.149:6580 f8a342695baac0bce608ed468f2414c2e68abc49 132.46.115.149:6581

表一 redis集群节点主从关系

从图一、表一可见,其中一对主从节点(132.46.115.149:6580和132.46.115.149:6581)从属于同一台服务器。
需要从redis集群中去除两个从节点(包括132.46.115.149:6581),而后建立新的主从关系。具体操作方法如下。
(1)从redis集群中删掉两个从节点(132.46.115.146:6581和132.46.115.149:6581)
在任意一台服务器上执行下面2条命令:
redis-trib.rb del-node 132.46.115.146:6580 06b296c1d87fbf69638076d53054d89bd15ef2ad
redis-trib.rb del-node 132.46.115.146:6580 f8a342695baac0bce608ed468f2414c2e68abc49
(2)删除两个从节点rdb子目录下的所有文件
分别在132.46.115.146和132.46.115.149服务器上执行如下命令:
rm ${REDIS_CLUSTER_HOME}/redis6581/rdb/*
(3)重新启动删掉的两个从节点
分别在132.46.115.146和132.46.115.149服务器上执行如下命令:
${REDIS_CLUSTER_HOME}/redis6581/bin/redis-server ${REDIS_CLUSTER_HOME}/redis6581/conf/redis.conf
(4)将删掉的两个从节点加入redis集群并建立新的主从关系
在任意一台服务器上执行下面2条命令:
redis-trib.rb add-node --slave --master-id 2d93e76a04d20ca0a91e22694201f3b4b18c740b 132.46.115.146:6581 132.46.115.146:6580
redis-trib.rb add-node --slave --master-id 3e745792f2a1f179501aea3264186aa55103a434 132.46.115.149:6581 132.46.115.146:6580

调整之后的redis集群节点关系见表二

主节点ID 主节点地址 从节点 从节点地址
487247ac4e34c0102d54eaca3256dce9b24667f4 132.46.115.146:65 23b674847132d82c355b3f440aa3f1f940316b69 132.46.115.148:6581
3e745792f2a1f179501aea3264186aa55103a434 132.46.115.148:6580 f8a342695baac0bce608ed468f2414c2e68abc49 132.46.115.149:6581
2d93e76a04d20ca0a91e22694201f3b4b18c740b 132.46.115.149:6580 06b296c1d87fbf69638076d53054d89bd15ef2ad 132.46.115.146:6581

表二 redis集群节点新主从关系

四.自动检测redis集群节点主从关系的脚本

Redis集群节点主从关系调整

图二 自动检测redis集群节点主从关系的脚本Redis集群节点主从关系调整

图二为自动检测redis集群节点主从关系的脚本。执行此脚本时需要传入2个参数。参数一为redis集群任一节点IP,参数二为redis集群任意节点port。若存在主从节点从属于同一台服务器的情况,信息将以红色底色显示。否则,信息以绿色底色显示。脚本执行方法及输出结果如图三所示。

Redis集群节点主从关系调整
图三 自动检测redis集群节点主从关系脚本执行情况