Linux系统redis集群管理

本章节主要由四部分构成

  • 集群中数据访问:请求重定向(moved)、call命令、Smart客户端
  • 集群扩容:节点配置和启动节点、加入集群、迁移槽和数据
  • 集群缩容:迁移槽和数据、下线节点
  • 迁移相关:平衡(rebalance)slot

集群中的数据访问-重定向(MOVED)

1、首先进入一个客户端(任何一个都可以),添加一条数据key为a,value也为a,提示添加失败。
../redis-6.2.1/src/redis-cli -a 123456 -p 7001

提示无法添加请到7003节点中添加,出现MOVED这就是请求的重定向。问题来了我怎么知道他的key属于哪个槽位呢?因为redis集群本身是使用CRC16算法对key进行计算并对16383取模(CRC16(key)%16383),得到的结果就是key对应的槽位,可输入以下命令算出该key是属于哪个槽位。

cluster keyslot a


但是我们不可能进行一次槽位计算在算出具体该key属于哪个节点,redis集群内部帮咱们做了这件事,请往下看。

3、以集群的形式连接客户端,-c代表以集群的方式连接。
../redis-6.2.1/src/redis-cli -a 123456 -p 7001 -c

从上图中就能看出redisCli进行了两个步骤,第一个步骤是进行了cluster keyslot a槽位计算,第二步骤会查照出该槽位对应的节点进行对应的插入,本质上是redisCli连接了两个redis节点,进行了对应的节点切换,所以说这也是消耗了网络开销。

Smart客户端,例如jedis客户端

为了减少redisCli进行多次操作消耗网络开销,jedis中有一个拓展jedisCluster集群管理客户端,初始化的时候会将节点信息对应的槽位进行一个维护。

集群扩容,添加一个7007的主和7008的从

1、首先在redis_cluster文件夹下在创建node7007和node7008目录。

mkdir node700{7,8}

2、将node7001目录下的redisConf复制到node7007和node7008目录下,并修改对应的redisConf,将7001替换成7007和7008。

cp node7001/redis.conf node7007/

cp node7001/redis.conf node7008/

vi node7007/redis.conf

%s/7001/7007/g

vi node7008/redis.conf

%s/7001/7008/g

3、启动node7007和node7008节点

../redis-6.2.1/src/redis-server node7007/redis.conf

../redis-6.2.1/src/redis-server node7008/redis.conf

4、查看下目前的集群信息,cluster_known_nodes:6,7007和7008虽然启动但是没有加入到集群中。

../redis-6.2.1/src/redis-cli -c -a 123456 -p 7001 cluster info

5、先将node7007作为主节点需要添加到集群中,node7008作为node7007的从节点只需要设置主从关系即可(本次步骤先不设置主从关系)。

../redis-6.2.1/src/redis-cli -a 123456 --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

6、查看集群节点信息发现node7007作为主节点并没有分配槽节点,首先在分配槽位之前先将并将node7008绑定为node7007的从节点,设置完成主从后在给node7007分配槽位。

  • 查看集群节点信息

../redis-6.2.1/src/redis-cli -c -a 123456 -p 7001 cluster nodes

  • 设置node7008为node7007的从

../redis-6.2.1/src/redis-cli -a 123456 --cluster add-node 172.25.41.229:7008 172.25.41.229:7001 --cluster-slave --cluster-master-id 6d042eb2f0264edd5db082bc0bc0e2739285d6cb

  • 分配槽位,经查看集群节点信息发现node7001占用5462个,node7002和node7003个占用5461个槽位,所以node7001移出1366个,node7002和7003各减1365个,最后平均每个主节点槽位占用4096个,迁移过程中会提示是否执行计划,填写yes即可。

从node7001节点迁移出1366个槽给node7007
../redis-6.2.1/src/redis-cli -a 123456 --cluster reshard --cluster-from 78dcab14f537b483cbe9f31b9906b4c007ae2558 --cluster-to 6d042eb2f0264edd5db082bc0bc0e2739285d6cb --cluster-slots 1366 172.25.41.229:7001

