哨兵(Sentinel)模式
上文中介绍了Redis主从复制模式下的集群策略,当Master宕机后,不会从Slave节点中选举出Master,所以该集群丧失了写的能力,我们只能人工去将Slave节点晋升为Master节点,同时要通知应用方更新Master节点的IP地址,对于这种故障处理的方式在现在的环境下通常是不可接受的。所以从Redis2.8开始,Redis正式提供了哨兵模式的架构(故障转移),来解决这个问题。
哨兵模式的工作特点:
哨兵模式是建立在主从模式的基础上,当Master节点宕机之后,哨兵会从Slave节点中选择一个节点作为Master,并修改它们的配置文件,使其他的Slave指向新的Master。
当原先宕机的Master节点重新启动时,他将不再是Master,而是作为新Master的一个Slave节点存在。
哨兵节点是一个特殊的Redis节点(不存储数据),本质上也是一个进程,所以也有挂掉的可能,所以哨兵也存在集群模式。
哨兵模式工作原理:
每隔10秒,每个哨兵节点会向Master和Slave节点发送info命令获取最新的拓扑结构。
每隔1秒,每个哨兵节点会向Master和Slave节点还有其它哨兵节点发送ping命令做心跳检测,看看是否存在不可达的节点。
主观下线,如果某个哨兵向一个节点发出的心跳检测没有得到响应,那么该哨兵认为该节点已经下线。
客观下线,当哨兵主观下线的节点是主节点时,哨兵会向其他的哨兵询问对主节点的判断,当下线判断超过一定个数时,那么哨兵会认为主节点确实已经下线,那么会对主节点进行客观下线的判定。
故障转移,当Master节点客观下线时,哨兵会从Slave节点中选择一个节点作为Master节点,选择规则是选择与主节点复制相似度最高的节点,选择完成后会将其余的Slave节点指向新的Master节点,并监控原来的Master节点,当它回复后作为新Master节点的Slave存在,并且同步新Master节点的数据。
选举领导者哨兵节点:当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。
当使用sentinel模式的时候,客户端不用直接连接Redis,而是连接哨兵的ip和port,由哨兵来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,哨兵就会感知并将新的master节点提供给使用者。

Cluster模式
在上文的哨兵模式中,哨兵引入了主节点的自动故障转移,进一步提高了Redis的高可用性。但是哨兵的缺陷同样很明显:哨兵无法对Slave进行自动故障转移,在读写分离场景下,Slave故障会导致读服务不可用,需要我们对Slave做额外的监控、切换操作。
此外,哨兵仍然没有解决写操作无法负载均衡、及存储能力受到单机限制的问题。
Redis Cluster模式是Redis3.0之后推荐的一种解决方案,其是由多个主节点群组成的分布式服务器群,它具有复制、高可用和分片的特性。另外,Redis Cluster集群不需要哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置为集群模式,这种集群模式没有中心节点,可水平扩展,且集群配置非常简单。
Cluster集群模式工作特点:
多个Redis节点互联,数据共享。
所有的节点都是主从模式,其中Slave不提供服务,只提供备用。
不支持同时处理多个Key,因为需要分发到多个节点上。
支持在线增加、删除节点。
客户端可以连接任何一个Master节点进行读写。
Cluster集群模式工作原理:
Redis Cluster有固定的16384个hash slot(槽),对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot。每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot,在redis cluster写入数据的时候。
其实是你可以将请求发送到任意一个master上去执行。但是,每个master都会计算这个key对应的CRC16值,然后对16384个hashslot取模,找到key对应的hashslot,找到hashslot对应的master。
主观下线(pfail):集群中的每个节点都会定期向其他节点发送ping消息,如果在一段时间内一直通信失败,则发送节点方认为接收节点存在故障,把接收节点标为主观下线(pfail)状态。
客观下线(fail):当某个节点判断另一个节点主观下线后,相应的节点状态就会在集群中进行传播,如果集群中所有节点都将它标为主观下线,那么该节点为客观下线,并通知该节点的Slave进行故障转移操作。
故障转移:在某个节点客观下线后,该节点的从节点开始故障转移流程,首先进行资格检查,每个从节点检查与主节点的断开时间,超过一定时间的取消选举资格,然后同样在所有从节点中寻找复制偏移量最大的节点先开始进行选举,只有持有槽的主节点才有投票权,当从节点收集到过半的票数时,即晋升为Master,随即通知Slave当前Master变为自己。

搭建Redis集群
上文中说了三种Redis搭建的模式,分别是主从模式、哨兵模式、Cluster模式,关于前两种网上有着非常多的教程,这里就不再重新演示了,这里着重演示一下如何去搭建一个Redis Cluster集群。
环境准备
CentOS 7,Redis5.0.4
场景描述
本次会启动三台CentOS 7服务器,每台服务器上搭载三个Redis实例,一主二从,一共三个Master实例,六个Slave实例。
清单如下:
修改配置文件
熟悉Redis的应该明白,所谓Redis实例,实际上就是一个又一个的配置文件。要在服务器上启动多台不同Redis,实际上就是使用不同的配置文件来启动Redis,所以第一步我们要先对集群中的每一个Redis实例配置不一样的配置文件。
绑定Redis地址
下列三台主机上的配置文件均为Master节点配置文件(修改bind属性)

修改端口号
将端口号修改为自定义的端口号,默认为6379,修改为我们自定义的端口号。

将cluster-enabled 设置为yes,并将cluster-config-file设置为自定义的文件。
这里定义为nodes-端口号.conf

修改集群RDB快照和AOF文件的存放位置
修改dir属性,这里定义为/home/redis-cluster/redis-master/

修改集群密码
修改masterauth属性为Redis(RequirePass)密码。

开启AOF持久化
修改appendonly属性
对六台Slave节点进行同样的修改配置操作
注意:上述指定的文件夹和文件名原则上对于每个redis实例都应该是唯一的,便于区分。