一、哨兵模式
1.主要功能
哨兵主要功能有两点:
a、监控所有节点数据库是否在正常运行。
b、master数据库出现故障时,可以自动通过投票机制,从slave节点中选举新的master,实现将从数据库转换为主数据库的自动切换。
Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
Redis的哨兵系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
a、监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
b、提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
c、自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
2.工作方式
1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个PING命令。
2)如果一个实例(instance)距离最后一次有效回复PING命令的时间超过 own-after-milliseconds 选项所指定的值,则这个实例会被Sentinel标记为主观下线。
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4)当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
5)在一般情况下,每个Sentinel 会以每10秒一次的频率向它已知的所有Master,Slave发送 INFO 命令。
6)当Master被Sentinel标记为客观下线时,Sentinel 向下线的 Master 的所有Slave发送 INFO命令的频率会从10秒一次改为每秒一次。
7)若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。 若 Master重新向Sentinel 的PING命令返回有效回复,Master的主观下线状态就会被移除。
主观下线
哨兵(Sentinel)节点会每秒一次的频率向建立了命令连接的实例发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN)以外的响应,哨兵就会将该实例在本结构体中的状态标记为SRI_S_DOWN主观下线
客观下线
当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRI_O_DOWN客观下线
3.优缺点
优点:高可用,在主节点故障时能实现故障的转移
缺点:
1)好像没办法做到水平拓展,如果内容很大的情况下。
2)主从服务器的数据要经常进行主从复制,这样造成性能下降。
3)当主服务器宕机后,从服务器切换成主服务器的那段时间,服务是不能用的。
二、哨兵模式的读写分离
哨兵模式下,客户端一般会保持两种连接,与哨兵的连接,以及master的连接。数据操作当然使用master连接,如果master出故障了,可以通过与哨兵的连接来获取master的最新地址。
一般的客户端连接流程如下:
1.连接哨兵,根据master的名称获取master的ip和port。
2.通过ip和port连接master。
另外,有一些公司自己封装了redis客户端,可以通过哨兵获得master及其slaves,采用读写分离,读slaves,写master。
三、搭建哨兵模式
需要先有主从环境,前面已经搭配了1主2从的主从环境。
1.sentinel搭建过程
mkdir /data/26380 cd /data/26380 vim sentinel.conf port 26380 dir "/data/26380" sentinel monitor mymaster 127.0.0.1 6380 1 #1表示sentinel个数,当有超大型redis集群,有多个sentinel的时候,有1个sentinel认为某个redis master宕机了,则表示它宕机了,切换主从 sentinel down-after-milliseconds mymaster 5000 #主库宕机5000毫秒,开始切换 sentinel auth-pass mymaster 123456 启动: [root@db01 26380]# redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log & 如果有问题: 1)重新准备1主2从环境 2)kill掉sentinel进程 3)删除sentinel目录下的所有文件 4)重新搭建sentinel
2.搭建完成后,测试
redis-cli -p 6380 -a 123456 shutdown redis-cli -p 6381 -a 123456 info replication 启动源主库(6380),看状态。 redis-server /data/6380/redis.conf redis-cli -p 6380 -a 123456 info replication Sentinel管理命令: redis-cli -p 26380 PING :返回 PONG 。 SENTINEL masters :列出所有被监视的主服务器 SENTINEL slaves <master name> SENTINEL get-master-addr-by-name <master name> : 返回给定名字的主服务器的 IP 地址和端口号。 SENTINEL reset <pattern> : 重置所有名字和给定模式 pattern 相匹配的主服务器。 SENTINEL failover <master name> : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。