Redis集群
Redis集群架构有哪些
- 主从架构:选择一台作为主服务器,将数据同步多台到从服务器上,构建一主多从的的模式,主从之间读写分离。主服务器可读可写,发生写操作会同步给从服务器,而从服务器一般是只读,且主从之间同步是异步的,所以无法实现强一致性保证
- 哨兵集群:当Redis的主服务器出现故障的时候,需要手动进行恢复,为了解决这个问题,Redis增加了哨兵模式,哨兵监控主从服务器,如果主服务器宕机了,会选择一个从服务器作为主服务器,并通知给其他从服务器和客户端
- 切片集群:当数据量大到一定程序的时候,需要使用Redis切片集群方案,将数据分布在不同服务器上,以此来降低系统对单节点的依赖
切片集群
过程:
- 根据键值对的key,按照CRC16算法计算出一个16bit
- 再用16bit值对16384取模得到一个模数,每个模数代表一个相应编号的哈希槽
哈希槽分配:
- 平均分配:使用cluster create命令创建Redis集群的时候,Redis会自动把所有哈希槽平均分布到集群节点上,比如有9个节点,就是16834/9
- 手动分配:使用cluster meet命令手动建立节点之间的连接,组成集群,再使用cluster addslots命令,指定每个节点上的哈希槽个数
Redis主从复制过程
全量同步
slave获取master所有的数据:
- 从服务器发送sync命令到主服务器,链接主服务
- 主服务器收到sync命令,进行存盘的操作,并继续收集后续的写命令,存储缓冲区
- 存盘结束后,将对应数据的文件写到slave中,完成一次全量同步
- 主服务器数据发送完毕后,将进行增量的缓冲区数据同步
- slave加载数据文件和缓冲区文件,开始接受命令操作,提供操作
增量同步
- 从节点完成全量同步后,就可以开启增量同步。当master节点有写操作的时候,会自动同步到slave节点上。master节点每执行一个任务,都会写入到缓冲区中,随后将缓存区中的命令发给从节点执行
哨兵机制的工作原理
判断节点是否存活:哨兵会周期性地给主从库发送PING命令来判断节点是否下线。如果主库没有在规定时间返回响应,则将该节点标记为主观下线,然后该哨兵节点会向其他哨兵节点发出投票命令,当投票命令到达一定阈值后该节点会标记为客观下线
投票:哨兵集群中会重新选择一个从leader来负责主从切换,选举是一个投票过程:判断主节点为客观下线的是候选者,候选者向其他节点发送命令表示要成为leader,其他哨兵会进行投票,每个哨兵只有一票,但是只有哨兵节点会自己投给自己。候选者拿到半数以上的赞成票并且达到了阈值会成为leader
选择出新的主节点:进行三轮考察,哪些节点胜出就进行下一轮,直到选出主节点
- 根据从节点的优先级来排序,优先级的值越小排名越靠前
- 如果优先级相同,则查看复制的下标,哪个接受的复制数据多就选哪个
- 如果优先级和下标都相同,选择id最小的那个
哨兵leader让已下线主节点属下的所有从节点指向新主节点
通知客户端的主节点已更换
将旧主节点变成从节点
哨兵模式的优缺点
- 优点:保证系统的高可用,各个节点可以做故障转移
- 缺点:主节点单点风险高,主从切换过程可能会出现数据丢失的问题。此外主从模式无法水平扩容(因为主节点和从节点数据要一样)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 cloud_fly blog!