redis cluster 集群搭建及常见操作

        随着业务增长,redis中需要缓存的数据会越来越多。例如现有redis实例内存为4G,但业务增长后需要存储redis中数据为5G。对于此情况常见的两种常见解决方案就是加机器配置或者搭建集群,下面我列个表格比较下两种方案优缺点。

优点缺点
加配置快、简单

一、实例中数据越来越多,生成RDB时fork阻塞时间越来越长。

二、主从情况下:主库加配置从库也要相应的加配置

三、主库挂了,从库只能读,不能写

集群

一、数据存储在不同实例,生成RDB时fork阻塞时间短。

二、一个实例挂了,其他实例仍可对外提供服务。

一、对运维人员有一定要求,如果手动分配

二、单实例改集群需要开发人员修改代码。

redis cluster集群

        redis cluster通过哈希槽(hash slot)处理请求数据与实例间映射关关系。redis cluster16384个哈希槽,当数据请求redis时会将其key使用crc16算法得到一个16b的值,然后用这个值对16384取模,得到取模后的值根据集群搭建时的hash slot映射关系,写入不同实例。

集群搭建

        1.安装好准备好6个以上redis实例,集群搭建后为3主3从。

        2.修改redis.conf配置文件,端口分别为6379,6380,6381,6382,6383,6384。

注释该行使其他电脑可以访问
bind 127.0.0.1  

改为yes,使实例后台运行
daemonize no 

设置密码123456
requirepass 123456 

为每个实例配置不同端口
port 6379

开启集群支持
cluster-enabled yes 

用于存储集群中各节点相关信息,不可编辑,该文件默认在src目录下
cluster-config-file nodes.conf

集群节点不可用的最长时间,超过该时间进行从库故障转移
cluster-node-timeout 15000

        3.指定配置文件启动不同实例

        4.启动集群

redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384  --cluster-replicas 1 -a 123456

该命令中--cluster create 为创建集群
--cluster-replicas 1 表示1主1从
-a 123456 为实例密码
127.0.0.1 最好换成公网或局域网ip

如果以前手动分配过slot导致分布不均可以使用fix进行修复
redis-cli --cluster fix 127.0.0.1:6379 -a 123456

       5.启动后会展示哈希槽分配以及主从等信息,

Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6383 to 127.0.0.1:6379
Adding replica 127.0.0.1:6470 to 127.0.0.1:6380
Adding replica 127.0.0.1:6382 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ea26de894f03e89a71f512d85268de4e8a0b0ba8 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
M: c7c0a25eda2daa442d0b804b3064930a394562e2 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
M: 96ba659c8ff004c13313c16afb1fd4f7b5c35f70 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
S: 66f203ed18fe4895525d03a9fe9f2b3dbfb053d9 127.0.0.1:6382
   replicates c7c0a25eda2daa442d0b804b3064930a394562e2
S: be2550dba65ecff43884bae795a1e470dceafbb6 127.0.0.1:6383
   replicates 96ba659c8ff004c13313c16afb1fd4f7b5c35f70
S: 7430e4c0f1b506e0b81ef49e68696bdca38fa0b5 127.0.0.1:6470
   replicates ea26de894f03e89a71f512d85268de4e8a0b0ba8
Can I set the above configuration? (type 'yes' to accept): yes

集群主库为6379,6380,6381,对应分配的哈希槽为0-5460,5461-10922,10923-16383,yes表示接受该方案,不接受可以手动分配哈希槽。可以先接受,假如6379这台机器配置低,6380这台机器配置高,可以进入集群更改对应哈希槽。

        6.验证集群是否搭建成功

进入redis实例
./redis-cli -c -p 6380 -a 123456

当数据key在6380的哈希槽中直接写入成功
127.0.0.1:6380> set test 1
OK

当数据key不在6380的哈希槽中,重定向到对应哈希槽所在实例写入
127.0.0.1:6380> set test1 1
-> Redirected to slot [4768] located at 127.0.0.1:6379
OK
127.0.0.1:6379> 

集群常见操作

1.集群信息查看

显示集群信息
cluster info

显示集群节点相关信息
cluster nodes

计算test键应该放入哪个slot中
cluster keyslot test

查看6918的slot中键值对数量
cluster countkeysinslot 6918

取6918的slot中10条数据
cluster getkeysinslot  6918 10

2.手动分配hash slot

对于没有数据的hash slot 只需要指定要迁移的hash slot和要接受hash slot的实例id,以下命令是将6919这个hash slot迁移到1c1b63e7b0d7ebf132a6e60903365c4e3ac59080实例中,实例id可通过cluster nodes查看
cluster setslot 6919 node 1c1b63e7b0d7ebf132a6e60903365c4e3ac59080

对于已存在数据的hash slot迁移需要先迁移其数据,在数据迁移过程中如果有请求操作该hash slot内的key,redis会对其返回ack指令(只能使用一次)告诉客户端要去目标实例中查询。如果数据完全完成迁移,则会对其返回moved指令,该指令返回信息会缓存在客户端,下次可以直接去目标实例查询。
以6918 hash slot举例

1.在源实例上执行以下命令,将6918节点先进行迁移,1c1b63e7b0d7ebf132a6e60903365c4e3ac59080为目标实例id
cluster setslot 6918  migrating  1c1b63e7b0d7ebf132a6e60903365c4e3ac59080

