首先明确一点,哨兵模式就是为了弥补主从复制中,当主机挂掉之后,需要重新手动选择主机的缺点而提出的方案。哨兵模式可以自动选取主机。
啥是哨兵?就是监视某区域的士兵,这里的哨兵模式就是这个意思,什么是哨兵?哨兵(Sentinel)就是一个独立的进程,多个Sentinel实例组成Sentinel集群。哨兵(Sentinel)通过发送命令,等待服务器响应,以此来监视多个redis实例,被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
简单点说,有点像打仗时候的侦查兵,连长挂掉了,排长顶上,排长挂掉了班长顶上
哨兵模式的主要功能
- 集群监控,监控master和slave进程是否正常工作
- 消息通知,如果redis实例出现故障,哨兵Sentinel进程负责报警
- 故障转移,master挂掉,slave选举上岗
- 配置中心,如果故障转移出现,通知client客户端新的master
如何实现哨兵模式
新建sentinel.conf
输入
sentinel monitor host6379 127.0.0.1 6379 1
启动哨兵模式
[root@localhost bin]# redis-sentinel /myredis/sentinel.conf
启动成功
此时挂掉6379,等待一段时间之后,发现6381成为主机
6381set数据
6380可以获取到数据
等6379恢复之后,成为从机
然后观察sentinel日志,发现选举失败一次,然后选举了6381
复制的缺点
由于所有写操作都是先在master上操作,然后同步更新到slave上,所以从master同步到slave机器上有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这个问题更加严重
实际java项目中应用
第一步,配置主从,由于主从复制中,配从不配主,故只修改从主机的配置文件即可
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.25.139 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456
第二步,修改sentinel.conf
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,1代表只有一个或一个以上的哨兵认为主服务器不可用的时候(可以改为2),才会进行failover操作。
sentinel monitor mymaster 192.168.25.139 6379 1
然后启动主机和从机,最后启动哨兵服务即可
启动顺序
首先是主机(192.168.25.139)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。
第三步,编写java代码,使用jedis为例
/**
* 测试Redis哨兵模式
* @author jie
*/
public class TestSentinel {
@SuppressWarnings("resource")
@Test
public void testSentinel() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxIdle(5);
jedisPoolConfig.setMinIdle(5);
// 哨兵信息
Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.25.139:6379",
"192.168.25.139:6379","192.168.25.139:6379"));
// 创建连接池
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig);
// 获取客户端
Jedis jedis = pool.getResource();
// 执行两个命令
jedis.set("k1", "v1");
String value = jedis.get("k1");
System.out.println(value);
}
}