一、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,并且只有在至少 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的删除