• 三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot【保姆级】


    一、前言

    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-1
    192.168.239.130redis-slave-1redis-sentinel-2
    192.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窗口,然后同时操作三个窗口创建
    在这里插入图片描述
    然后再左下角选择发送到全部窗口!

    cd /
    
    • 1
    mkdir mydata
    
    • 1
    cd /mydata
    
    • 1
    mkdir redis
    
    • 1
    cd redis
    
    • 1
    mkdir data
    
    • 1
    mkdir conf
    
    • 1
    cd conf
    
    • 1

    2. 在192.168.239.131机器上编辑文件

    vim redis.conf
    
    • 1

    输入以下内容:

    # 任何都可以连接redis
    bind 0.0.0.0
    # 配置master密码
    requirepass 123456
    # 宕机后成为从要连接master的密码
    masterauth 123456
    # 开启持久化
    appendonly yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    3. 在192.168.239.130机器上编辑文件

    vim redis.conf
    
    • 1

    输入以下内容:

    # 配置master的ip和端口号
    replicaof 192.168.239.131 6379
    # 任何都可以连接redis
    bind 0.0.0.0
    # 成为master后的密码
    requirepass 123456
    # 连接master密码
    masterauth 123456
    # 开启持久化
    appendonly yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    4. 在192.168.239.128机器上编辑文件

    vim redis.conf
    
    • 1

    输入以下内容:

    # 配置master的ip和端口号
    replicaof 192.168.239.131 6379
    # 任何都可以连接redis
    bind 0.0.0.0
    # 成为master后的密码
    requirepass 123456
    # 连接master密码
    masterauth 123456
    # 开启持久化
    appendonly yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5. 192.168.239.131启动redis

    docker 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
    
    • 1
    • 2
    • 3
    • 4

    查看启动日志:

    docker logs -f redis-master
    
    • 1

    在这里插入图片描述

    6. 192.168.239.130启动redis

    docker 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
    
    • 1
    • 2
    • 3
    • 4

    可以看到已经连接到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
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    8. 进入192.168.239.130容器查看

    我们查看master日志,可以看到两个从节点已经加入进来了!
    在这里插入图片描述

    我们进入容器进行在次查看:

    docker exec -it redis-master /bin/bash
    
    
    • 1
    • 2

    连接redis:

    redis-cli
    
    • 1

    登录redis

    auth 123456
    
    • 1

    在这里插入图片描述

    查看从节点:

    info
    
    • 1

    也是可以看到有两个从节点!

    在这里插入图片描述

    五、搭建三哨兵sentinel

    1. 创建挂载目录

    还是三个虚拟机一起创建

    mkdir sentinel
    
    • 1
    cd sentinel
    
    • 1
    vim sentinel.conf
    
    • 1

    输入下面内容:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    第二行: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
    
    • 1
    • 2
    • 3

    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
    
    • 1
    • 2
    • 3

    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
    
    • 1
    • 2
    • 3

    4. 待解决问题

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

    在这里插入图片描述

    六、测试主从和故障转移

    1. 测试主从复制

    master节点创建一个键值对:

    set a b
    
    • 1

    在这里插入图片描述

    从查看key是否存在:

    get a
    
    • 1

    在这里插入图片描述
    主从没有问题哈!

    2. 测试故障转移

    我们把master停掉,查看一个哨兵的日志:

    docker stop redis-master
    
    • 1
    docker logs -f redis-sentinel-1 
    
    • 1

    我们看到192.168.239.130成为master!

    在这里插入图片描述
    重新启动原来的master:

    docker restart redis-master 
    
    • 1

    在这里插入图片描述

    故障转移成功!!

    七、整合springboot

    1. 导入依赖

    小编的springboot版本为:2.7.4

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3. json序列化配置

    /**
     * @author wangzhenjun
     * @date 2022/11/24 10:37
     */
    @Configuration
    public class RedisConfig {
    
        @Bean
        @SuppressWarnings(value = { "unchecked", "rawtypes" })
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
        {
            RedisTemplate<Object, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory);
            Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
    
            // 使用StringRedisSerializer来序列化和反序列化redis的key值
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(serializer);
    
            // Hash的key也采用StringRedisSerializer的序列化方式
            template.setHashKeySerializer(new StringRedisSerializer());
            template.setHashValueSerializer(serializer);
    
            template.afterPropertiesSet();
            return template;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    4. 新建controller测试

    /**
     * @author wangzhenjun
     * @date 2022/11/24 10:37
     */
    @RestController
    public class TestController {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @GetMapping("/redis")
        public void saveRedis(){
            redisTemplate.opsForValue().set("test","看到我就成功了");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    5. 测试

    http://localhost:8087/test/redis

    在这里插入图片描述

    6. 查看redis

    在这里插入图片描述

    八、总结

    经过一天的搭建,终于完成了,虽然不是完美的,但是大体功能是没有问题的!但是不影响故障转移和主从复制!

    唯一的遗憾:三个哨兵,查看就是四个!从第三个哨兵加入后变为4个!

    如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!


    可以看下一小编的微信公众号,和网站文章首发看,欢迎关注,一起交流哈!!

    点击访问!小编自己的网站,里面也是有很多好的文章哦!

  • 相关阅读:
    最长回文子串
    自动驾驶测绘资质的信息安全要求,真的来了
    Spring Boot Validation提示信息国际化配置
    C++ Qt开发:QHostInfo主机地址查询组件
    《剑指Offer》搜索算法题篇——更易理解的思路~
    2022年简历石沉大海,别投了,软件测试岗位饱和了....
    基于Android 10系统的瑞芯微RK3399K烧写镜像实录
    【k8s-1】基于docker Desktop一键式搭建k8s环境
    【中间件篇-Redis缓存数据库03】Redis高级特性和应用(发布 订阅、Stream)
    Android Studio开发入门教程:如何让开发的app国际化?
  • 原文地址:https://blog.csdn.net/qq_52423918/article/details/128011111