redis Sentinel搭建及工作原理

redis 服务
主 192.168.77.128  6379    备   192.168.77.129  16379
主 192.168.77.129  6379    备   192.168.77.128  16379   192.168.77.130  16379
参考主从配置:http://blog.csdn.net/convict_eva/article/details/67637033

查看主服务的备机配置:
$./redis/src/redis-cli -h 192.168.77.128 -p 6379 info replication

# Replication
role:master
connected_slaves:2
slave0:ip=192.168.77.129,port=16379,state=online,offset=127,lag=0
slave1:ip=192.168.77.130,port=16379,state=online,offset=127,lag=0
master_repl_offset:127
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:126
$ ./redis/src/redis-cli -h 192.168.77.129 -p 6379 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.77.128,port=16379,state=online,offset=785,lag=0
master_repl_offset:785
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:784

sentinel 服务

192.168.77.130  端口 26379
192.168.77.131  端口 36379

下载2.8.0 版本(主要是使用sentinel,文章后面有其它获取方式):
$wget http://download.redis.io/releases/redis-2.8.0.tar.gz
解压,make

sentinel配置
sentinel26379.conf

daemonize yes  
logfile  /home/jamin/redis/log-sentine26379.log  
port 26379
dir /home/jamin/redis/tmp 
sentinel monitor mymaster128 192.168.77.128 6379 2
sentinel down-after-milliseconds mymaster128  10000
sentinel failover-timeout mymaster128  180000
sentinel parallel-syncs mymaster128 1

sentinel monitor mymaster129 192.168.77.129 6379 2
sentinel down-after-milliseconds mymaster129  10000
sentinel failover-timeout mymaster129  180000
sentinel parallel-syncs mymaster129 1
sentinel36379.conf
daemonize yes  
logfile  /home/jamin/redis/log-sentine36379.log  
port 36379
dir /home/jamin/redis/tmp2 
sentinel monitor mymaster128 192.168.77.128 6379 2
sentinel down-after-milliseconds mymaster128  10000
sentinel failover-timeout mymaster128  180000
sentinel parallel-syncs mymaster128 1

sentinel monitor mymaster129 192.168.77.129 6379 2
sentinel down-after-milliseconds mymaster129  10000
sentinel failover-timeout mymaster129  180000
sentinel parallel-syncs mymaster129 1
注:启动后sentinel.conf  也会被修改,最好都要备份一下。

启动sentinal,有两种方式:
1、对于 redis-sentinel 程序, 你可以用以下命令来启动 Sentinel 系统:
redis-sentinel sentinel.conf
注:sentinel.conf 要写全路径
2、对于 redis-server 程序, 你可以用以下命令来启动一个运行在 Sentinel 模式下的 Redis 服务器:
redis-server /path/to/sentinel.conf --sentinel

查看日志sentinal 启动日志:
log-sentinel26379.log 

[17158] 13 Apr 19:15:49.998 # Sentinel runid is fb26b98104ed64cb521918caccfb737f10c7380a
[17158] 13 Apr 19:15:49.999 * +slave slave 192.168.77.128:16379 192.168.77.128 16379 @ mymaster129 192.168.77.129 6379
[17158] 13 Apr 19:15:49.999 * +slave slave 192.168.77.129:16379 192.168.77.129 16379 @ mymaster128 192.168.77.128 6379
[17158] 13 Apr 19:15:49.999 * +slave slave 192.168.77.130:16379 192.168.77.130 16379 @ mymaster128 192.168.77.128 6379
[17158] 13 Apr 19:15:52.045 * +sentinel sentinel 192.168.77.131:36379 192.168.77.130 36379 @ mymaster128 192.168.77.128 6379
[17158] 13 Apr 19:15:52.049 * +sentinel sentinel 192.168.77.131:36379 192.168.77.130 36379 @ mymaster129 192.168.77.129 6379
log-sentinel36379.log
[17166] 13 Apr 19:15:50.028 # Sentinel runid is b92d468cd2d2f77f7682022863d6f7b6181bab17
[17166] 13 Apr 19:15:50.029 * +slave slave 192.168.77.128:16379 192.168.77.128 16379 @ mymaster129 192.168.77.129 6379
[17166] 13 Apr 19:15:50.029 * +slave slave 192.168.77.129:16379 192.168.77.129 16379 @ mymaster128 192.168.77.128 6379
[17166] 13 Apr 19:15:50.029 * +slave slave 192.168.77.130:16379 192.168.77.130 16379 @ mymaster128 192.168.77.128 6379
[17166] 13 Apr 19:15:52.027 * +sentinel sentinel 192.168.77.130:26379 192.168.77.130 26379 @ mymaster129 192.168.77.129 6379
[17166] 13 Apr 19:15:52.031 * +sentinel sentinel 192.168.77.130:26379 192.168.77.130 26379 @ mymaster128 192.168.77.128 6379
日志中可以看到主服务的slave信息 ,和两个sentinel 也相互添加了监控


查看sentinel监控的redis服务 信息
$./redis/src/redis-cli -h 192.168.77.130 -p 26379 info sentinel

