需求:先有4台服务器10.0.0.82 10.0.0.83 10.0.0.84 10.0.0.85 配置成1主3从,当其中一台主服务器出现问题宕机时,从服务器能自动切换为主服务器,数据不丢失并保证,程序无需调整。
工具:Redis Sentinel(Redis自带)
步骤:1)在4台服务器上分别安装redis,并配置主从(步骤见一)
主从配置完查看master服务器信息:
查看从服务器信息:
2)配置sentinel.conf(与redis.conf在同目录下)
#port 26379
#sentinel monitor mymaster 10.0.0.84 6379 1
#sentinel auth-pass mymaster iiot201411
#sentinel down-after-milliseconds mymaster 30000
#sentinel parallel-syncs mymaster 1
#sentinel failover-timeout mymaster 180000
第1行含义:
Sentinel 去监视一个名为
mymaster
的主服务器, 这个主服务器的 IP 地址为 10.0.0.84
, 端口号为
6379
, 而将这个主服务器判断为失效至少需要 1
个 Sentinel 同意 (只要同意 Sentinel
的数量不达标,自动故障迁移就不会执行)。
第2行含义:
Sentinel
的密码,若主从配置了密码,此处最好与主从密码一致,否则启动有问题。
第3行含义:
选项指定了 Sentinel 认为服务器已经断线所需的毫秒数
。
第4行含义:
选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
。
3)启动
Sentinel
#/usr/local/redis-2.8.18/src/redis-sentinel /usr/local/redis-2.8.18/sentinel.conf
如主从配置一样,sentinel会自动检测主从服务器及端口。
查看sentinel状态:
测试:kill 掉10.0.0.84的redis进程 查看sentinel状态:
82Slave顺利晋升为master,成功!
4)java代码部分:
测试部分:
public static void main(String[] args) {try {String redisSentinelHost = "10.0.0.84";int redisSentinelPort = 26379;String redisSentinelClusterName = "mymaster";String redisSentinelPwd = "iiot2014";RedisSentinel pool = new RedisSentinelJedisPool(redisSentinelHost, redisSentinelPort, redisSentinelClusterName);if (pool != null) {Jedis jedis = (Jedis) pool.getResource();if (redisSentinelPwd != null)jedis.auth(redisSentinelPwd);jedis.set("test", "test");jedis.get("test",);}} catch (Exception e) {log.error(e.getMessage());e.printStackTrace();}}