1. 需求
如果搭建redis分片,如果其中一台服务器宕机.则导致整个分片不能正常使用.
需求:能否实现服务器尽可能”不宕机”.(高可用)
2. Redis哨兵工作原理
前提:如果需要实现redis高可用,必须先配置主从结构:
1. 用户通过哨兵之后连接当前集群中的主机;
2. 哨兵通过心跳检测机制实时向主机发出心跳检测:PING-PONG。如果连续3次没有收到主机的回执,则发现主机宕机,开始进行推选;
3. 哨兵通过连接主机时已经获取了主机的全部信息。如果主机宕机,哨兵通过推选的机制选择一台从机当做新的主机,之后将其他的服务器改为当前主机的从机;
3. 哨兵高可用搭建
1. 复制目录 cp -r shards sentinel
2. 删除持久化文件
因为redis节点的配置文件名称都是一致的,启动redis时会导致内存数据都是相同,所以必须先删除持久化文件:rm -f dump.rdb appendonly.aof
3. 主从搭建
a. 启动三台redis
b. 检查redis节点状态( 执行命令 src/redis-cli -p 6379 进入redis操作界面 ,执行 info replication 查看节点状态)
c. 主从配置(进入6380操作界面,执行 slaveof 192.168.2.102 6379 ,将6380绑定为6379的从机)
d. 主从测试
搭建完成主从结构之后,在主机中添加数据,检查从机中的数据是否与主机一致,如果一致表示主从结构搭建成功。
4. 编辑哨兵配置文件
1. 从根目录复制哨兵的配置文件(cp sentinel.conf sentinel)
2. 关闭保护模式
3. 开启后台启动
4. 设定哨兵监控
mamaster:表示当前主机的变量名称;Host port:当前主机的信息;1:表示当前哨兵选举的票数(几票生效)。规则:一般涉及选举的服务器,一般都是奇数个。
5. 修改选举时间(主机宕机多长时间后开始选举,单位:毫秒)
5. 哨兵测试
1. 启动哨兵:src/redis-sentinel sentinel/sentinel.conf
2. redis高可用测试
6379宕机,检查6380/6381是否当主机,再次开启6379,检查6379是否为从。
ps:不清楚为啥会出现重启6379后,第一次状态查询显示主机,第二次查询才显示是从机,可能是刚开机所以卡了一下???
6.Spring测试哨兵
/**
* 测试哨兵
* 调用原理:
* 用户通过哨兵,连接redis的主机,进行操作
* masterName:主机的变量名称
* sentinels: 哨兵节点信息 Set<String>
*/
@Test
public void testSentinel() {
Set<String> sentinels = new HashSet<>();
sentinels.add("192.168.8.128:26379");
JedisSentinelPool sentinelPool =
new JedisSentinelPool("mymaster", sentinels);
Jedis jedis = sentinelPool.getResource();
jedis.set("tsvv", "哨兵测试成功!!!!");
System.out.println(jedis.get("tsvv"));
}