# Sentinel
sentinel_masters:2
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster129,status=ok,address=192.168.77.129:6379,slaves=1,sentinels=2
master1:name=mymaster128,status=ok,address=192.168.77.128:6379,slaves=2,sentinels=2
查看sentinel 监控的redis 主服务的备机信息:
$./redis/src/redis-cli -h 192.168.77.130 -p 26379 sentinel slaves mymaster128

1)  1) "name"
    2) "192.168.77.130:16379"
    3) "ip"
    4) "192.168.77.130"
    5) "port"
    6) "16379"
    7) "runid"
    8) "460bb6b42fd8e13d36aa3b03ad8213f39ddb0718"
    9) "flags"
   10) "slave"
   11) "pending-commands"
   12) "0"
   13) "last-ok-ping-reply"
   14) "139"
   15) "last-ping-reply"
   16) "139"
   17) "info-refresh"
   18) "8673"
   19) "role-reported"
   20) "slave"
   21) "role-reported-time"
   22) "270140"
   23) "master-link-down-time"
   24) "0"
   25) "master-link-status"
   26) "ok"
   27) "master-host"
   28) "192.168.77.128"
   29) "master-port"
   30) "6379"
   31) "slave-priority"
   32) "100"
   33) "slave-repl-offset"
   34) "72636"
2)  1) "name"
    2) "192.168.77.129:16379"
    3) "ip"
    4) "192.168.77.129"
    5) "port"
    6) "16379"
    7) "runid"
    8) "206eb3adf27183fd3e03b13eef377e1e76182b8d"
    9) "flags"
   10) "slave"
   11) "pending-commands"
   12) "0"
   13) "last-ok-ping-reply"
   14) "139"
   15) "last-ping-reply"
   16) "139"
   17) "info-refresh"
   18) "8672"
   19) "role-reported"
   20) "slave"
   21) "role-reported-time"
   22) "270140"
   23) "master-link-down-time"
   24) "0"
   25) "master-link-status"
   26) "ok"
   27) "master-host"
   28) "192.168.77.128"
   29) "master-port"
   30) "6379"
   31) "slave-priority"
   32) "100"
   33) "slave-repl-offset"
   34) "72636"
可以看出有两个备机信息
测试:
1、停掉192.168.77.128:6379 的主服务
查看sentinel 日志信息,选举过程:
[6409] 13 Apr 19:53:13.707 # +sdown master mymaster128 192.168.77.128 6379
[6409] 13 Apr 19:53:13.935 # +new-epoch 1
[6409] 13 Apr 19:53:13.936 # +vote-for-leader 9936e2269a9b4d38116bb5efd3287bbb2aff3bdb 1
[6409] 13 Apr 19:53:14.855 # +odown master mymaster128 192.168.77.128 6379 #quorum 3/2
[6409] 13 Apr 19:53:16.364 # +switch-master mymaster128 192.168.77.128 6379 192.168.77.129 16379
[6409] 13 Apr 19:53:16.365 * +slave slave 192.168.77.130:16379 192.168.77.130 16379 @ mymaster128 192.168.77.129 16379
[6409] 13 Apr 19:53:16.368 * +slave slave 192.168.77.128:6379 192.168.77.128 6379 @ mymaster128 192.168.77.129 16379
[6409] 13 Apr 19:53:26.394 # +sdown slave 192.168.77.128:6379 192.168.77.128 6379 @ mymaster128 192.168.77.129 16379
查看192.168.77.130 16379 redis.conf 可以看到redis.conf 关于slaveof 配置已经被修改了。
查看sentinel监控的redis服务信息(./redis/src/redis-cli -h 192.168.77.130 -p 26379 info sentinel),mymaster128 的主服务已经被切换:
# Sentinel
sentinel_masters:2
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster128,status=ok,address=192.168.77.130:16379,slaves=2,sentinels=2
master1:name=mymaster129,status=ok,address=192.168.77.129:6379,slaves=1,sentinels=2
2、启动192.168.77.128 6379,查看sentinel 日志如下:
[6409] 13 Apr 19:58:00.230 # -sdown slave 192.168.77.128:6379 192.168.77.128 6379 @ mymaster128 192.168.77.129 16379

此时192.168.77.128 6379 redis.conf 配置被加上了一条slaveof 配置:
# Generated by CONFIG REWRITE
slaveof 192.168.77.129 16379

注:
1、多个sentinel 要公布在不同机器上,如果在同一机器认为是一个sentinel,主备就会切换失败(failover-abort-not-elected)。一个主数据库可以被多个sentinel 监控,一个sentinel可以监控多个主数据库,这样就形成一个网结构。
2、获取 Sentinel
目前 Sentinel 系统是 Redis 的 unstable 分支的一部分, 你必须到 Redis 项目的 Github 页面 克隆一份 unstable 分值, 然后通过编译来获得 Sentinel 系统。
Sentinel 程序可以在编译后的 src 文档中发现, 它是一个命名为 redis-sentinel 的程序。
你也可以通过下一节介绍的方法, 让 redis-server 程序运行在 Sentinel 模式之下。
另外, 一个新版本的 Sentinel 已经包含在了 Redis 2.8.0 版本的释出文件中。

