一、Redis高可用集群结构
Redis高可用集群有两种,分别是主从哨兵模式和集群模式
1.主从哨兵模式
其中一台服务器作为master服务器,提供读写服务,配置多台从服务器,从服务器只提供只读服务,同时配置多台sentinel,也即是哨兵,哨兵的作用是可以监控master节点,如果master宕机,可以从从服务器中选举出一台作为master服务器。
哨兵模式,客户端连接哨兵集群,即可获得master服务器的信息。此时客户端并不会做读写分离,也就是所有读写都由master服务器处理,这里相当于从服务器只作为主服务器的数据备份。如果master发生故障,切换到其他从服务器,哨兵会把新的master服务器地址告知客户端。
jedis和RedisTemplate都没有实现读写分离。如果需要可以分别建立master服务器连接池和slave服务器连接池,并严格区分读写操作,路由到需要使用的连接池。需要注意的是,Redis主从复制是异步的,可能存在小概率数据不一致的问题。
参考
https://blog.csdn.net/weixin_38650898/article/details/123866858
2.Cluster集群模式
在主从哨兵模式,所有的写操作都是由master处理,这在性能上可能会出现瓶颈。Redis3.0后推出了集群模式,可以实现水平扩展,配置多台的master服务器处理读写请求。
集群模式下,看似于将一个大的主从架构拆分成多个主从架构的服务器群,具有复制,高可用和分片的特性。不需要哨兵,也可以实现节点故障移除和master选举功能。性能和高可用性均优于哨兵模式,但需要更多的服务器。可以从公司业务的并发量和成本等角度考量选择哪种模式。
Redis Cluster集群模式默认将所有的数据划分为16384个slot槽,每个master节点均匀负责一部的槽位。
通常,会对key值使用crc16算法进行hash得到一个整数值,然后使用这个整数值对16384进行取模,来得到具体的槽位。
Cluster集群模式下,Redis默认从服务是不分担读请求,只作为备注和故障转移。但有读请求到达从服务器,会重定向到主服务器处理。
二、主从数据同步
Redis主从数据同步大致分为两种,全量复制和增量复制。
全量复制
增量复制
一般情况下,主从断开连接后会进行全量复制,但Redis2.8后开始支持部分数据的复制。master和从服务器第一次连接时会进行全量复制,同时master和所有的slave都会维护一个复制数据的偏移量offset和master的进程id。如果从服务器断开重连后,会比较偏移量是否太旧或者master进程id是否变更了,如果这样则会进行一次全量复制,否则会进行部分复制,把offset之后的数据同步给从服务器。
三、选举
1.主从哨兵模式
这种模式下,是有哨兵监控master服务器状态,并实现故障转移。一旦master服务器宕机,则哨兵会从剩下的从服务器中选举一条作为新的master节点。这里有几个概念:
主观下线:
哨兵会定期向主服务器发送心跳包检测是否正常,如果超过配置文件中sentinel down-after-milliseconds mymaster 配置的时间没有收到主服务器的回复,则这个哨兵认为主服务下线。
客观下线:
一个哨兵把master记为主观下线,并不代表master就一定下线了,此时要向其他哨兵确认master是否真的下线,如果超过sentinel monitor mymaster 配置的数量(一般为哨兵数量/2 + 1)哨兵认为master下线,则记为客观下线。
哨兵选举master服务器过程:
- 先从哨兵中选举出一个leader,并由这个leader选举出新的master
- 过滤故障节点,从剩余的节点中按照下列规则选出master
- 优先选择slave-priority最大的从节点作为主节点
- 其次选择数据偏移量最大的节点
- 选择runid最小的从节点
2.集群模式
- slave发现自己的master下线后,会广播故障转移信息到其他master节点
- master接收到slave故障转移请求后,首先会检测请求的合法性,然后发送响应ack给slave,每轮投票,master只会响应一次
- 一旦一个slave接收超过半数master的ack后,则被选中成为新的master,否则会进行下一轮的投票
四、过期内存淘汰策略
- 被动删除,客户端get 请求某个key时,会判断是否过期,如果过期了,则会清楚
- 主动删除,redis定期扫描一批key,检查是否过期,如果过期,则清楚
- 内存淘汰策略,当redis内存不足以容纳更多的key时,则会触发内存淘汰策略,可以在配置文件配置。常用有lru(最久没访问),lfu(访问频率最低) random(随机),同时可以配置针对所有的key,还是设置了过期时间的key执行淘汰。