官方网站:https://redis.io/topics/cluster-tutorial
尽管可以使用哨兵主从集群实现可用性保证,但是这种实现方式每个节点的数据都是全量复制,数据存放量存在着局限性,受限于内存最小的节点,因此考虑采用数据分片的方式,来实现存储,这个就是 redis-cluster。
Redis cluster 是 redis 的分布式解决方案,在 3.0 版本正式推出后,有效的解决了redis 分布式方面的需求;当遇到单机内存,并发,流量等瓶颈时,可以采用 cluster架构方案达到负载均衡的目的。
2018 年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby 的集群方式,改为使用 C 语言编写的 redis-cli 的方式,使集群的构建方式复杂度大大降低。
在 redis3.0 以前的版本要实现集群一般是借助哨兵 sentinel 工具来监控 master 节点的状态,如果 master 节点异常,则会做主从切换,将某一台 slave 作为 master, 哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大, 影响数据恢复或主从同步的效率。
Redis cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 0~16383 整数槽内,
计算公式:Slot=CRC16(key) & 16384
每个节点负责维护一部分槽以及槽所映射的键值数据。
redis 群集中的每个节点都负责哈希槽的子集,例如,您可能拥有一个包含 3 个节点的群集,其中:
如果只具有节点 A,B,C 实例的集群中,如果节点 B 发生故障,则集群无法继续,因为我们不再能够在 5461-10922 范围内提供服务哈希位置的方法。
然而,当创建集群时,我们向每个主节点添加一个从节点,集群最终包含主节点的 A,B,C 和从节点的 A1,B1,C1 组成。 如果节点 B 出现故障,系统就能继续运行。 如果 节点 B 挂机,集群将节点 B1 升级为新的主节点,并将继续正常运行。 但请注意,如果节点 B 和 B1 同时发生故障,Redis Cluster 将无法继续运行。
Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。
Redis 集群至少需要 3 个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以 2 个节点无法构成集群。
要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以 Redis集群至少需要 6 台服务器。 我们这里搭建三个 master 节点,并且给每个 master 再搭建一个 slave 节点,三主三从。
实验拓扑:
主机 |
IP |
角色 |
端口 |
CentOS_JClouds |
192.168.137.253 |
Master |
6379 |
CentOS_Client01 |
192.168.137.6 |
Master |
6379 |
CentOS_Book |
192.168.137.252 |
Master |
6379 |
CentOS_JClouds |
192.168.137.253 |
Slave |
6380 |
CentOS_Client01 |
192.168.137.6 |
Slave |
6380 |
CentOS_Book |
192.168.137.252 |
Slave |
6380 |
准备工作:清理所有机器的Sentinel(之前实验配置了sentinel,没有配置可忽略此步)
# 杀掉redis sentinel进程
pe -ef | grep redis
kill -9 sentinel进程
# 清理配置文件
rm -rf /usr/local/etc/*
rm -rf /usr/local/data/*
rm -rf /var/log/redis/*
# 配置主节点253
cp /usr/local/src/redis-6.2.6/redis.conf /usr/local/redis/etc/redis-6379.conf
vim /usr/local/redis/etc/redis-6379.conf
#-----------------------------------配置文件-------------------------------------
# redis 后台运行
daemonize yes
bind 127.0.0.1 -::1 192.168.137.253
port 6379
pidfile /var/run/redis_6379.pid
# 配置 redis rdb 数据保存位置
dir "/data/redis/data/6379"
# 日志文件保存路径
logfile "/var/log/redis/redis_6379.log"
# 设置 redis 登陆密码
requirepass 123456
# 设置主从同步密码
masterauth 123456
# 开启集群,把注释#去掉
cluster-enabled yes
# 配置文件首次启动自动生成
cluster-config-file nodes-6379.conf
# 请求超时时间 15s
cluster-node-timeout 15000
# aof 日志开启
appendonly yes
#-----------------------------------配置文件-------------------------------------
主要参数 |
说明 |
cluster-enabled |
如果设置为 yes,则在特定 Redis 实例中启用 Redis 群集支持。否则,实例像往常一样作为独立实例启动。 |
cluster-config-file |
请注意,这不是用户可编辑的配置文件,而是每次发生更改时 Redis 群集节点自动保持群集配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了集群中其他节点,状态,持久变量等内容。 |
cluster-node-timeout |
Redis 集群节点不可用的最长时间,如果主节点的可访问时间超过指定的时间,则其从属节点将进行故障转移。 |
# 编写从节点配置文件
cp /usr/local/redis/etc/redis-6379.conf /usr/local/redis/etc/redis-6380.conf
# 将从节点的配置文件中的端口改为6380
sed -i 's/6379/6380/g' /usr/local/redis/etc/redis-6380.conf
# 在每个节点上创建数据目录
mkdir -p /usr/local/redis/data/{6379,6380}
# 将节点A的配置目录推送给其他节点
for i in 6 252;do scp /usr/local/redis/etc/* 192.168.137.$i:/usr/local/redis/etc/;done
注意:这里需要更改其他主从配置文件的中监听的IP地址
# 启动每个节点的redis主从服务
redis-server /usr/local/redis/etc/redis-6379.conf
redis-server /usr/local/redis/etc/redis-6380.conf
# 添加开机自启动
echo "redis-server /usr/local/redis/etc/redis-6379.conf" >> /etc/rc.local
echo "redis-server /usr/local/redis/etc/redis-6380.conf" >> /etc/rc.local
redis5.0 开始不再使用 ruby 搭建集群,使用命令 redis-cli
redis-cli --cluster create 192.168.137.253:6379 192.168.137.253:6380
192.168.137.252:6379 192.168.137.252:6380
192.168.137.6:6379 192.168.137.6:6380 --cluster-replicas 1 -a 123456
redis-cli -h 192.168.137.253 -p 6379 -c -a 123456
192.168.137.253:6379> cluster nodes
cluster info
# 写入数据测试
192.168.137.253:6379> set name "zs"
# 查看集群的完整性
redis-cli --cluster check 192.168.137.253:6379 -a 123456
① 模拟主redis服务 192.168.137.253:6379 故障
# # 查看集群的完整性
redis-cli --cluster check 192.168.137.253:6380 -a 123456
② 再次将 192.168.137.253:6379 启动
# 启动253:6379服务
redis-server /usr/local/redis/etc/redis-6379.conf
# 检查集群的完整性
redis-cli --cluster check 192.168.137.253:6380 -a 123456
redis-cli --cluster help