Redis的高可用,哨兵机制Sentinel

上一篇聊了Redis的主从复制以及实现原理,下面会在复制的基础上来说说Redis的高可用方案:哨兵机制

哨兵机制

什么是哨兵机制

在主从复制的模式下,主服务器宕机后,从服务器是不能自动转为主服务器的,只能手动进行故障转移

哨兵机制(Sentinel)就是Redis的高可用解决方案,由一个或多个Sentinel实例组成的Sentinel系统用来管理主服务器以及连接的所有从服务器。可以实现故障发现、故障自动转移、配置中心和客户端通知

  • 监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常
  • 提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知
  • 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器

看了上图,我们可以理解哨兵机制就是在复制基础上的一套监管系统,能及时的进行故障转移。那么就先了解下,Redis是如何故障判定和故障转移的

故障判定

故障判定,也就是Sentinel在做的任务,当一个Sentinel启动后会定期的去执行以下的任务

  • 每个Sentinel进程会以每秒一次的频率向已知的主服务器、从服务器以及其他的Sentinel实例发送一个PING命令
  • 每个实例(instance)距离最后一次有效回复PING命令的时间超过down-after-milliseconds选项所指定的值,那么该实例会被标记为主观下线。一个有效回复可以是:+PONG-LOADING或者-MASTERDOWN
  • 如果一个Master主服务器被标记为主观下线,那么监视该主服务器的所有的Sentinel会以每秒一次的频率确认主服务器的确是进入主线下线状态
  • 如果有足够数量的Sentinel(至少达到配置文件指定的数量)在指定时间范围内确认一个Master主服务器为主观下线状态,那么该主服务器被标记为客观下线
  • 一般情况下,每个Sentinel会每10秒一次的频率向已知的主服务器和从服务器发送INFO命令,当一个主服务器被标记为客观下线时,发送INFO命令的频率会改为每秒一次
  • 没有足够数量的Sentinel同意主服务器下线,主服务器的客观下线状态会被移除;当主服务器重新向Sentinel的PING命令返回有效回复,主服务器的主观下线状态就会被移除

主观下线(Subjectively Down,SDOWN)指单个Sentinel实例对服务器做出下线判断

客观下线(Objectively Down,ODOWN)指多个Sentinel实例对服务器做出SDOWN判断, 并且通过 SENTINEL is-master-down-by-addr命令互相交流之后,,得出的服务器下线判断

搭建哨兵实例

准备

我这里是准备了3个虚拟机,1主2从的Redis服务器和3个哨兵实例。官网上是推荐至少部署3个Sentinel实例保证健壮性,具体的地址端口如下

服务 ip port
Redis(master) 192.168.249.20 6379
Redis 192.168.249.21 6379
Redis 192.168.249.22 6379
Sentinel 192.168.249.20 26379
Sentinel 192.168.249.21 26379
Sentinel 192.168.249.22 26379

1主2从的Redis服务的配置如下,修改一下redis.conf文件

# 设置为后台运行
daemonize yes
# 绑定的主机地址,这里注释掉,开放ip连接
#bind 127.0.0.1

# 主服务上可以设置密码
requirepass 123456

在从服务器上添加主服务器的地址信息

# 设置主服务器的地址
# replicaof <masterip> <masterport>
replicaof 192.168.249.20 6379
# 设置主服务器的密码
# masterauth <master-password>
masterauth 123456

3个哨兵的配置都是一样的,可以从Redis的安装目录拷贝一份sentinel.conf,修改内容如下,主要是配置下主服务器的地址

# 设置为后台运行
daemonize yes
logfile "26379.log"
# 设置主服务器的地址,quorum为2表示当有2个或以上的哨兵认为主服务器不可用时,才进行故障转移操作
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.249.20 6379 2
# 设置服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

# 指定了 Sentinel 认为服务器已经断线所需的毫秒数
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 指定了在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小,完成故障转移所需的时间就越长。但是如果这个数字越大,就意味着越多的slave因为replication而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态
# sentinel parallel-syncs <master-name> <numreplicas>
sentinel parallel-syncs mymaster 1
# 指定故障转移超时时间
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

Sentinel可用通过Redis实例的发布/订阅功能自动发现同样在监控主服务器的其他Sentinel,以及可以通过主服务器获取其他从服务器的信息,所以我们只需配置主服务器的地址即可

启动

启动顺序分别是:主服务器,从服务器,然后是3个哨兵进程

启动Redis服务

./redis-server ../redis.conf

Sentinel其实也是一个Redis服务,可以看做一个特殊模式的Redis服务,启动的命令有两种

./redis-server ../sentinel.conf --sentinel

./redis-sentinel ../sentinel.conf

这两种方式启动哨兵的效果都是一样的,在启动运行时必须要使用配置文件,因为系统需要这个文件来保存当前状态,以便重启时加载

查看主机状态

我们可以用客户端连接哨兵,使用sentinel master <master-name>查看其监视的主服务器的状态

$ ./redis-cli -h 192.168.249.20 -p 26379
192.168.249.20:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.249.20"
 5) "port"
 6) "6379"
 7) "runid"
 8) "2a58b746fe9c963e69887efbc877aa3143eb6ec6"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "167"
19) "last-ping-reply"
20) "167"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "2941"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "2006632"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"

我们看到关于主服务器的一些监控信息

num-slaves为从服务器的数量;num-other-sentinels其他哨兵的数量;flags标记为master,当主机掉线了,会变为s_down或o_down

另外,想查看其他从服务器和其他哨兵的状态,可以用以下的命令

sentinel slaves <master-name>
sentinel sentinels <master-name>

故障转移

我们可以手动模拟一下,当主服务器挂了,故障故障转移情况。

想要获取当前主服务器的地址信息,客户端可以使用sentinel get-master-addr-by-name <master-name>命令

192.168.249.20:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.249.20"
2) "6379"

可以看到当前的主服务地址为192.168.249.20,这是我们手动关闭该服务,或者使用以下命令让服务器睡眠40秒

$ ./redis-cli -h 192.168.249.20  -p 6379
192.168.249.20:6379> auth 123456
OK
192.168.249.20:6379> debug sleep 40
OK
(40.01s)

这个时候我们再次查看主服务的地址时,应该是可以看到不同信息

192.168.249.20:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.249.22"
2) "6379"
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容