三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot ...

打印 上一主题 下一主题

主题 659|帖子 659|积分 1977

一、前言

redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。
redis有两种高可用的方案:

  • High availability with Redis Sentinel(哨兵)
  • Scaling with Redis Cluster(分片集群)
第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂掉,哨兵会进行投票进行故障转移!
第二个就是分片集群,哨兵的一个缺点就是只能存在一个master节点,写的效率太低。分片集群就是解决哨兵的问题,可以水平扩展,提高redis的性能!
哨兵最低配是三哨兵,以奇数递增。
分片集群最低配是三主三从。
小编之前写过一篇在一台机器上搭建的文章,大家有兴趣可以先去体验一下,实际生产上不会让你一台机器上;也没有任何意义,服务器挂了,再多的集群也全部挂掉了!!
docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot
二、准备

首先我们要准备:
三台服务器(没有的条件的搭三个虚拟机),巧了小编就是虚拟机哈!
三台机器的ip和名称在表格里整理一下!
ipredis节点名称sentinel节点名称192.168.239.131redis-masterredis-sentinel-1192.168.239.130redis-slave-1redis-sentinel-2192.168.239.128redis-slave-2redis-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 实例应该放置在被认为以独立方式发生故障的计算机或虚拟机中。因此,例如在不同可用区上执行的不同物理服务器或虚拟机。
详细介绍和使用:请见官网 --->官网详细文档
四、一主二从搭建

话不多说,咱们直接开始搭建哈!
1.  创建挂载目录

三台机器上新建目录:
首先我们开启三个xshell窗口,然后同时操作三个窗口创建

然后再左下角选择发送到全部窗口!
  1. cd /
复制代码
  1. mkdir mydata
复制代码
  1. cd /mydata
复制代码
  1. mkdir redis
复制代码
  1. cd redis
复制代码
  1. mkdir data
复制代码
  1. mkdir conf
复制代码
  1. cd conf
复制代码
2. 在192.168.239.131机器上编辑文件
  1. vim redis.conf
复制代码
输入以下内容:
  1. # 任何都可以连接redis
  2. bind 0.0.0.0
  3. # 配置master密码
  4. requirepass 123456
  5. # 宕机后成为从要连接master的密码
  6. masterauth 123456
  7. # 开启持久化
  8. appendonly yes
复制代码

3. 在192.168.239.130机器上编辑文件
  1. vim redis.conf
复制代码
输入以下内容:
  1. # 配置master的ip和端口号
  2. replicaof 192.168.239.131 6379
  3. # 任何都可以连接redis
  4. bind 0.0.0.0
  5. # 成为master后的密码
  6. requirepass 123456
  7. # 连接master密码
  8. masterauth 123456
  9. # 开启持久化
  10. appendonly yes
复制代码

4. 在192.168.239.128机器上编辑文件
  1. vim redis.conf
复制代码
输入以下内容:
  1. # 配置master的ip和端口号
  2. replicaof 192.168.239.131 6379
  3. # 任何都可以连接redis
  4. bind 0.0.0.0
  5. # 成为master后的密码
  6. requirepass 123456
  7. # 连接master密码
  8. masterauth 123456
  9. # 开启持久化
  10. appendonly yes
复制代码
5. 192.168.239.131启动redis
  1. docker run -p 6379:6379 --name redis-master \
  2. -v /mydata/redis/data:/usr/local/etc/redis/data \
  3. -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  4. -d redis redis-server /usr/local/etc/redis/redis.conf
复制代码
查看启动日志:
  1. docker logs -f redis-master
复制代码

6. 192.168.239.130启动redis
  1. docker run -p 6379:6379 --name redis-slave-1 \
  2. -v /mydata/redis/data:/usr/local/etc/redis/data \
  3. -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  4. -d redis redis-server /usr/local/etc/redis/redis.conf
复制代码
可以看到已经连接到master节点了!

7. 192.168.239.128启动redis
  1. docker run -p 6379:6379 --name redis-slave-2 \
  2. -v /mydata/redis/data:/usr/local/etc/redis/data \
  3. -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  4. -d redis redis-server /usr/local/etc/redis/redis.conf
复制代码

8.  进入192.168.239.130容器查看

我们查看master日志,可以看到两个从节点已经加入进来了!

我们进入容器进行在次查看:
  1. docker exec -it redis-master /bin/bash
复制代码
连接redis:
  1. redis-cli
复制代码
登录redis
  1. auth 123456
复制代码

查看从节点:
  1. info
复制代码
也是可以看到有两个从节点!

五、搭建三哨兵sentinel

1. 创建挂载目录

还是三个虚拟机一起创建
  1. mkdir sentinel
复制代码
  1. cd sentinel
复制代码
  1. vim sentinel.conf
