linux redis 集群状态,Redis集群模式下的redis-py-cluster方式读写测试

与MySQL主从复制,从节点可以分担部分读压力不一样,甚至可以增加slave或者slave的slave来分担读压力,Redis集群中的从节点,默认是不分担读请求的,从节点只作为主节点的备份,仅负责故障转移。

如果是主节点读写压力过大,可以通过增加集群节点数量的方式来分担压力。

以下简单测试Redis集群读写时候的节点相应情况,节点集群关系如下,三个主节点组成集群,分别对应三个从节点

02ba803b784f0f27a4584465bdf1ca5a.png

ce0eef3f192192c58510000c68a48252.png

9210c7e84f85745e3e88f3cd10facf9d.png

524f3b2ab6c5bdf12d4ec33c87d10763.png

往集群中写入10W条“字符串类型”的测试数据

#!/usr/bin/env Python3

importtimefrom time importctime,sleepfrom rediscluster importStrictRedisCluster

startup_nodes=[

{"host":"127.0.0.1", "port":9000},

{"host":"127.0.0.1", "port":9001},

{"host":"127.0.0.1", "port":9002},

{"host":"127.0.0.1", "port":9003},

{"host":"127.0.0.1", "port":9004},

{"host":"127.0.0.1", "port":9005}

]

redis_conn= StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)for i in range(0, 100000):try:

redis_conn.set('name'+str(i),str(i)except:print("connect to redis cluster error")#time.sleep(2)

10W个key值基本上均匀地落在三个节点上

c258f39a8359041160c4c79f08fd57e1.png

连续读数据测试,同时观察某一个主从节点的负载

#!/usr/bin/env python3

importtimefrom time importctime,sleepfrom rediscluster importStrictRedisCluster

startup_nodes=[

{"host":"127.0.0.1", "port":9000},

{"host":"127.0.0.1", "port":9001},

{"host":"127.0.0.1", "port":9002},

{"host":"127.0.0.1", "port":9003},

{"host":"127.0.0.1", "port":9004},

{"host":"127.0.0.1", "port":9005}

]

redis_conn= StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)for i in range(0, 100000):try:

redis_conn.get('name'+str(i))except:print("connect to redis cluster error")

time.sleep(2)

这里以9000和9003集群中的一对主从节点为例,当查询发起时,同时观察这两个节点的负载,

可以发现主节点9000负责处理定位到当前节点的请求,与此同时,而对应的从节点9003则没有处理请求信息。

e5a04dd0930c101f829e02f6854cc22a.png

a75d666979ec24629d351286f45a35cc.png

Redis集群中,默认情况下,查询是根据key值的slot信息找到其对应的主节点,然后进行查询,而不会在从节点上发起查询

20f8d40f2f1a573244fd8d5c2353eb2c.png

使用readonly命令打开客户端连接只读状态,则从节点可以接受读请求(当然在slave节点上读,因为复制延迟造成的问题另说)

5c1d4ddebf1990dc9a4a99a6a4b0dbd8.png

根据https://redis-py-cluster.readthedocs.io/en/master/readonly-mode.html中的说明,

You can overcome this limitation [for scaling read with READONLY mode](http://redis.io/topics/cluster-spec#scaling-reads-using-slave-nodes).

redis-py-cluster also implements this mode. You can access slave by passing readonly_mode=True to StrictRedisCluster (or RedisCluster) constructor.

通过以readonly_mode=True的方式连接至集群,重复一下测试,发现从节点依然没有处理读请求

#!/usr/bin/env python3

importtimefrom time importctime,sleepfrom rediscluster importStrictRedisCluster

startup_nodes=[

{"host":"127.0.0.1", "port":9000},

{"host":"127.0.0.1", "port":9001},

{"host":"127.0.0.1", "port":9002},

{"host":"127.0.0.1", "port":9003},

{"host":"127.0.0.1", "port":9004},

{"host":"127.0.0.1", "port":9005}

]

redis_conn= StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True, readonly_mode=True)for i in range(0, 100000):try:print(redis_conn.get('name'+str(i)))except:print("connect to redis cluster error")

time.sleep(2000)

Redis版本为 5.0.4

89c21ef9140f241df984b41b5d8014d6.png

不知道为什么slave节点没有请求读处理,观察Redis请求处理的stat状态,依旧重定向到了master节点,不知道是否与单机多实例有关

如果每个实例独立部署在一台机器上,readonly_mode=True的访问模式,slave节点就可以处理读请求?

ps:测试环境是在腾讯云服务器EC2上安装的Redis,如果要在本地访问,需要bind的IP为内网的IP,然后本地用公网IP访问,而不是直接bind公网IP,为此折腾了一阵子。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值