赞
踩
Reids的主从复制,是通过手动切换主从服务器,人工干预,费时费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式,sentinel是redis高可用的解决方案,它能够后台监控主机是否故障,当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。。Redis从2.8开始正式提供了Sentinel(哨兵)架构来解决这个问题。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
哨兵的作用:
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此我们使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为服务器不可用,这个现象称为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover(故障转移)操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的服务器实现切换主机,这个过程称为客观下线。
进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
master心跳:
指令:PING
周期:由repl-ping-slave-period决定,默认10秒
作用:判断slave是否在线
查询:INFO replication 获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
slave心跳任务:
指令:REPLCONF ACK {offset}
周期:1秒
作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
作用2:判断master是否在线
主观下线(SDOWN) 指的是单个Sentinel实例对服务器做出的下线判断,即单个sentinel认为某个服务下线(有可能是接收不到订阅,之间的网络不通等等原因)。
主观下线就是说如果服务器在down-after-milliseconds给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(SDOWN )。
sentinel会以每秒一次的频率向所有与其建立了命令连接的实例(master,从服务,其他sentinel)发ping命令,通过判断ping回复是有效回复,还是无效回复来判断实例时候在线(对该sentinel来说是“主观在线”)。
sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度,如果实例在down-after-milliseconds毫秒内,返回的都是无效回复,那么sentinel回认为该实例已(主观)下线,修改其flags状态为SRI_S_DOWN。如果多个sentinel监视一个服务,有可能存在多个sentinel的down-after-milliseconds配置不同,这个在实际生产中要注意。
客观下线( ODOWN) 指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断,然后开启failover。
客观下线就是说只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线。
只有当master被认定为客观下线时,才会发生故障迁移。
当sentinel监视的某个服务主观下线后,sentinel会询问其它监视该服务的sentinel,看它们是否也认为该服务主观下线,接收到足够数量(这个值可以配置)的sentinel判断为主观下线,既任务该服务客观下线,并对其做故障转移操作。
客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。
Redis 2.8版开始正式提供名为Sentinel的主从切换方案,通俗的来讲,Sentinel可以用来管理多个Redis服务器实例,可以实现一个功能上实现HA的集群,Sentinel主要负责三个方面的任务:
当一个sentinel准备好了要进行failover(故障转移),并且收到了其他sentinel的授权,那么就需要选举出一个合适的slave来做为新的master。
slave的选举主要会评估slave的以下几个方面:
1)与master断开连接的次数
2)Slave的优先级
3)数据复制的下标(用来评估slave当前拥有多少master的数据)
4)进程ID
以下是哨兵模式完整配置。
//sentinel.conf
//启动哨兵进程端口(默认26379) ,如果有哨兵集群,则需要给每个哨兵配置端口
port 26379
//哨兵进程服务临时文件夹,默认为/tmp,要保证有可写入的权限
dir /tmp
/*
指定哨兵监控的主节点
master-name:由自己命名的主节点名字只能由字母A-z、数字0-9、这三个字符".-_"组成。
quorum:配置哨兵认为主节点客观上失联的个数
格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
*/
sentinel monitor mymaster 127.0.0.1 6379 2
/*
当在Redis实例中开启了requirepass foobared授权密码这样所有连接Redis实例的客户端都要提供密码
设置哨兵sentinel 连接主从的密码注意必须为主从设置一样的验证密码
格式:sentinel auth-pass <master-name> <password>
*/
sentinel auth-pass mymaster root
/*
指定多少毫秒之后主节点没有应答哨兵sentinel此时哨兵主观上认为主节点下线(默认30秒)
格式:sentinel down-after-milliseconds <master-name> <mi17iseconds>
*/
sentine1 down-after-milliseconds mymaster 30000
/*
发生failover(故障转移)主备切换时最多可以有多少个slave同时对新的master进行同步
格式:sentine1 parallel-syncs <master-name> <numslaves>
*/
sentinel parallel-syncs mymaster 1
/*
指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
格式:sentinel failover-timeout <master-name> <milliseconds>
*/
sentinel failover-timeout mymaster 180000
/*
指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,比较常用
格式:sentinel notification-script <master-name> <script-path>
*/
sentinel notification-script mymaster /var/redis/notify.sh
/*
客户端重新配置主节点参数脚本,通知相关的客户端关于master地址已经发生改变的信息
格式:sentinel client-reconfig-script <master-name> <script-path>
*/
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
指定多少毫秒之后主节点没有应答哨兵sentinel此时哨兵主观上认为主节点下线(默认30秒),当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover,此时哨兵会重写Redis的哨兵配置文件,以适应新场景的需要。
这个配置项指定了在发生failover(故障转移)主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的s1ave因为replication而不可用。可以通过将这个值设为1来保证每次只有一个slave 处于不能处理命令请求的状态。
故障转移的超时时间failover-timeout可以用在以下这些方面:
配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
对于脚本的运行结果有以下规则;
通知型脚本:当sentine1有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentine1.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentine1无法正常启动成功。
当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
以下参数将会在调用脚本时传给脚本:
<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
这个脚本应该是通用的,能被多次调用,不是针对性的。
前面有讲到,哨兵模式是一个独立的进程,所以需要手动开启该进程,找到redis-sentinel可执行文件,使用:
redis-sentinel 配置文件
启动哨兵模式
值得注意的是,如果在启动时master下有salve,则将其显示出来,如上图。
对主机使用shutdown
命令使其关机。
如果主节点断开了,哨兵模式就会利用算法,计算出下一个主节点,等待几秒后,等到哨兵给主机发送命令,检测到主机异常,便会自动切换分支。
分析其打印出的日志,可以发现其自动对6382(master)进行了故障转移,让6381(salve)变为了master,使用info replication查看,其确实为主机。
那么,此时就出现了一个问题。当原来的master重新连接后,它会重新成为master还是降为salve呢?我们接着往下看。
神奇的一幕发生了,等原本master连接回来之后,其变为了现任master的salve。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。