工作原理:

哨兵监听配置如下:
sentinel monitor mymaster128 192.168.77.128 6379  2      
配置有:主节点名称,ip,端口,后面数字2(quorum)意思是当主节点下线要有多少个哨兵节点同意。


哨兵启动后,会与要监控的主数据建立两条连接,这两条连接的建立方式不慌不忙普通的Redis客户端一样。其中一条连接用来订阅主数据的_sentinel_:hello频道以获取其它同样监控该数据库的哨兵节点信息,另外哨兵也需要定期向主数据库发送INFO 等命令获取主数据库本身的信息。加为当客户端的连接进入到订阅模式时就不能再执行其它命令了,所有要两条连接。
和主数据库建立连接后,哨兵定时执行下面3个操作
1、每10秒哨兵会向主数据库和从数据库发送INFO 命令。
作用:获得当前数据库的相关信息(运行id,复制信息等)从而实现新节点的自动发现。启动后,哨兵向主数据库发送INFO 命令,通过解析返回的数据来得知从数据库列表,而后对每个从数据库同样建立这两个连接(和主数据库的两个连接完全一致,这样就可以监控从数据库的从数据库了)。
2、每2秒哨兵会向主数据库和从数据库和_sentinel_:hello 频道发送自己的信息。
作用:所有监控主数据库的哨兵都会往_sentinel_:hello 频道发送哨兵的信息,结构如下:
<哨兵地址>,<哨兵端口>,<哨兵运行id>,<哨兵配置版本>,<主数据库名字>,<主数据库地址>,<和数据库端口>,<主数据库配置版本>
哨兵会订阅监控的主数据库_sentinel_:hello 频道消息,当接收到其他哨兵向监控的主数据库sentinel_:hello 频道发送消息时,会判断发消息的哨兵是不是新发现的哨兵,如果是则将其加入已发现的哨兵列表中并创建一个到其的连接(只是用来发送PING命令)。同时哨兵会判断信息中的主数据库的配置版本,该版本比当前记录的主数据库的版本高,则更新主数据库的数据。

3、每1秒哨兵会向主主数据库,从数据库和其它哨兵节点发送PING 命令。
作用:通过上面INFO 命令和 _sentinel_:hello 频道,哨兵自动发现从数据库和其他哨兵的节点。再要做的就是定时监控这些数据库和哨兵节点有没有停止服务,通过每隔一定时间向这个节点发送PING 命令实现的。时间间隔配置:
sentinel down-after-milliseconds mymaster128  10000
当down-after-milliseconds 配置小于1秒时使用这个配置的时间,如果大于1秒则PING 时间间隔为1秒。 
超过down-after-milliseconds 指定时间后,当被PING 的数据库或者哨兵节点没有回复,则哨兵认为是“主观下线”,主观下线表示从当前哨兵进程来看,该节点(哨兵或者是数据库)已经下线。如果节点是主数据库,则哨兵会进一步判断是否需要对其进行故障恢复:哨兵发送SENTINEL is-master-down-by-addr 命令询问其他哨兵节点是否也认为该主数据库结点下线,如果达到指定数量(quorum:哨兵监听配置时最后一个数值配置)时,哨兵会认为其“客观下线”,并选举领头哨兵节点对主从系统发起故障恢复。

选举领头哨兵(Raft 算法):
1)发现主数据库客观下线的哨兵节点A,向每个哨兵节点发送命令,要求对方选自己成为领头哨兵
2)如果目标哨兵节点没有选过其它哨兵结点,则同意节点A 设置为领头哨兵
3)如果节点A 发现有超过半数且超过quorum 参数值的哨兵节点同意选自己成为领头哨兵,则将A 设置为领头哨兵。
4)当有多个哨兵节点同时参选领头哨兵,则会出现没有任何结点当选的可能,此时每个参选节点将等待一个随机时间重新发起参选请求,进行下一轮选举,直到选举成功。

领头哨兵选举完,下面就是由领头哨兵开始对主数据库进行故障恢复。步骤如下:
1)所有在线的从数据库中,选择优先级最高的从数据库。优先级可以通过 slave-priority 配置
2)如果有多个优先级一样的从数据库,则复制的命令偏移量(主从复制)越大越优先。
3)如果以上条件都一样,则选择运行ID 较小的从数据库。
选择一个从数据库后,领头哨兵将向从数据库发送 slaveof no one 命令,使其升格为主数据库,而后领头哨兵向其它从数据库发送 slaveof 命令,使其成为新主数据库。最后一步则是更新内部的记录,将已经停止的旧的主数据库更新为主数据库的从数据库,使得当其恢复时自动以从数据库的身份继续服务。

哨兵只是管理主从的,主从自动切换。并没有实现数据分片,数据分片要客户端来做。

参考:
http://www.redis.cn/topics/sentinel.html

java 客户端

jdis sentinel 实现高可用
https://github.com/warmbreeze/sharded-jedis-sentinel-pool





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值