原始人手动分配 redis slot
因为开发需要,在本地虚拟机搭建了9个节点的redis集群,使用的版本是redis 3.2。最近由于几次强制关闭虚拟机,导致虚拟机里的redis 集群出现问题,查看节点日志,提示Unrecoverable error: corrupted cluster config file.
, 搜索网上资料,原来是强制关机把redis 集群节点的配置文件给搞坏了。
下面尝试了两个方法:
方法1是通过ps命令查看没有启动的redis节点,然后对应修改配置文件或者直接删除掉/var/lib/redis/nodes-7003.conf
,然后重启/usr/bin/redis-server /data1/redis_cluster/7003/redis.conf
,
通过命令
redis-cli -p 7000 -c
> CLUSTER MEET 127.0.0.1 7003
将刚才的节点加入集群。
遗憾的是,通过这种方法将配置损坏的redis实例加入集群后,整个集群还是有问题,集群slot的分配出现了问题,需要人肉分配下slot,一共有16384个slot要分配。
为了不一一找出哪些slot没有分配,而且是本地开发,redis内的缓存可以清空,所以打算重建集群并手动分配slot。
重建集群
- 通过flushdb清空数据,
- 删除掉/var/lib/redis/下的配置文件,比如nodes-7003.conf
- 重启redis实例
/usr/bin/redis-server /data1/redis_cluster/7003/redis.conf
- 通过
CLUSTER MEET
一台台将redis实例加入集群 - 通过
CLUSTER NODES
和CLUSTER INFO
查看集群加入的节点和已分配好的slot。
分配slot
我们通过redis自动的CLUSTER ADDSlOTS 来分配集群,使用这个命令需要一个个指定要添加的slot编码,从0到16383,不支持输入范围,比如0-1000。
9个节点大概每个可以分配1820个槽左右,通过一段python脚本来生成命令
def assign_slot():
count = 0
arr = []
with open("slot.log", "w") as f:
for i in range(16384):
count += 1
if count <= 1850:
arr.append(str(i))
else:
print 'CLUSTER ADDSLOTS ' + ' '.join(arr)
f.write('CLUSTER ADDSLOTS ' + ' '.join(arr) + '\n\r')
arr = []
arr.append(str(i))
count = 1
if len(arr) > 0:
print 'CLUSTER ADDSLOTS ' + ' '.join(arr)
f.writelines('CLUSTER ADDSLOTS ' + ' '.join(arr) + '\n\r')
打开生成的slot.log文件,一共生成了9行,每一行用来为一个redis实例分配slot,比如为7000端口的实例分配redis-cli -p 7000 -c 粘贴的命令
,依次将剩下的命令在其他实例上执行。
通过命令查看分配结果:
127.0.0.1:7000> cluster nodes
cd9d317852eb0d6012100dece46a6daafcd10ca9 127.0.0.1:7007 master - 0 1651224343287 7 connected 12950-14799
a49c882dce6a155dcf2c4e90c19bbaae9e3225b2 127.0.0.1:7004 master - 0 1651224345311 4 connected 7400-9249
2979ab195125cd752ecec106df3419fe669f0ecf 127.0.0.1:7003 master - 0 1651224340624 3 connected 5550-7399
e4c92e7a1b142376d25ab2456fecd3e5a233c9db 127.0.0.1:7002 master - 0 1651224341247 0 connected 3700-5549
b61f06656b2d35f435f150353a6197040b6affb1 127.0.0.1:7001 master - 0 1651224344302 1 connected 1850-3699
22740d47d4bcdd22dd78e6ebb6b30d4087042a0c 127.0.0.1:7006 master - 0 1651224342268 6 connected 11100-12949
156f9b71b8928171226dbc41fadeaf2a3ca7568b 127.0.0.1:7005 master - 0 1651224339194 5 connected 9250-11099
1dfa42ec5acbac28abe22f85a75d3309906b2ffe 127.0.0.1:7008 master - 0 1651224338884 8 connected 14800-16383
d814bc38e3afe56fb11b081a5c5a9731877bcaf1 127.0.0.1:7000 myself,master - 0 0 2 connected 0-1849 [12984-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [13360-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [13396-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [13414-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [13499-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [13505-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [13535-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [14046-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [14205-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [14351-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [14395-<-cd9d317852eb0d6012100dece46a6daafcd10ca9] [14566-<-cd9d317852eb0d6012100dece46a6daafcd10ca9]
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:9
cluster_size:9
cluster_current_epoch:8
cluster_my_epoch:2
cluster_stats_messages_sent:6827
cluster_stats_messages_received:6800