阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

154次阅读
没有评论

共计 2641 个字符,预计需要花费 7 分钟才能阅读完成。

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

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

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

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

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

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

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

<div “>

#!/usr/bin/env Python3
import time
from time import ctime,sleep
from rediscluster import StrictRedisCluster

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 值基本上均匀地落在三个节点上

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

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

<div “>

#!/usr/bin/env python3
import time
from time import ctime,sleep
from rediscluster import StrictRedisCluster

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 则没有处理请求信息。Redis 集群模式下的 redis-py-cluster 方式读写测试

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

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

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

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

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

根据 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 的方式连接至集群,重复一下测试,发现从节点依然没有处理读请求

<div “>

#!/usr/bin/env python3
import time
from time import ctime,sleep
from rediscluster import StrictRedisCluster

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

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

不知道为什么 slave 节点没有请求读处理,观察 Redis 请求处理的 stat 状态,依旧重定向到了 master 节点,不知道是否与单机多实例有关
如果每个实例独立部署在一台机器上,readonly_mode=True 的访问模式,slave 节点就可以处理读请求?

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2641字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中