序言

依然接着在实现上上篇redis分片技术的前提条件下

1.1 Redis分片中存在问题

说明:

1.如果分片中的一个节点宕机,将会影响整个服务.

2.采用分片技术,可能会出现数据负载不均现象.

3.Redis分片没有数据的备份

1.2 结构划分

1. 6379主机

2. 6380 6381从机

1.3 配置3台主机

1.进入安装目录复制文件

cp -r shards sentinel

redis 切片和分片_数据

2.修改三个sentinel的持久化文件名称

redis 切片和分片_redis 切片和分片_02


redis 切片和分片_数据_03

将配置文件修改好之后,启动服务器.

redis 切片和分片_redis_04

1.4 配置主从

1. 检查当前节点的状态

info replication

redis 切片和分片_数据_05

此时默认的条件下,redis节点都是主机.

2.执行挂载命令

SLAVEOF 192.168.197.132 6379

分别将6380,6381挂载到6379,当6379的从机

redis 切片和分片_配置文件_06

3.主从测试

在redis主机中set数据,检查从机中是否有同步数据.

redis 切片和分片_redis 切片和分片_07

2.1 哨兵实现高可用

2.2 调用原理

redis 切片和分片_数据_08

2.3 配置哨兵

1.复制哨兵的文件

cp sentinel.conf sentinel

redis 切片和分片_数据_09

2.关闭保护模式


redis 切片和分片_linux redis 分片_10

3.编辑监控主机的信息

sentinel monitor mymaster 127.0.0.1 6379 2

mymaster:代表当前主机信息 ip:端口

3.1 哨兵投票的票数


redis 切片和分片_配置文件_11

4.修改推选时间 改为10秒

redis 切片和分片_redis_12

5. 修改推选超时时间

如果20之内没有完成推选,则重新推选

redis 切片和分片_配置文件_13

2.4 哨兵高可用测试

1.启动命令

redis-sentinel sentinel.conf

redis 切片和分片_配置文件_14

通过日志可以看见,redis主机是6379

2.将6379宕机,检查redis哨兵是否会自动推选.

redis 切片和分片_linux redis 分片_15

日志发现,哨兵推选了6381为主机

进入6381端口库查看


redis 切片和分片_数据_16

3.1 多个哨兵实现redis高可用

3.1.1 准备多个哨兵配置文件

说明:将原有哨兵复制三份.名称分别为

sentinel-6379.conf/sentinel-6380.conf/sentinel-6381.conf

redis 切片和分片_配置文件_17

3.1.2 修改哨兵配置文件

1.修改哨兵的端口


redis 切片和分片_redis 切片和分片_18

2.修改序列号,保证序列号不一样


redis 切片和分片_linux redis 分片_19

3.修改选举票数


redis 切片和分片_数据_20

3.1.3 多个哨兵测试

分别启动多台哨兵.检查哨兵的状态.将redis主机宕机后,检查哨兵是否自动推选.程序是否正确.

用下面命令分别启动三台哨兵

redis-sentinel sentinel-6379.conf

redis-sentinel sentinel-6380.conf

redis-sentinel sentinel-6381.conf

日志可看见宕机主机6381后以后,现在推选6380为主机了


redis 切片和分片_redis 切片和分片_21

3.1.4 哨兵搭建策略

1.先配置主从结构

主从结构搭建完成后,可实现数据的自动同步,并且维护各自的持久化文件.

2.编辑单台哨兵的配置文件.

3.扩展多台哨兵.

3.1.5 哨兵的优点

1.可以实现redis的高可用

2.对应调用者可以通过哨兵链接当前主机

代码实现哨兵的测试

public class SentinelTest {
public static void main(String[] args) {
//1.定义池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(1000);
//2.将redis哨兵节点写入集合
Set sentinels = new HashSet<>();
sentinels.add("192.168.197.132:26379");
sentinels.add("192.168.197.132:26380");
sentinels.add("192.168.197.132:26381");
//3.定义连接池
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,poolConfig);
Jedis jedis = pool.getResource();
jedis.set("2020", "今年是鼠年");
System.out.println("输出内容是:"+jedis.get("2020"));
pool.returnResource(jedis);
}
}

输出内容

redis 切片和分片_redis_22