首页 > 代码库 > redis应用之使用sentinel实现主从复制高可用

redis应用之使用sentinel实现主从复制高可用

一、redis的高可用管理工具sentinel介绍

sentinel是一个管理redis实例的工具,它可以实现对redis的监控、通知、自动故障转移。sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redis的状态,

如果redis master不能工作,则会自动启动故障转移进程,将其中的一个slave提升(通过选举)为master,其他的slave重新设置新的master服务器。而故障的master再次启动后

会被sentinel自动降级为slave服务器加入到集群中。

redis主从的特点:

1、redis使用异步复制,从服务器会以每秒一次的频率向主服务器报告复制流的处理进度

2、一个主服务器可以有多个从服务器,从服务器也可以有自己的从服务器(级联复制)

3、复制功能不会阻塞主服务器,即使一个或多个从服务器正在进行初次同步,主服务器也可以继续处理命令请求

4、复制功能可以用于数据冗余,也可以通过让多个从服务器处理只读命令请求来提升扩展性

5、Redis从节点默认为只读,无须手动配置

redis的主从集群可以实现分担压力的效果,但是无法做到高可用,如果master宕掉,服务就不可用了,所以使用redis的sentinel可以实现HA的功能:

sentinel作用如下:

1、监控:sentinel会不断的检查你的主服务器和从服务器是否运行正常

2、当被监控的某个redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发送通知

3、自动故障转移:当一个主服务器不能正常工作时,sentinel会开始一次自动故障转移操作,他会将其中一个从服务器升级为新的主服务器,并将其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

redis sentinel在监控redis实例时有两种redis宕机状态S_DOWN和O_DOWN:

S_DOWN:当sentinel在指定的超时时间内没有收到一个正确的ping回复值,则认为是S_DOWN

O_DOWN:O_DOWN的条件是有足够多的sentinel认为该redis实例是S_DOWN。

注意:O_DOWN只能是发生在主服务器,sentinel和其他从服务器不会发生O_DOWN

二、开始安装配置主从高可用

1、环境架构:rhel6 or centos 6  ip:10.48.194.252 (若在不同机器上部署的话,都需要在机器上安装sentinel)

master_port:6379

slave_port:6380

slave_port:6381

sentinel_port:26379

sentinel_port:26479

本人是在一台机器上开多个实例,在不同机器中也可以。原理一样,这里不在复述

架构说明:

a、如果主节点修复后再上线,就会变成从节点。

b、客户端程序连接时,应该连接sentinel节点

2、在三台redis上配置sentinel

先介绍一下sentinel.conf配置文件中常用的参数,如下:

port 26379          #sentinel的端口
dir /tmp          #工作目录
sentinel monitor mymaster 127.0.0.1 6379 2 
#mymaster是自定义的名称,ip地址是master的ip,6379为master的redis-server端口
#2是quorum,表示sentinel确认一个Master为O_DOWN状态至少需要多少个哨兵同意(此值要小于等于集群中slave的个数)
英文翻译过来是:告诉Sentinel监视这个master,并且只有在至少<quorum> sentinels同意的情况下才考虑它是O_DOWN(客观宕掉)状态。
sentinel down-after-milliseconds mymaster 30000  #mymaster多久不响应认为SDOWN,单位是毫秒
sentinel parallel-syncs mymaster 1         #指定最大同时同步新maser配置的slave数量,官方提示用较低的数字,一般为1
数字越小,故障转移过程完成所需的时间就越多,如果全部从服务器一起对新的主服务器进行同步,那么就可能会造成所有从服务器在短时间内全部不可用的情况出现。
sentinel failover-timeout mymaster 180000     #2次failover切换时间,如果第一次没有failover成功,过多长时间再次failover
注意:无论你设置要多少个Sentinel同意才能判断一个服务器失效,一个Sentinel都需要获得系统中多数(majority)Sentinel的支持,才能发起一次自动故障迁移,
并预留一个给定的配置纪元(configuration Epoch,一个配置纪元就是一个新主服务器配置的版本号)。换句话说,在只有少数(minority)Sentinel 进程正常运作的情况下,
Sentinel 是不能执行自动故障迁移的!

sentinel :port 26379 配置文件如下:

cat sentinel_26379.conf

port 26379

daemonize yes

logfile "/var/log/redis/sentinel_26379.log"

protected-mode no   (这是redis-3.2版本的新特性,改为no即可)

#master-1

sentinel monitor master-1 10.48.194.252 6379 2  (指向master服务器或端口)

sentinel auth-pass master-1 passwd

sentinel parallel-syncs master-1 1

sentinel down-after-milliseconds master-1 5000

sentinel failover-timeout master-1 18000

sentinel :port 26479 配置文件如下:
cat sentinel_26479.conf

port 26479

daemonize yes

logfile "/var/log/redis/sentinel_26479.log"

protected-mode no

#master-1

sentinel monitor master-1 10.48.194.252 6379 2

sentinel auth-pass master-1 passwd

sentinel down-after-milliseconds master-1 5000

sentinel failover-timeout master-1 18000

sentinel parallel-syncs master-1 1


redis_master_6379.conf 配置主要参数如下:

bind 10.48.194.252 127.0.0.1

protected-mode no

port 6379

requirepass passwd

masterauth passwd

redis_slave_6380.conf 配置主要参数如下:

protected-mode no

port 6380

daemonize yes

requirepass "passwd"

masterauth "passwd"

slaveof 10.48.194.252 6379

redis_slave_6381.conf 配置主要参数如下:

protected-mode no

port 6381

daemonize yes

requirepass "passwd"

masterauth "passwd"

slaveof 10.48.194.252 6379


按如下顺序依次启动服务:

redis-server  redis_master_6379.conf

redis-server  redis_slave_6380.conf

redis-server  redis_slave_6381.conf

redis-sentinel sentinel_26379.conf

redis-sentinel sentinel_26479.conf


查看进程是否都已经启动:

ps aux | grep redis | grep -v grep

root       5485  0.0  0.4 135480  9712 ?        Ssl  Nov01   0:51 redis-server *:6380               

root       5491  0.0  0.3 133432  7644 ?        Ssl  Nov01   0:52 redis-server *:6381               

root       6084  0.0  0.3 133432  7668 ?        Ssl  01:25   0:08 redis-sentinel *:26379 [sentinel] 

root       6088  0.0  0.3 133432  7664 ?        Ssl  01:25   0:08 redis-sentinel *:26479 [sentinel] 

root       6376  0.3  0.3 133432  7648 ?        Ssl  04:44   0:00 redis-server 10.48.194.252:6379 

查看master的状态

redis-cli -h 127.0.0.1 -p 6379 -a passwd

技术分享

查看slave的状态:

redis-cli -h 127.0.0.1 -p 6380 -a passwd

技术分享


查看sentinel状态:

redis-cli -h 127.0.0.1 -p 26379 -a passwd

技术分享

验证redis sentinel 主从切换

1、首先关闭 master 服务(6379)

技术分享查看哨兵,发现端口号为6380的从服务变成了主服务,sentinel自动完成了故障切换。

技术分享

再次启动redis-server redis_master_6379.conf

启动刚才被shutdown的6379服务并查看,发现它变成了从服务

技术分享

80又变成了主

技术分享

若想手动把从边成主,需要在6379里的配置文件中把slaveof 指向 6380的删除

redis应用之使用sentinel实现主从复制高可用