2.在目标实例上执行,将6918节点导入,8ac7dce6414e361cf5d60285880862df7fb70f5b为原hash slot对应实例id
cluster setslot 6918 importing 8ac7dce6414e361cf5d60285880862df7fb70f5b

3.在源节点执行以下命令,查看6918 hash slot对应的key数量,取对应数量的key
cluster countkeysinslot 6918

cluster getkeysinslot 6918 100

4.将数据导入到目标实例 test为key ,0为使用的db,10为超市时间 auth对应目标实例密码
migrate 127.0.0.1 6379 test 0 10 auth 123456

5.执行hash slot迁移
cluster setslot 6918 node 1c1b63e7b0d7ebf132a6e60903365c4e3ac59080

我的cluster nodes如下
acebb98306259c0112b0df0f77ed5696450a2afa 127.0.0.1:6381@16381 master - 0 1628497834000 3 connected 10923-16383
1ff176274f6ebfc6cca32b02e9491537d3ffff7e 127.0.0.1:6383@16383 slave 1c1b63e7b0d7ebf132a6e60903365c4e3ac59080 0 1628497835282 1 connected
0d10a189a946846a7f6c93bc1c47ea9651ffa1b7 127.0.0.1:6384@16384 slave 8ac7dce6414e361cf5d60285880862df7fb70f5b 0 1628497834281 7 connected
66350304fe609d98f012b8effe8bf2168d03a37d 127.0.0.1:6382@16382 slave acebb98306259c0112b0df0f77ed5696450a2afa 0 1628497836284 3 connected
1c1b63e7b0d7ebf132a6e60903365c4e3ac59080 127.0.0.1:6379@16379 master - 0 1628497834000 1 connected 0-5460 6918-6919
8ac7dce6414e361cf5d60285880862df7fb70f5b 127.0.0.1:6380@16380 myself,master - 0 1628497833000 7 connected 5461-6917 6920-10922

3.自动分配hash slot,由系统自动分配,无法指定分配哪个hash slot

执行
redis-cli --cluster reshard  127.0.0.1:6379 -a 123456

选择分配多少hash slot
How many slots do you want to move (from 1 to 16384)? 1

接收节点id,复制粘贴要接收hash slot的 node id 
What is the receiving node ID? acebb98306259c0112b0df0f77ed5696450a2afa

选择来源,all代表所有
Source node #1: all

是否接收分配方案
Do you want to proceed with the proposed reshard plan (yes/no)? yes



4.新增主节点,准备实例端口6385,配置按照搭建集群时配置

1.将6385实例加入集群,6379为原集群中实例,端口可以随便写,只要是原集群中实例端口就行
redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6379 -a 123456

2.加入完后可以进入redis查看相关信息,此时6385是没有对应的hash slot的
cluster nodes

1ff176274f6ebfc6cca32b02e9491537d3ffff7e 127.0.0.1:6383@16383 slave 1c1b63e7b0d7ebf132a6e60903365c4e3ac59080 0 1628501694202 8 connected
0d10a189a946846a7f6c93bc1c47ea9651ffa1b7 127.0.0.1:6384@16384 slave 8ac7dce6414e361cf5d60285880862df7fb70f5b 0 1628501693200 7 connected
66350304fe609d98f012b8effe8bf2168d03a37d 127.0.0.1:6382@16382 slave acebb98306259c0112b0df0f77ed5696450a2afa 0 1628501692198 3 connected
baf1b5d954137edcf81e947ac76a3d7719da98fc 127.0.0.1:6385@16385 master - 0 1628501694000 0 connected
8ac7dce6414e361cf5d60285880862df7fb70f5b 127.0.0.1:6380@16380 master - 0 1628501692000 7 connected 5461-6917 6919-10922
acebb98306259c0112b0df0f77ed5696450a2afa 127.0.0.1:6381@16381 master - 0 1628501690000 3 connected 10923-16383
1c1b63e7b0d7ebf132a6e60903365c4e3ac59080 127.0.0.1:6379@16379 myself,master - 0 1628501691000 8 connected 0-5460 6918

3.此时可以按手动分配hash slot或者自动分配hash slot的方法对新实例分配hash slot

5.新增从节点,准备实例端口6386,配置按照搭建集群时配置

1.将6386实例加入集群,加入集群的节点默认为主节点,可通过cluster nodes查看
redis-cli --cluster add-node 127.0.0.1:6386 127.0.0.1:6379 -a 123456

2.进入实例
redis-cli  -a 123456 -c -p 6386

3.查看node id
cluster nodes

4.建立主从关系
cluster replicate baf1b5d954137edcf81e947ac76a3d7719da98fc

6.删除节点

删除从节点6386,d4c9d7842bd11782f61d88422aa08623c3b7d6e3为6386 node id
redis-cli --cluster del-node 127.0.0.1:6386 d4c9d7842bd11782f61d88422aa08623c3b7d6e3  -a 123456


删除主节点6385
1.先移除对应hash slot,参考自动分配hash slot,将source nodes 改为6385对应node id,以done表示结尾

2.删除主节点
redis-cli --cluster del-node 127.0.0.1:6385 baf1b5d954137edcf81e947ac76a3d7719da98fc-a 123456

        大致就这些吧,其他可以参考Redis Cluster tutorialRedis Cluster specification

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值