redis:redis sentinel(哨兵)主从高可用方案
监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
自动故障迁移(Automaticfailover):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
Sentinel支持集群
很显然,只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要将sentinel集群,这样有几个好处:
- 即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;
- 如果只有一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换(单点问题);
- 如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。
Sentinel版本
Sentinel当前最新的稳定版本称为Sentinel2(与之前的Sentinel1区分开来)。随着redis2.8的安装包一起发行。安装完Redis2.8后,可以在redis2.8/src/里面找到Redis-sentinel的启动程序。
sentinel_63791.conf配置:
port63791
daemonizeyes
logfile"/var/log/sentinel_63791.log"
#master-1
sentinelmonitormaster-1192.168.78.9963792
sentineldown-after-millisecondsmaster-15000
sentinelfailover-timeoutmaster-118000
sentinelauth-passmaster-1yingjun
sentinelparallel-syncsmaster-11
sentinel_63792.conf配置:
port63792
daemonizeyes
logfile"/var/log/sentinel_63792.log"
#master-1
sentinelmonitormaster-1192.168.78.9963792
sentineldown-after-millisecondsmaster-15000
sentinelfailover-timeoutmaster-118000
sentinelauth-passmaster-1yingjun
sentinelparallel-syncsmaster-11
redis_master_6379.conf配置:
在原配置文件中作如下修改:
port6379
daemonizeyes
requirepassyingjun
masterauthyingjun
redis_slave_6380.conf配置:
在原配置文件中作如下修改:
port6380
daemonizeyes
requirepassyingjun
slaveof192.168.78.996379
masterauthyingjun
redis_slave_6381.conf配置:
在原配置文件中作如下修改:
port6381
daemonizeyes
requirepassyingjun
slaveof192.168.78.996379
masterauthyingjun
按如下顺序依次启动服务:
./redis-server../conf/redis_master_6379.conf
./redis-server../conf/redis_slave_6380.conf
./redis-server../conf/redis_slave_6381.conf
./redis-sentinel../conf/sentinel_63791.conf
./redis-sentinel../conf/sentinel_63792.conf
三、JedisSentinel教程
Maven依赖:
redis.clientsjedis2.8.0org.springframework.dataspring-data-redis1.6.4.RELEASEredis的配置文件:
#redisconfig
redis.pass=yingjun
redis.pool.maxTotal=105
redis.pool.maxIdle=10
redis.pool.maxWaitMillis=60000
redis.pool.testOnBorrow=true
sentinel1.ip=192.168.78.99
sentinel1.port=63791
sentinel2.ip=192.168.78.99
sentinel2.port=63792
Spring的配置文件:
代码中直接用redisTemplate调用:
@Override
publicbooleanadd(finalKeyTokentkey){
booleanresult=redisTemplate.execute(newRedisCallback(){
@Override
publicBooleandoInRedis(RedisConnectionconnection)throwsDataAccessException{
RedisSerializerserializer=getRedisSerializer();
byte[]key=serializer.serialize(tkey.getIndex());
byte[]name=serializer.serialize(tkey.getExpire_time());
returnconnection.setNX(key,name);
}
});
returnresult;
}