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