和全部的数据库同样,Redis也支持集群化,Redis的集群分为分布式集群和主从集群。大部分公司采起的都是主从集群。因此在本篇文章内,咱们将着重介绍Redis的主从集群及哨兵机制。html
因为Redis的主从同步是异步进行的,因此Redis主从集群不知足事务的一致性,同时Redis在主从网络不可用的状况下,主节点依旧能够提供服务,因此Redis主从集群知足事物的可用性。Redis只能保证数据的最终一致性。数据库
Redis的主从同步主要是经过如下几种方式来进行同步的。网络
增量同步,本质上是同步的主节点的修改指令。即Redis主节点将全部key的修改指令写入到一段定长的内存缓冲区中,而后将修改指令同步到从节点,同时从节点将指令执行状况(偏移量)反馈到主机节点,以此来进行主从同步。数据结构
注意:因为主节点的指令缓冲区是定长的,因此当缓冲区写满后,又会缓冲区起始位置开始覆盖写入新的指令。
运维
当某种缘由(如主从网络延迟、从节点执行指令效率太低等)致使增量同步的数据不一致的时候,就须要快照同步来修复数据。快照同步首先须要将主节点上的数据进行一次bgsave,将内存数据所有持久化到磁盘,而后同过网络传输到从节点,写入从节点磁盘。从节点再使用快照加载数据,当数据加载完成后,从节点反馈给主节点,继续进行增量同步。异步
注意:当主节点的指令缓冲区设置太小时,会致使快照同步陷入死循环,所以主机节点的指令缓冲区必定要设置合理。
分布式
本质上至关于快照同步,只不过少了主节点数据写入磁盘的步骤,换成主节点内存数据直接写入从节点的磁盘,而后继续快照同步的后续操做 。spa
在传统的Redis主从集群中,主节点一旦出现故障,须要人工介入干预,切换集群的主从节点,同时通知应用方,这无疑是没法接受的。使人高兴的是Redis从2.8版本以后,开始支持哨兵模式了,改变了传统的人肉运维方式。code
Sentinel(哨兵)主要负责持续监控Redis主从集群的健康,并负责实现主从集群的自动选主过程,同时将选主结果通知到客户端。htm
哨兵模式主要分为哨兵节点和数据节点(图中的Master 和 Slave节点),一次完整的选主流程以下:
1. 在该模式下,客户端首先会遍历全部的哨兵,获取主节点信息,而后链接到主节点;
2. 在主从集群内部其运转以下:
2.1. 每一个哨兵节点向全部数据节点发送每十秒钟一次的ping信息;
2.2. 若一个数据节点距离最后一次ping成功的时间超过预设值,则该节点被哨兵认为是主观下线;
2.3. 当Master节点被标记为主观下线时,全部哨兵节点都会以每秒一次的频率确认Master是否真的进入了主观下线;
2.4. 当超过必定数量的哨兵都确认Master进入了主观下线后,Master会被标记为客观下线;
2.5. 若在此过程当中Master恢复了对哨兵ping请求的响应,Master会被移除主观下线标记;
2.6. 当Master被客观下线后,哨兵会重新选择合适的从节点升级为主节点;
2.7. 新的选主完成后,将从新全部节点的主从配置文件,同时全部从节点将重新的主节点同步数据;
2.8. 若选主流程的时间超过预设值后,选主将会失败;
3. 主从集群内部选主完成后,哨兵会利用Redis是Pub/Sub(发布/订阅)功能,通知客户端从新初始化链接池,链接到新的主节点。