哨兵模式

Posted xufengnian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哨兵模式相关的知识,希望对你有一定的参考价值。

一、哨兵模式

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
View Code

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 意见的情况下, 强制开始一次自动故障迁移。
View Code

 

 

以上是关于哨兵模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis的哨兵模式和集群模式

Spring之redis主从复制(非哨兵模式)

Redis 哨兵模式核心原理

Redis-哨兵模式

Redis详解九(哨兵模式)

Redis哨兵模式搭建(一主二从三哨兵)