一、redis集群方案比较

主从哨兵模式
redis3.0之前的版本实现集群一般采用的方案是借助哨兵sentinel工具来监控master节点的状态,如果master主节点异常,则会做主从切换,将一台slave机器作为master。哨兵的配置稍微复杂,并且性能和高可用方面表现一般,主从切换瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外服务,没办法支持很高的并发。并且这单个主节点内存不宜设置过大,否则会导致持久化文件过大,影响数据恢复和主从同步。
在这里插入图片描述

高可用集群模式
redis集群是一个由多个主从节点群组成的分布式服务器群,具有复制、高可用、分片等特性。Redis集群不需要哨兵也能完成主从切换和故障转移。redis集群具有水平扩展的特性。redis集群的性能和高可用性优于哨兵模式,而且配置相对简单。
在这里插入图片描述

二、Redis高可用集群搭建

redis集群至少需要3个master节点,搭建3个master节点,并且每个主节点配置一个从节点,这样就有6个redis实例。搭建步骤如下:


 1. 在每台服务器的/usr/local下创建文件夹redis-cluster用于存放集群配置文件
	(1)mkdir -p /usr/local/redis-cluster
	(2)mkdir 8081 8082 8083 8084 8085 8086
 2. 把redis.conf复制到上面的文件夹中并修改一下内容
	(1) daemonize yes
	(2)port 8081(端口号分别设置)
	(3)pidfile /var/run/redis_8081.pid # 把pid进程号写入pidfile配置的文件
	(4)dir /usr/local/redis‐cluster/8081/(指定数据文件存放位置,必须要指定不同的目录位置,不然会
丢失数据)
	(5)cluster‐enabled yes(启动集群模式)
	(6)cluster‐config‐file nodes‐8081.conf(集群节点信息文件,这里808x最好和port对应上)
	(7)cluster‐node‐timeout 10000
	(8)# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通
过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
	(9)protected‐mode no (关闭保护模式)
	(10)appendonly yes
	(11)如果要设置密码需要增加如下配置:
			requirepass xxxxx(设置redis访问密码)
			masterauth xxxxx(设置集群节点间访问密码,跟上面一致)
 3. 分别启动6个redis实例,并验证是否启动成功
	(1)/usr/local/redis‐5.0.3/src/redis‐server /usr/local/redis‐cluster/808*/redis.conf
	(2)ps ‐ef | grep redis 查看是否启动成功
 4. 用redis‐cli创建整个redis集群
	# 执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不
关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)
	# 关闭防火墙
	# systemctl stop firewalld # 临时关闭防火墙
	# systemctl disable firewalld # 禁止开机启动
	(1)/usr/local/redis-5.0.3/src/redis-cli -a password --cluster create --cluster-replicas 192.168.10.10:8081 192.168.10.10:8082 192.168.10.10:8083 192.168.10.10:8084 192.168.10.10:8085 192.168.10.10:8086
 5. 验证集群
	(1)连接任意一个客户端 ./redis-cli -c -h -p (-a访问服务端密码 -c表示集群模式,指定ip和端口号)
	如:/usr/local/redis‐5.0.3/src/redis‐cli ‐a password ‐c ‐h 192.168.10.10 ‐p 808*
	(2)进行验证 命令:cluster info(查看集群信息),cluster node(查看节点信息)
	(3)数据操作验证
	(4)关闭集群需要逐个关闭redis客户端

三、集群原理分析

Redis Cluster将所有数据划分为16384个槽位(slots),每个节点负责其中一部分槽位,槽位对应的数据存放在对应的节点中。
槽位定位算法
类一致性hash算法
Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
redis cluster节点之间的通信机制
redis cluster之间采用gossip协议进行通信,维护集群的数据信息(集群节点信息,主从角色,节点数量,节点槽位等)
判断节点故障超时时长
当经常发生网络波动,导致节点暂时不可连接,但很快又恢复正常,如果没有设置这个故障超时时长,会导致主从频繁切换。需要在配置文件中配置 cluster-­node­-timeout ,当某个节点持续断连时长超过这个设置值时,系统才会判定节点故障,再进行主从切换
redis集群选举原理
当slave发现master出现故障时,便需要广播选举信息,期待成为新的master节点。

  1. slave发现master变为FAIL
  2. 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息
  3. 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
  4. 尝试failover的slave收集master返回的FAILOVER_AUTH_ACK
  5. slave收到超过半数master的ack后变成新Master
  6. slave广播Pong消息通知其他集群节点
    其他master主节点选举时,采取先到先选,也就是收到需要选举的从节点广播的信息,只响应第一个收到的;如果两个从节点收到的票数一样,则进行下一轮选举,并且为了避免这种情况的发生,redis采取了延时计算

四、其他问题

  1. 集群脑裂问题
    脑裂问题:如果现在主节点1由于网络波动被从节点认定为Fail,从节点选举产生新的主节点2,但实际上主节点1还是可以进行数据存放,这时候就产生了两个主节点;在网络分区恢复后,其中一个主节点会变为从节点,从而在通信未恢复的时间里对主节点存放的数据,将会丢失。
    过半机制:min‐replicas‐to‐write 1
    //写数据成功最少同步的slave数量,这个数量可以模仿大于半数机制配置,比如集群总共三个节点可以配置1,加上leader就是2,超过了半数
    加上这个配置,存放数据时需要至少min‐replicas‐to‐write 1个slave同步成功才是数据存放成功。这个配置会影响集群的可用性。

  2. 集群是否完整才能对外提供服务?
    当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用,如果为yes则集群不可用。

  3. Redis集群为什么至少需要3个节点,并且master节点数推荐为奇数个?
    至少需要3个节点是因为主从切换过程中,选举时至少需要过半数的master支持才能选举出新的master节点。推荐奇数个节点是为了节省机器资源,比如:4个节点,此时最多只能挂1个节点,挂2个节点的话无法进行选举;3个节点时,也只允许挂1个节点。所以奇数个master节点数主要是从节省机器资源的角度出发。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