复制代码
输入下面内容:
  1. port 26379
  2. sentinel monitor redis-master 192.168.239.131 6379 2
  3. sentinel auth-pass redis-master 123456
  4. sentinel down-after-milliseconds redis-master 6000
  5. sentinel parallel-syncs redis-master 1
  6. sentinel failover-timeout redis-master 6000
复制代码
第二行:Redis 监控一个名为redis-master的redis集群,我们可以随意写;后面就是ip,我们宿主机的ip即可,端口为主redis的端口;2为哨兵投票的票数,当主redis宕机,三个哨兵必须两个哨兵都投票的redis才会变为主!!
第三行:配置master的密码
第四行:Sentinel判断实例进入主观下线所需的时间,毫秒单位。
第五行:限制在一次故障转移之后,每次向新的主节点同时发起复制操作节点个数,越大效率越慢。
第六行:在指定的时间内未能完成failover故障转移,则任务故障转移失败。

2. 运行192.168.239.131哨兵
  1. docker run -p 26379:26379 --name redis-sentinel-1 \
  2. -v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
  3. -d redis redis-sentinel /usr/local/etc/redis/sentinel.conf
复制代码
3. 运行192.168.239.130哨兵
  1. docker run -p 26379:26379 --name redis-sentinel-2 \
  2. -v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
  3. -d redis redis-sentinel /usr/local/etc/redis/sentinel.conf
复制代码
3. 运行192.168.239.128哨兵
  1. docker run -p 26379:26379 --name redis-sentinel-3 \
  2. -v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
  3. -d redis redis-sentinel /usr/local/etc/redis/sentinel.conf
复制代码
4. 待解决问题

这里创建三个哨兵,查看却是有四个,不知道什么问题,换了虚拟机还是不行!有大佬懂的可以分享一下哈!!

六、测试主从和故障转移

1. 测试主从复制

master节点创建一个键值对:
  1. set a b
复制代码

从查看key是否存在:
  1. get a
复制代码

主从没有问题哈!
2. 测试故障转移

我们把master停掉,查看一个哨兵的日志:
  1. docker stop redis-master
复制代码
  1. docker logs -f redis-sentinel-1
复制代码
我们看到192.168.239.130成为master!

重新启动原来的master:
  1. docker restart redis-master
复制代码

故障转移成功!!
七、整合springboot

1. 导入依赖

小编的springboot版本为:2.7.4
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.boot</groupId>
  7.     <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>
复制代码
2. yml配置

password密码和sentinel同级,不然找不到密码,验证失败
  1. server:
  2.   port: 8087
  3. spring:
  4.   redis:
  5.     # 密码和sentinel同级,不然找不到密码,验证失败
  6.     password: 123456
  7.     sentinel:
  8.       # sentinel.conf里的集群名称
  9.       master: my-master
  10.       # 我们只需要连哨兵即可,哨兵内部会帮我们找到redis
  11.       nodes:
  12.         - 192.168.239.131:26379
  13.         - 192.168.239.130:26379
  14.         - 192.168.239.128:26379
复制代码
3. json序列化配置
  1. /**
  2. * @author wangzhenjun
  3. * @date 2022/11/24 10:37
  4. */
  5. @Configuration
  6. public class RedisConfig {
  7.     @Bean
  8.     @SuppressWarnings(value = { "unchecked", "rawtypes" })
  9.     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
  10.     {
  11.         RedisTemplate<Object, Object> template = new RedisTemplate<>();
  12.         template.setConnectionFactory(connectionFactory);
  13.         Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
  14.         // 使用StringRedisSerializer来序列化和反序列化redis的key值
  15.         template.setKeySerializer(new StringRedisSerializer());
  16.         template.setValueSerializer(serializer);
  17.         // Hash的key也采用StringRedisSerializer的序列化方式
  18.         template.setHashKeySerializer(new StringRedisSerializer());
  19.         template.setHashValueSerializer(serializer);
  20.         template.afterPropertiesSet();
  21.         return template;
  22.     }
  23. }
复制代码
4. 新建controller测试
  1. /**
  2. * @author wangzhenjun
  3. * @date 2022/11/24 10:37
  4. */
  5. @RestController
  6. public class TestController {
  7.     @Autowired
  8.     private RedisTemplate redisTemplate;
  9.     @GetMapping("/redis")
  10.     public void saveRedis(){
  11.         redisTemplate.opsForValue().set("test","看到我就成功了");
  12.     }
  13. }
复制代码
5. 测试

http://localhost:8087/test/redis

6. 查看redis


八、总结

经过一天的搭建,终于完成了,虽然不是完美的,但是大体功能是没有问题的!但是不影响故障转移和主从复制!
唯一的遗憾:三个哨兵,查看就是四个!从第三个哨兵加入后变为4个!
如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!
可以看下一小编的微信公众号,文章首发看,欢迎关注,一起交流哈!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表