企业级Redis Cluster部署详解及演练
7.Redis Cluster(无中心化设计)
7.1 Redis Cluster 工作原理
在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。
redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接
7.1.1 Redis Cluster特点
-
所有Redis节点使用(PING机制)互联
-
集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效
-
客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP
-
redis cluster把所有的redis node 平均映射到 0-16383个槽位(slot)上,读写需要到指定的redis node上进行操作,因此有多少个redis node相当于redis 并发扩展了多少倍,每个redis node 承担16384/N个槽位
-
Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈。
7.1.2 Redis cluster 架构
假如三个主节点分别是:A, B, C 三个节点,采用哈希槽 (hash slot)的方式来分配16384个slot 的话它们三个节点分别承担的slot 区间可以是:
节点A覆盖 0-5460
节点B覆盖 5461-10922
节点C覆盖 10923-16383
7.1.2.1 Redis cluster 主从架构
Redis cluster的架构虽然解决了并发的问题,但是又引入了一个新的问题,每个Redis master的高可用如何解决?
那就是对每个master 节点都实现主从复制,从而实现 redis 高可用性
7.1.2.2 Redis Cluster 部署架构说明
7.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
7.3 部署redis cluster
在所有redis主机中
dnf install redis -ysystemctl disable --now firewalldsystemctl enable --now redis
[root@redis-masterx ~]# vim /etc/redis/redis.conf
bind * -::*
masterauth "123456" # 集群主从认证
requirepass "123456" # redis登陆密码 redis-cli 命令连接redis后要用“auth 密码”进行认证cluster-enabled yes # 开启cluster集群功能
cluster-config-file nodes-6379.conf # 指定集群配置文件
cluster-node-timeout 15000 # 节点加入集群的超时时间单位是ms[root@redis-master1 ~]# systemctl restart redis.service
# 测试
[root@redis-master1 ~]# redis-cli -a 123456 info
# Cluster
cluster_enabled:1

# 如果想省事,建议使用scp
[root@redis-node1 ~]# vim /etc/redis/redis.conf
[root@redis-node1 ~]# systemctl restart redis.service[root@redis-node1 ~]# scp /etc/redis/redis.conf root@172.25.254.60:/etc/redis/redis.conf
[root@redis-node1 ~]# scp /etc/redis/redis.conf root@172.25.254.50:/etc/redis/redis.conf
[root@redis-node1 ~]# scp /etc/redis/redis.conf root@172.25.254.40:/etc/redis/redis.conf
[root@redis-node1 ~]# scp /etc/redis/redis.conf root@172.25.254.30:/etc/redis/redis.conf
[root@redis-node1 ~]# scp /etc/redis/redis.conf root@172.25.254.20:/etc/redis/redis.conf# 最后一定要在每个主机中执行
systemctl restart redis.service
7.4 redis-cli --cluster 参数说明
[root@redis-master1 ~]# redis-cli --cluster help
Cluster Manager Commands:create host1:port1 ... hostN:portN #创建集群--cluster-replicas <arg> #指定master的副本数check <host:port> or <host> <port> #检测集群信息info <host:port> or <host> <port> #查看集群信息fix <host:port> or <host> <port> #修复集群reshard <host:port> or <host> <port> #在线热迁移集群指定主机的slots数据rebalance <host:port> or <host> <port> #平衡各集群主机的slot数量add-node new_host:new_port existing_host:existing_port #添加主机del-node host:port node_id #删除主机import host:port #导入外部redis服务器的数据到当前集群-
7.5 创建redis-cluster
[root@redis-master1 ~]# redis-cli --cluster create -a 123456 \
> 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 \
> 172.25.254.40:6379 172.25.254.50:6379 172.25.254.60:6379 \
> --cluster-replicas 1#### 以下命令可以直接复制(与上面相同)
#### redis-cli --cluster create -a 123456 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 172.25.254.40:6379 172.25.254.50:6379 172.25.254.60:6379 --cluster-replicas 1
####>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460 #哈希槽分配
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.25.254.120:6379 to 172.25.254.10:6379 #主从分配情况
Adding replica 172.25.254.130:6379 to 172.25.254.20:6379
Adding replica 172.25.254.110:6379 to 172.25.254.30:6379>>> Check for open slots... #检查打开的哈希槽位
>>> Check slots coverage... #检查槽位覆盖范围
[OK] All 16384 slots covered. #所有槽位分配完成# 配置文件位置
[root@redis-master1 ~]# ll /var/lib/redis/nodes-6379.conf
# 分配情况如下:
7.5.1 检测redis集群状态
[root@redis-master1 ~]# redis-cli -a 123456 --cluster info 172.25.254.10:6379 # 查看集群状态,获取Redis集群的全局拓扑状态[root@redis-master1 ~]# redis-cli -a 123456 cluster info # 查看当前连接节点视角的集群状态[root@redis-master1 ~]# redis-cli -a 123456 --cluster check 172.25.254.10:6379 # 检测集群,执行深度集群健康诊断




7.5.2 写入数据并测试
# 在10上测试,提示本机哈希槽被分配到20上
[root@redis-node1 ~]# redis-cli -a 123456
127.0.0.1:6379> set name ceshi
(error) MOVED 5798 172.25.254.20:6379# 在20上进行测试
[root@redis-node2 ~]# redis-cli -a 123456
127.0.0.1:6379> set name ceshi
OK
127.0.0.1:6379> get name
"ceshi"


7.6 集群扩容
# 添加master
[root@redis-node1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.70:6379 172.25.254.10:6379# 分配槽位
[root@redis-node1 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.10:6379How many slots do you want to move (from 1 to 16384)? 4096 # 分配哈希槽的大小(16384/4=4096)
What is the receiving node ID? 28f73db3a7003fdb0ba510cf7fd802b4da3ea94b # 新添加master的id
Source node #1: all # all-->从其余三台平均分4096个# 添加salve
[root@redis-master1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.80:6379 172.25.254.10:6379 --cluster-slave --cluster-master-id 28f73db3a7003fdb0ba510cf7fd802b4da3ea94b
7.7 clsuter集群维护
添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。
# 先查看一下
[root@redis-node1 ~]# redis-cli -a 123456 --cluster check 172.25.254.10:6379
# 移除要下线主机的哈希槽位
[root@redis-node1 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.10:6379 # 此处只是进入reshard的管理界面 # 删除master
[root@redis-node1 ~]# redis-cli -a 123456 --cluster del-node 172.25.254.70:6379 d458f34fa900d83212c021dc1e65396e490b5495[root@redis-node1 ~]# redis-cli -a 123456 --cluster del-node 172.25.254.80:6379 5ab2e93f4f0783983676f7bd118efaacfb202bd1