python操作redis master slave_解决python操作redis cluster集群时遇到的问题

今天在测试redis-py-cluster的时候,遇到一个奇怪的问题…   一开始以为是python的redis cluster遇到的bug … …   在作者的issue里也看到了别人也同样遇到我这样的问题… …    提示的错误是这样的…

root@ubuntu:~# python test.py

[{'host': '127.0.0.1', 'port': '7000'}]

Traceback (most recent call last):

File "test.py", line 24, in

main()

File "test.py", line 21, in main

r.set('nima', 'a')

File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 1055, in set

return self.execute_command('SET', *pieces)

File "build/bdist.linux-x86_64/egg/rediscluster/utils.py", line 82, in inner

File "build/bdist.linux-x86_64/egg/rediscluster/client.py", line 308, in execute_command

rediscluster.exceptions.RedisClusterException: Too many Cluster redirections

这个是我测试的代码, 代码的逻辑本身是没有问题的,但是奇怪的是会遇到 rediscluster.exceptions.RedisClusterException: Too many Cluster redirections 的问题…

# -*- coding: utf-8 -*

import os,sys,time,traceback

import redis

from rediscluster import StrictRedisCluster

def main():

serverip='127.0.0.1'

#startup_nodes=[{"host": serverip,"port": str(i)} for i in xrange(7000, 7007)]

startup_nodes=[{"host": serverip,"port": i} for i in xrange(7000, 7007)]

print startup_nodes

try:

r = StrictRedisCluster(startup_nodes=startup_nodes)

except Exception, err:

print err

print 'failed to connect cluster'

sys.exit(0)

#for i in xrange(1000):

r.set('nima', 'a')

if __name__=='__main__':

main()

既然代码没有问题,那应该是redis cluster出现了问题…

root@ubuntu:~# redis-cli -c -p 7000

127.0.0.1:7000> set nima nia

-> Redirected to slot [16259] located at :0

Could not connect to Redis at :0: Name or service not known

Could not connect to Redis at :0: Name or service not known

not connected>

使用/redis-3.0.1/src/redis-trib.rb check 127.0.0.1:7000 的时候,发现以前是4个master,结果现在成三个master了,还有就是多个slave节点被剔除  这时候把这些down的reids都启动就OK了…

root@ubuntu:~# ./redis-3.0.1/src/redis-trib.rb check 127.0.0.1:7000|more

Connecting to node 127.0.0.1:7000: OK

Connecting to node 127.0.0.1:7007: OK

Connecting to node 127.0.0.1:7004: OK

Connecting to node 127.0.0.1:7003: OK

Connecting to node 127.0.0.1:7002: OK

Connecting to node 127.0.0.1:7006: OK

Connecting to node 127.0.0.1:7001: OK

Connecting to node 127.0.0.1:7005: OK

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

M: b4f0e1fde9abbcef6cfaea86232afb07cc19eb77 127.0.0.1:7000

slots:0-4095 (4096 slots) master

1 additional replica(s)

S: d75e766de5f82734ffb3ff8ef944d353b78db740 127.0.0.1:7007

slots: (0 slots) slave

replicates 82b7b92878dc1af4a6f9a0e7f20535f86771a61f

S: 95272ed07fa70058c8167a93936f6e7093152a90 127.0.0.1:7004

slots: (0 slots) slave

replicates b4f0e1fde9abbcef6cfaea86232afb07cc19eb77

M: 82b7b92878dc1af4a6f9a0e7f20535f86771a61f 127.0.0.1:7003

slots:12288-16383 (4096 slots) master

1 additional replica(s)

M: ee2e48c90a4ac6fa9128c4f06600234eb9a05d4b 127.0.0.1:7002

slots:8192-12287 (4096 slots) master

1 additional replica(s)

S: e83464a6948147193be25cf8bb8aea66ce3616a6 127.0.0.1:7006

slots: (0 slots) slave

replicates ee2e48c90a4ac6fa9128c4f06600234eb9a05d4b

M: 5bd0681b67d775ec0a67b84481c5bbe802216f49 127.0.0.1:7001

slots:4096-8191 (4096 slots) master

1 additional replica(s)

S: 39ef91564db8a85ca4caa03f65b03ed24cc79cd7 127.0.0.1:7005

slots: (0 slots) slave

replicates 5bd0681b67d775ec0a67b84481c5bbe802216f49

[OK] All nodes agree about slots configuration.

... Check for open slots...

... Check slots coverage...

[OK] All 16384 slots covered.

因为redis的日志配置有问题,所有刚才的问题的原因找不到了…   这样咱们特意的干掉一组redis主从…  貌似根前面的问题不太一样..  先前是 Too many Cluster redirections ,但是cluster info的状态是OK的…. 这次是 cluster info > cluster_state:fail

>>> Check for open slots…

>>> Check slots coverage…

[ERR] Not all 16384 slots are covered by nodes.

oot@ubuntu:~# redis-cli -c -p 7000

127.0.0.1:7000> set a a

(error) CLUSTERDOWN The cluster is down

我们可以用redis-trib.rb fix 来修复集群…. ….   /redis-3.0.1/src/redis-trib.rb fix 127.0.0.1:7000  ,如果还是启动不了的话,可以把相关的cluster-config-file节点同步信息删掉。

另外这里转载下redis cluster的命令集,操作redis集群是个很蛋疼的事情,大家可以用下面的命令多尝试下..

集群

CLUSTER INFO 打印集群的信息 ,可以知道集群是否好坏

CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

节点

CLUSTER MEET 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。

CLUSTER FORGET 从集群中移除 node_id 指定的节点。

CLUSTER REPLICATE 将当前节点设置为 node_id 指定的节点的从节点。

CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。

槽(slot)

CLUSTER ADDSLOTS [slot …] 将一个或多个槽(slot)指派(assign)给当前节点。

CLUSTER DELSLOTS [slot …] 移除一个或多个槽对当前节点的指派。

CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。

CLUSTER SETSLOT NODE 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。

CLUSTER SETSLOT MIGRATING 将本节点的槽 slot 迁移到 node_id 指定的节点中。

CLUSTER SETSLOT IMPORTING 从 node_id 指定的节点中导入槽 slot 到本节点。

CLUSTER SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。

CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上。

CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量。

CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。

看来redis cluster一定要多尝试…. 别到了线上后,就傻逼了…

大家觉得文章对你有些作用!

如果想赏钱,可以用微信扫描下面的二维码,感谢!

另外再次标注博客原地址  xiaorui.cc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值