Redis Cluster集群(无中心化设计)
1.1 Redis Cluster 工作原理
在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。
redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接
Redis Cluster特点如下
-
所有Redis节点使用(PING机制)互联
-
集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效
-
客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP
-
redis cluster把所有的redis node 平均映射到 0-16383个槽位(slot)上,读写需要到指定的redisnode上进行操作,因此有多少个redis node相当于redis 并发扩展了多少倍,每个redis node 承担16384/N个槽位
-
Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈。
Redis Cluster架构
1.2 创建redis cluster的前提
1.每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。
2.每个节点必须开启的参数
-
cluster-enabled yes -----必须开启集群状态,开启后redis进程会有cluster显示
-
cluster-config-file nodes-6380.conf ------此文件有redis cluster集群自动创建和维护,不需要任何手动操作
3.所有redis服务器必须没有任何数据
4.先启动为单机redis且没有任何key value
1.3 Redis Cluster的环境部署
部署架构说明:
主机名 | IP | 角色 |
---|---|---|
redis-node1 | 172.25.254.14 | master 1 |
redis-node2 | 172.25.254.24 | master 2 |
redis-node3 | 172.25.254.34 | master 3 |
redis-node4 | 172.25.254.44 | slave 1 |
redis-node5 | 172.25.254.54slave | slave 2 |
redis-node6 | 172.25.254.64 | slave 3 |
redis-node7 | 172.25.254.74 | master 4(扩容) |
redis-node8 | 172.25.254.84 | slave 4(扩容) |
注意:以下案例实现的操作环境都为Rhel9.1
# 配置好以上后,需要将防火墙关闭,以防影响案例的实现
[root@redis-node1 ~]# systemctl stop firewalld.service
[root@redis-node1 ~]# systemctl mask firewalld.service
[root@redis-node1 ~]# setenforce 0
1.4 部署redis cluster
以下配置在所有redis-node主机中进行配置
1.# 安装redis
[root@redis-node1 ~]# yum install redis -y # 安装redis2.# 设定主配置文件
[root@redis-node1 ~]# vim /etc/redis/redis.conf bind * -::* # 开启redis的端口
masterauth "123456" # 集群主从认证
requirepass "123456" # redis登陆密码 redis-cli 命令连接redis后要用“auth 密码”进行认证
cluster-enabled yes # 开启cluster集群功能
cluster-config-file nodes-6379.conf # 指定集群配置文件
cluster-node-timeout 15000 # 节点加入集群的超时时间单位是ms3.# 将修改好的主配置文件拷贝到其他redis主机中
[root@redis-node1 ~]# for i in 24 34 44 54 64 74 84
> do
> scp /etc/redis/redis.conf root@172.25.254.$i:/etc/redis/redis.conf
> done
测试:
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> keys * # 查询所有key
(error) NOAUTH Authentication required. # 提示需要密码验证
127.0.0.1:6379> auth 123123 # 输入密码进行验证
OK
127.0.0.1:6379> keys * # 可以在查询key了
(empty array) # 此时不存在key
127.0.0.1:6379> set name haha # 尝试写入数据
(error) CLUSTERDOWN Hash slot not served # 提示哈希槽未提供
127.0.0.1:6379>
1.5 redis-cli (Cluster)参数说明
参数 | 说明 |
---|---|
cteate | 创建集群 |
check | 指定master的副本数 |
info | 检测集群信息 |
fix | 修复集群 |
reshard | 在线热迁移集群指定主机的slots数据 |
rebalance | 平衡各集群主机的sloat数量 |
ass-node | 添加主机 |
del-node | 删除主机 |
import | 导入外部redis服务器的数据到当前集群 |
1.6 创建Redis-Cluster
三主三从
1.6.1 Redis-Cluster配置
# 在redis-node1中进行写入
[root@redis-node1 ~]# redis-cli --cluster create -a 123123 \
> 172.25.254.14:6379 172.25.254.24:6379 172.25.254.34:6379 \
> 172.25.254.44:6379 172.25.254.54:6379 172.25.254.64:6379 \
> --cluster-replicas 1 # 启用集群数1
1.6.2 检测redis的状态
1.检测集群
[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves.
172.25.254.24:6379 (fd0a3870...) -> 0 keys | 5462 slots | 1 slaves.
172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 172.25.254.14:6379)
M: f4b7f2f48521679edc7744c80782f662c61a2bff 172.25.254.14:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 24ee61e1ee3ad2a8b509922f5aaae1370212566e 172.25.254.64:6379slots: (0 slots) slavereplicates fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f
M: fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f 172.25.254.24:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
M: 3f0d0fe71de65370bde9cc742c9555e31079aec4 172.25.254.34:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 17d0bdc6b738484dc026d55509ed947c55c6c6cf 172.25.254.44:6379slots: (0 slots) slavereplicates 3f0d0fe71de65370bde9cc742c9555e31079aec4
S: ce9f76a54d24c5c7d73838e46f6d6631b8aa35b3 172.25.254.54:6379slots: (0 slots) slavereplicates f4b7f2f48521679edc7744c80782f662c61a2bff
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
2.查看集群的状态
[root@redis-node1 ~]# redis-cli -a 123123 --cluster info 172.25.254.14:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves.
172.25.254.24:6379 (fd0a3870...) -> 0 keys | 5462 slots | 1 slaves.
172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
3.写入数据
[root@redis-node1 ~]# redis-cli -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set name haha
(error) MOVED 9189 172.25.254.24:6379 # 被分配到24(redis-node2)的hash槽位上[root@redis-node2 ~]# redis-cli -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set name haha
OK
4.读取数据
通过查看当前通过hash分配的写入主机master2查看对应的slave
去到与master2对应的slave3去查看数据
[root@redis-node6 ~]# redis-cli -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get name # 查看数据
(error) MOVED 5798 172.25.254.24:6379 # 但是此时发现还是查看不了
原因是:此时我们通过查看master2的集群可以发现,对应的slacve中没有分配hash槽位,只有当master故障后,才会分配到对应的slave hash槽位,这时才能去查看数据
1.7 集群扩容
四主四从
1.7.1 添加Master
# 添加master
[root@redis-node1 ~]# redis-cli -a 123123 --cluster add-node 172.25.254.74:6379 172.25.254.14:6379
查看master是否已添加
[root@redis-node1 ~]# redis-cli -a 123123 --cluster info 172.25.254.14:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves.
172.25.254.74:6379 (2c6ed811...) -> 0 keys | 0 slots | 0 slaves. # 添加的master成功
172.25.254.24:6379 (fd0a3870...) -> 1 keys | 5462 slots | 1 slaves.
172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 4 masters.
0.00 keys per slot on average.
1.7.2 分配槽位
[root@redis-node1 ~]# redis-cli -a 123123 --cluster reshard 172.25.254.14:6379
1.7.3 添加slave
[root@redis-node1 ~]# redis-cli -a 123123 add-node \
> 172.25.254.84:6379 172.25.254.14:6379 \
> --cluster-slave --cluster-master-id 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e
1.7.4 查看集群
[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379
1.8Redis-Cluster集群的维护
添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。
1.移除需要下线的Master对应的Slave
[root@redis-node1 ~]# redis-cli -a 123123 --cluster del-node 172.25.254.84:6379 9dd9585dee4b05c5d733ed28b1f98f555783e394 # 需要移除的Slave对应的IP及ID
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 9dd9585dee4b05c5d733ed28b1f98f555783e394 from cluster 172.25.254.84:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379 # 查看集群删除的slave是否已经删除
2.移除要下线主机的哈希槽位
[root@redis-node1 ~]# redis-cli -a 123123 --cluster reshard 172.25.254.14:6379
3.移除master
[root@redis-node1 ~]# redis-cli -a 123123 --cluster del-node 172.25.254.74:6379 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e from cluster 172.25.254.74:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
重新查看集群:
以上通过对比,可以看出,master和对应的slave已经移除