Sentinel是Redis官方提供的高可用解决方案。 在互联网线上环境中可以使用 Sentinel做redis自动故障转移,实现自动化运维功能。并且, Sentinel能够给客户端提供了监控消息的通知,从而客户端就可以根据接收的信息去判断服务器的状态,去做相应的连接配置变化。
图 1
1.监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
启动后Sentinel会:
以10秒一次的频率,向被监视的master发送info命令,根据回复获取master当前信息。
以1秒一次的频率,向所有redis服务器、包含sentinel在内发送PING命令,通过回复判断服务器是否在线。
以2秒一次的频率,通过向所有被监视的master,slave服务器发送包含当前sentinel,master信息的消息。
根据以上回复消息,如图2,sentinel会维护一个数据字典,数据字典里记录了包括主服务信息、从服务器信息、其他sentinel信息等。
图 2
2.自动故障迁移(Automatic failover):如图1, 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
需要指出来的是有多sentinel的系统,sentinel系统会通过投票,选出来一个领头者, 领头者负责处理redis主节点的下线和从节点升为主节点的工作,领头者选举总结:
1.每个要求服务器客观下线的sentinel都有机会成为领头者 ;
2.sentinel设置领头者的规则是先到先得 ;
3.如果半数以上sentinel设置为局部领头,才能成为领头者;
4.一次选举中没有选出局部领头会接着选,直到选出领头;
3.提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
当故障转移期间,可以指定一个“通知”脚本用来告知系统管理员,当前集群的情况。
sentinel notification-script mymaster /var/redis/notify.sh
##############################################################
图 3
redis sentinel高可用集群搭建:
如图3
主节点(master):192.168.1.101 6379
从节点(slave1): 192.168.1.102 6379
从节点(slave2): 192.168.1.103 6379
sentinel 1:192.168.1.101 6380
sentinel 2:192.168.1.102 6380
sentinel 3:192.168.1.103 6380
-----------------------------
master:192.168.1.101
tar zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
mkdir /usr/local/redis
make PREFIX=/usr/local/redis install
redis安装:
mkdir /usr/local/redis/etc
cp /usr/local/src/redis/redis.conf /usr/local/redis/etc/redis.conf
mkdir -p /usr/local/redis/data
mkdir -p /usr/local/redis/log
cp /usr/local/src/redis-3.0.5/utils/redis_init_script /etc/rc.d/init.d/redis-6379
chkconfig --add redis-6379
chkconfig redis-6379 off
service redis-6379 start
redis服务完成
sentinel安装:
mkdir -p /usr/local/redis/sentinel
cp /usr/local/src/sentinel.conf /usr/local/redis/sentinel/sentinel.conf
/usr/local/redis/bin/redis-server /usr/local/redis/sentinel/sentinel.conf --sentinel
sentinel启动完成
-----------------------------
slave:192.168.1.102
tar zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
mkdir /usr/local/redis
make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/etc
cp /usr/local/src/redis/redis.conf /usr/local/redis/etc/redis.conf
mkdir -p /usr/local/redis/data
mkdir -p /usr/local/redis/log
cp /usr/local/src/redis-3.0.5/utils/redis_init_script /etc/rc.d/init.d/redis-6379
chkconfig --add redis-6379
chkconfig redis-6379 off
service redis-6379 start
redis服务完成
mkdir -p /usr/local/redis/sentinel
cp /usr/local/src/sentinel.conf /usr/local/redis/sentinel/sentinel.conf
/usr/local/redis/bin/redis-server /usr/local/redis/sentinel/sentinel.conf --sentinel
-----------------------------
slave:192.168.1.103
tar zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
mkdir /usr/local/redis
make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/etc
cp /usr/local/src/redis/redis.conf /usr/local/redis/etc/redis.conf
mkdir -p /usr/local/redis/data
mkdir -p /usr/local/redis/log
cp /usr/local/src/redis-3.0.5/utils/redis_init_script /etc/rc.d/init.d/redis-6379
chkconfig --add redis-6379
chkconfig redis-6379 off
service redis-6379 start
redis服务完成
mkdir -p /usr/local/redis/sentinel
cp /usr/local/src/sentinel.conf /usr/local/redis/sentinel/sentinel.conf
/usr/local/redis/bin/redis-server /usr/local/redis/sentinel/sentinel.conf --sentinel
###############################################################
另附sentinel.conf的配置详解:
##sentinel实例之间的通讯端口
##redis-0
port 16379
##sentinel需要监控的master信息:<mastername> <masterIP> <masterPort> <quorum>
##<quorum>应该小于集群中slave的个数,只有当至少<quorum>个sentinel实例提交"master失效"
##才会认为master为O_DWON("客观"失效)
sentinel monitor def_master 127.0.0.1 6379 2
sentinel auth-pass def_master 012_345^678-90
##master被当前sentinel实例认定为“失效”的间隔时间
##如果当前sentinel与master直接的通讯中,在指定时间内没有响应或者响应错误代码,那么
##当前sentinel就认为master失效(SDOWN,“主观”失效)
##<mastername> <millseconds>
##默认为30秒
sentinel down-after-milliseconds def_master 30000
##当前sentinel实例是否允许实施“failover”(故障转移)
##no表示当前sentinel为“观察者”(只参与"投票".不参与实施failover),
##全局中至少有一个为yes
sentinel can-failover def_master yes
##当新master产生时,同时进行“slaveof”到新master并进行“SYNC”的slave个数。
##默认为1,建议保持默认值
##在salve执行salveof与同步时,将会终止客户端请求。
##此值较大,意味着“集群”终止客户端请求的时间总和和较大。
##此值较小,意味着“集群”在故障转移期间,多个salve向客户端提供服务时仍然使用旧数据。
sentinel parallel-syncs def_master 1
##failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,
##当前sentinel将会认为此次failoer失败。
sentinel failover-timeout def_master 900000
##当failover时,可以指定一个“通知”脚本用来告知系统管理员,当前集群的情况。
##脚本被允许执行的最大时间为60秒,如果超时,脚本将会被终止(KILL)
##脚本执行的结果:
## 1 -> 稍后重试,最大重试次数为10;
## 2 -> 执行结束,无需重试
sentinel notification-script mymaster /var/redis/notify.sh
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-1982662/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30109892/viewspace-1982662/