从node7002节点迁移出1365个槽给node7007
../redis-6.2.1/src/redis-cli -a 123456 --cluster reshard --cluster-from 86cd32d1da14d12afb820935ca593a3380140f8d --cluster-to 6d042eb2f0264edd5db082bc0bc0e2739285d6cb --cluster-slots 1365 172.25.41.229:7001

从node7003节点迁移出1365个槽给node7007
../redis-6.2.1/src/redis-cli -a 123456 --cluster reshard --cluster-from 9d28b7ff19015e22085976a75c55bf5785774073 --cluster-to 6d042eb2f0264edd5db082bc0bc0e2739285d6cb --cluster-slots 1365 172.25.41.229:7001

7、查看当前集群信息,cluster_state:ok表示集群状态正常,cluster_known_nodes:8集群节点总共8个;查看集群节点信息node7007已经存在槽位并且node7008也作为node7007的从加入到集群节点中。

../redis-6.2.1/src/redis-cli -a 123456 -p 7001 cluster info

../redis-6.2.1/src/redis-cli -a 123456 -p 7001 cluster nodes

8、以集群的形式连接node7007或者7008客户端新增、查看数据没有报错代表集群扩容完成。

../redis-6.2.1/src/redis-cli -a 123456 -p 7007 -c

集群缩容

1、迁移槽和数据,将node7007节点槽和数据全部迁移到node7001、node7002、node7003三个主节点上。

从node7007节点迁移出1366个槽给node7001
../redis-6.2.1/src/redis-cli -a 123456 --cluster reshard --cluster-from 6d042eb2f0264edd5db082bc0bc0e2739285d6cb --cluster-to 78dcab14f537b483cbe9f31b9906b4c007ae2558 --cluster-slots 1366 172.25.41.229:7001

从node7007节点迁移出1365个槽给node7002
../redis-6.2.1/src/redis-cli -a 123456 --cluster reshard --cluster-from 6d042eb2f0264edd5db082bc0bc0e2739285d6cb --cluster-to 86cd32d1da14d12afb820935ca593a3380140f8d --cluster-slots 1365 172.25.41.229:7001

从node7007节点迁移出1365个槽给node7003
../redis-6.2.1/src/redis-cli -a 123456 --cluster reshard --cluster-from 6d042eb2f0264edd5db082bc0bc0e2739285d6cb --cluster-to 9d28b7ff19015e22085976a75c55bf5785774073 --cluster-slots 1365 172.25.41.229:7001

2、节点下线,目前是四主四从,下线node7007和node7008后是三主三从,遵从先下从(node7008)再下主(node7007)

  • 先查看集群节点信息,目前是四主四从

../redis-6.2.1/src/redis-cli -c -a 123456 -p 7001 cluster nodes

  • 先下线从node7008

../redis-6.2.1/src/redis-cli -a 123456 --cluster del-node 172.25.41.229:7001 dfb9db8f4d9a132f670ec63a063355f3462abafe

  • 再下线主node7007

../redis-6.2.1/src/redis-cli -a 123456 --cluster del-node 172.25.41.229:7001 6d042eb2f0264edd5db082bc0bc0e2739285d6cb

  • 下线完成后再查看集群节点信息,发现只剩下三主三从了,集群缩容成功

../redis-6.2.1/src/redis-cli -c -a 123456 -p 7001 cluster nodes

平衡(rebalance)slot

1、假设业务中存在大量数据都存到了node7003节点上,导致集群数据分布不平衡,这时候可以将node7003节点槽位分配少一点。使用权重的方式将node7001分配十二分之五的槽,node7002分配十二分之四的槽,node7003分配十二分之三的槽,有兴趣的自己小伙伴自己尝试一下吧。

../redis-6.2.1/src/redis-cli -a 123456 --cluster rebalance-weight 78dcab14f537b483cbe9f31b9906b4c007ae2558=5 86cd32d1da14d12afb820935ca593a3380140f8d=4 9d28b7ff19015e22085976a75c55bf5785774073=3 --cluster-simulate 172.25.41.229:7001

posted @ 2023-11-09 01:25  Be_Your_Sun  阅读(121)  评论(0编辑  收藏  举报