一、前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。 redis有两种高可用的方案: High availability with Redis Sentinel(哨兵) Scaling with Redis Cluster(分片集群) 第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂掉,哨兵会进行投票进行 故障转移 ! 第二个就是分片集群,哨兵的一个缺点就是只能存在一个master节点,写的效率太低。分片集群就是解决哨兵的问题,可以水平扩展,提高redis的性能! 哨兵最低配是三哨兵,以奇数递增。 分片集群最低配是三主三从。 小编之前写过一篇在一台机器上搭建的文章,大家有兴趣可以先去体验一下,实际生产上不会让你一台机器上;也没有任何意义,服务器挂了,再多的集群也全部挂掉了!! docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版】二、准备 首先我们要准备: 三台服务器(没有的条件的搭三个虚拟机),巧了小编就是虚拟机哈! 三台机器的ip和名称在表格里整理一下! ip redis节点名称 sentinel节点名称 192.168.239.131 redis-master redis-sentinel-1 192.168.239.130 redis-slave-1 redis-sentinel-2 192.168.239.128 redis-slave-2 redis-sentinel-3 三、Sentinel概念 Redis Sentinel 在不使用Redis Cluster时为 Redis 提供 高可用性 。 Sentinel功能的完整列表: 监控 :Sentinel 不断检查您的主实例和副本实例是否按预期工作。通知 :Sentinel 可以通过 API 通知系统管理员或其他计算机程序,其中一个受监控的 Redis 实例出现问题。自动故障转移 :如果 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个副本被提升为 master,其他额外的副本被重新配置为使用新的 master,并且使用 Redis 服务器的应用程序被告知要使用的新地址连接时。自动更新配置 :Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinels 以询问负责给定服务的当前 Redis master 的地址。如果发生故障转移,Sentinels 将报告新地址。 官方哨兵搭建条件: 您至少需要 三个 Sentinel 实例 才能进行可靠的部署。三个 Sentinel 实例应该放置在被认为以独立方式发生故障的计算机或虚拟机中。因此,例如 在不同可用区上执行的不同物理服务器或虚拟机 。 详细介绍和使用:请见官网 --->官网详细文档:https://redis.io/docs/management/sentinel/ 四、一主二从搭建 话不多说,咱们直接开始搭建哈! 1. 创建挂载目录 三台机器上新建目录: 首先我们开启三个xshell窗口,然后同时操作三个窗口创建 在这里插入图片描述 然后再左下角选择发送到全部窗口! cd / mkdir mydata cd /mydata mkdir redis cd redis mkdir data mkdir conf cd conf 2. 在`192.168.239.131`机器上编辑文件vim redis.conf 输入以下内容: # 任何都可以连接redis bind 0.0.0.0 # 配置master密码 requirepass 123456 # 宕机后成为从要连接master的密码 masterauth 123456 # 开启持久化 appendonly yes 在这里插入图片描述 3. 在`192.168.239.130`机器上编辑文件vim redis.conf 输入以下内容: # 配置master的ip和端口号 replicaof 192.168.239.131 6379 # 任何都可以连接redis bind 0.0.0.0 # 成为master后的密码 requirepass 123456 # 连接master密码 masterauth 123456 # 开启持久化 appendonly yes 在这里插入图片描述 4. 在`192.168.239.128`机器上编辑文件vim redis.conf 输入以下内容: # 配置master的ip和端口号 replicaof 192.168.239.131 6379 # 任何都可以连接redis bind 0.0.0.0 # 成为master后的密码 requirepass 123456 # 连接master密码 masterauth 123456 # 开启持久化 appendonly yes 5. `192.168.239.131`启动redisdocker run -p 6379:6379 --name redis-master -v /mydata/redis/data:/usr/local/etc/redis/data -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf 查看启动日志: docker logs -f redis-master 在这里插入图片描述 6. `192.168.239.130`启动redisdocker run -p 6379:6379 --name redis-slave-1 -v /mydata/redis/data:/usr/local/etc/redis/data -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf 可以看到已经连接到master节点了! 在这里插入图片描述 7. `192.168.239.128`启动redis docker run -p 6379:6379 --name redis-slave-2 -v /mydata/redis/data:/usr/local/etc/redis/data -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf 在这里插入图片描述 8. 进入`192.168.239.130`容器查看 我们查看master日志,可以看到两个从节点已经加入进来了! 在这里插入图片描述 我们进入容器进行在次查看: docker exec -it redis-master /bin/bash 连接redis: redis-cli 登录redis auth 123456 在这里插入图片描述 查看从节点: info 也是可以看到有两个从节点! 在这里插入图片描述 五、搭建三哨兵sentinel1. 创建挂载目录 还是三个虚拟机一起创建 mkdir sentinel cd sentinel vim sentinel.conf 输入下面内容: port 26379 sentinel monitor redis-master 192.168.239.131 6379 2 sentinel auth-pass redis-master 123456 sentinel down-after-milliseconds redis-master 6000 sentinel parallel-syncs redis-master 1 sentinel failover-timeout redis-master 6000 第二行:Redis 监控一个名为redis-master的redis集群,我们可以随意写;后面就是ip,我们宿主机的ip即可,端口为主redis的端口;2为哨兵投票的票数,当主redis宕机,三个哨兵必须两个哨兵都投票的redis才会变为主!! 第三行:配置master的密码 第四行:Sentinel判断实例进入主观下线所需的时间,毫秒单位。 第五行:限制在一次故障转移之后,每次向新的主节点同时发起复制操作节点个数,越大效率越慢。 第六行:在指定的时间内未能完成failover故障转移,则任务故障转移失败。 在这里插入图片描述 2. 运行`192.168.239.131`哨兵docker run -p 26379:26379 --name redis-sentinel-1 -v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis redis-sentinel /usr/local/etc/redis/sentinel.conf 3. 运行`192.168.239.130`哨兵docker run -p 26379:26379 --name redis-sentinel-2 -v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis redis-sentinel /usr/local/etc/redis/sentinel.conf 3. 运行`192.168.239.128`哨兵docker run -p 26379:26379 --name redis-sentinel-3 -v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis redis-sentinel /usr/local/etc/redis/sentinel.conf 4. 待解决问题 这里创建三个哨兵,查看却是有四个,不知道什么问题,换了虚拟机还是不行!有大佬懂的可以分享一下哈!! 在这里插入图片描述 六、测试主从和故障转移1. 测试主从复制 master节点创建一个键值对: set a b 在这里插入图片描述 从查看key是否存在: get a 在这里插入图片描述 主从没有问题哈! 2. 测试故障转移 我们把master停掉,查看一个哨兵的日志: docker stop redis-master docker logs -f redis-sentinel-1 我们看到192.168.239.130成为master! 在这里插入图片描述 重新启动原来的master: docker restart redis-master 在这里插入图片描述 故障转移成功!! 七、整合springboot1. 导入依赖 小编的springboot版本为: 2.7.4org.springframework.boot spring-boot-starter-data-redis2. yml配置 password密码和sentinel同级,不然找不到密码,验证失败 server: port: 8087 spring: redis: # 密码和sentinel同级,不然找不到密码,验证失败 password: 123456 sentinel: # sentinel.conf里的集群名称 master: my-master # 我们只需要连哨兵即可,哨兵内部会帮我们找到redis nodes: - 192.168.239.131:26379 - 192.168.239.130:26379 - 192.168.239.128:26379 3. json序列化配置/** * @author wangzhenjun * @date 2022/11/24 10:37 */ @Configuration public class RedisConfig { @Bean @SuppressWarnings(value = { "unchecked", "rawtypes" }) public RedisTemplate org.springframework.boot spring-boot-starter-web