redis Sentinel搭建及工作原理

    xiaoxiao2021-04-18  79

    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 1sentinel36379.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 6379log-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=22、启动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

    转载请注明原文地址: https://ju.6miu.com/read-675581.html

    最新回复(0)