1. 简介
上一篇文章我们介绍了Redis中的主从复制模式,在文章的末尾我们说到了这种模式的一个弊端。那就是当master宕机之后,slave不能自动晋升为master,这就会导致redis服务出现不可用的情况。
这篇文章将介绍另外一种模式—哨兵模式,该模式在master宕机之后可以自动从各个slave中选举一个作为新的master。
2. 哨兵模式的构造
通过哨兵来监听master,当master宕机之后,哨兵会选举出新的master。哨兵可以设置一个,也可以设置多个,一般而言在生产中会设置大于1个的奇数个哨兵,这是为了防止哨兵自身宕机的情况。
3. 哨兵模式的设置
3.1. 将redis服务设置为一主两从
3.2. 新建 sentinel.conf 文件
在redis.conf的同级目录下,新建一个名为 sentinel.conf的文件,这个文件的名称不能修改,不能错。
3.3. 配置哨兵
在前面创建的sentinel.conf 文件中写入如下内容:
sentinel monitor mymaster 127.0.0.1 6379 1
其中,mymaster 为监控对象其的服务器名称,1 为至少有多少个哨兵同意迁移的数量。
3.4. 启动哨兵
在 /usr/local/bin 目录下有个名为redis-sentinel的程序,启动它即可启动哨兵。这里为了方便演示,采用的是客户端的启动方式。如果想采用后台启动的方式,则需要在 sentinel.conf 文件中设置daemonize yes
/usr/local/bin/redis-sentinel /myredis/sentinel.conf
正常启动之后可以看到sentinel 的端口号是 26379,监听到的master是: 127.0.0.1 6379
4. 观察哨兵模式的运行
这里手动将主服务器 6379宕机。然后,大概10秒左右可以看到哨兵窗口日志,切换了新的主机。
哨兵通过选举的方式,选出了 6380 作为新的master。
5. 哨兵模式的选举策略
哨兵模式的选举过程有三步:
从下线的主服务的所有从服务里面挑选一个从服务,将其转成主服务。选择的条件详见下方说明。
挑选出新的主服务之后sentinel向原主服务的从服务发送slaveof新主服务的命令,复制新master。
当下线的服务重新上线时,sentinel 会向其发送slaveof命令,让其成为新主的从服务器。
5.1. 选举的条件
选择优先级靠前的
优先级在redis.conf中默认replica-priority 100
,值越小优先级越高
选择偏移量最大的
偏移量是指获得原主机数据最全的
选择runid最小的从服务
每个redis实例启动后都会随机生成一个40位的runid。
6. 复制延时
由于所有的写操作都是先在master上操作,然后同步更新到slave上,所以从master同步到slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这个问题严重。
7. 连接哨兵模式代码
private static JedisSentinelPool jedisSentinelPool = null; public static Jedis getJedisFromSentinel() { if (jedisSentinelPool == null) { Set<String> sentinelSet = new HashSet<>(); sentinelSet.add("127.0.0.1:26379"); JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(10); //最大可用连接数 poolConfig.setMaxIdle(5); //最大闲置连接数 poolConfig.setMinIdle(5); //最小闲置连接数 poolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待 poolConfig.setMaxWaitMillis(2000); //等待时间 poolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试ping jedisSentinelPool = new JedisSentinelPool("mymaster", sentinelSet, poolConfig); return jedisSentinelPool.getResource(); } return jedisSentinelPool.getResource(); }
总结
本文首先介绍了哨兵模式的搭建,哨兵的搭建其实就是增加sentinel.conf文件,然后启动 redis-sentinel 命令
接着哨兵如何进行选举的,当主机宕机之后,哨兵在10秒后会检查一次,然后进行选举,选举的条件是:
选取优先级高的,即replica-priority值越小越先被选择,
选取偏移量最大的,即拥有主机数据最全的
选择runid最小的从服务