在docker环境中Redis集群和哨兵集群的搭建

Redis集群的搭建

  首先下载redis.conf配置文件
  并在配置文件中修改:
bind  0.0.0.0           //需要将配置文件中的其他bind给注释掉,然后添加这个, 表示允许任何ip进行连接
 protected-mode  no    //需要关闭保护模式,在默认yes开启状态下, 是无法被外界连接的, 其次在关闭保护模式后,哨兵才能正常连接你
 requirepass  ""           //将密码设置成空,默认密码是: requirepass   "123456"
                                  //在Redis的一主二从配置中,‌如果主机(‌master)‌配置了requirepass参数需要密码登录,‌那么从机(‌slave)‌就需要设置masterauth来设置校验密码,比较麻烦。
                                 //‌如果主机不需要密码登录,‌那么从机就不需要设置masterauth参数,‌否则主机会拒绝从机的访问请求


 然后创建三个目录并分别存放redis的配置文件:6389, 6390,6391                        //此时这三个文件中都已经存在了配置文件

-

-

-

-

 然后通过原始的redis镜像创建三个redis容器:6389,6390,6391,并将本地所创建的三个目录挂载到redis容器中,并加载所映射的配置文件,重复创建三个就可以了,每次只需要修改其映射端口:
docker run --name redis89  -p  6389:6379   -v    D:\新建文件夹\6389:/etc/redis    -d redis   redis-server /etc/redis/redis.conf       --replica-announce-ip   192.168.0.179   --replica-announce-port   6389    

 
docker run --name redis90  -p  6390:6379   -v    D:\新建文件夹\6390:/etc/redis    -d redis   redis-server /etc/redis/redis.conf       --replica-announce-ip   192.168.0.179   --replica-announce-port   6390   


docker run --name redis91  -p  6391:6379   -v    D:\新建文件夹\6391:/etc/redis    -d redis   redis-server /etc/redis/redis.conf       --replica-announce-ip   192.168.0.179   --replica-announce-port   6391      

参数说明:      
1,注意一定不要挂载data目录,否则在开启集群的时候会报错
2,在挂载的时候,配置文件就已经放入到了容器内部的/etc/redis中了,所以在后面可以直接通过redis-server /etc/redis/redis.conf加载redis.conf配置文件
3,注意:这里6391目录是本地目录地址,在window环境中,我的地址是:D:\新建文件夹\6391
4,这里你所创建的这个redis容器正好只能通过192.168.0.179:6389来访问,所以可以使用replica-announce-ip和replica-announce-port就是告诉哨兵指定要使用这个ip和端口来连接我这个从节点, 这两个属性只是redis配置文件中的一个声明的作用,它并不会对redis容器内部产生影响,容器内部的服务端口还是6379,

这样你在后面搭建哨兵集群后,哨兵才能正确的获取到你这个容器的ip地址和端口号

-

-

-


                                                      

 然后进入redis的配置文件中,将AOF关闭: appendonly  no
 并将RDB开启: 将save   ""给注释掉, 最开始我们不是将所有的save给注释掉,然后取消了save  ""的注释吗,这样在容器运行的时候,就不会触发RDB了, 现在想要开启就只需要将save ""注释掉

-

-

-

-

-

 然后进入6390和6391文件夹,修改配置文件:
  replicaof   192.168.0.179   6389              //表示连接6389这台机器,成为6389的子节点,也就是成为6389的小弟
                                                           //slave中文为奴隶的意思

-

-

-

-


 神奇的一幕来了,我在6389中设置数据aa: set  aa  zhan
 此时在6390和6391中都能查询到aa这个数据
 我在6389的客户端中输入: info  replication            //查看内部的从节点信息

-

-

注意: 此时在从节点中写数据的话会报错:"READONLY You can't write against a read only replica."
         意思是从节点只有读的权限,没有写的权限

哨兵集群的搭建:

    首先我们已经有了三个redis容器,就是一主二从不是已经搭建完成了吗, 注意在三个redis配置文件中都修改replica-announce-ip和replica-announce-port的值,告诉Sentinel哨兵实例,你读取我这个redis节点的时候,所能使用的ip和端口
    当然你也可以在创建redis容器的时候,直接修改配置文件的值,这下面只是我给你举的一个例子
例如:算了,怕你看不懂,全写出来吧
docker   run  --name  redis1   -p  6389:6379  -v   /redis1:/etc/redis/conf    -d  redis    redis-server /etc/redis/conf/redis.conf   --replica-announce-ip   192.168.0.179   --replica-announce-port   6389  
docker   run  --name  redis2   -p  6390:6379  -v   /redis2:/etc/redis/conf    -d  redis    redis-server /etc/redis/conf/redis.conf   --replica-announce-ip   192.168.0.179   --replica-announce-port   6390
docker   run  --name  redis3   -p  6391:6379  -v   /redis3:/etc/redis/conf    -d  redis    redis-server /etc/redis/conf/redis.conf   --replica-announce-ip   192.168.0.179   --replica-announce-port   6391    
                    //这里你所创建的这个redis容器正好只能通过192.168.0.179:6389来访问
                   //所以可以使用replica-announce-ip和replica-announce-port就是告诉哨兵指定要使用这个ip和端口来连接我这个从节点, 这两个属性只是redis配置文件中的一个声明的作用,它并不会对redis容器内部产生影响,容器内部的服务端口还是6379


  


   然后在搭建哨兵集群之前,同样需要先设置对应的sentinel.conf配置文件,并放在目录中和所创建的容器进行挂载
   将sentinel.conf放在本地的D:\新建文件夹\redis\Sentinel\s1目录中
   如果你想要创建5个sentinel哨兵实例的话,直接创建五个目录用来存放sentinel实例的配置文件,
   在创建sentinal.conf配置文件,添加内容如下:
     port   27001              #设置监听端口,也就是Sentinel实例运行的端口。 我总共会创建三个sentinel实例,其他两个实例的端口分别为27002和27003
     sentinel   monitor   mymaster   192.168.0.179    6389   3        #后面的ip和端口为主节点的连接地址, 并为该sentinel集群起名为mymaster,  主要用来监控主节点的
                                                                                           #这个2就是判断是否下线的指定数量,一共三个sentinal, 有两个认为下线了,则一定是下线了
                                                                                           #其次Sentinel实例可以直接从所监控的master节点中得到所有的slave节点信息

    sentinel down-after-milliseconds mymaster 5000            #这个表示当5秒没有响应sentinel实例就会认为所监控的主节点主观下线, 默认值是30秒

   sentinel  failover-timeout  mymaster   5000                    #这个是选举失败的情况下,多久重新进行选举


 最后开始创建sentinel实例,主要都是用来监控主节点的:
docker  run  --name  sentinel01  -p   27001:27001  -v  D:\新建文件夹\redis\Sentinel\s1:/etc/redis/sentinel   -d   redis    redis-sentinel  /etc/redis/sentinel/sentinel.conf                 //这里加载的是sentinel.conf配置文件
docker  run  --name  sentinel02  -p   27002:27002  -v  D:\新建文件夹\redis\Sentinel\s2:/etc/redis/sentinel   -d   redis    redis-sentinel  /etc/redis/sentinel/sentinel.conf
docker  run  --name  sentinel03  -p   27003:27003  -v  D:\新建文件夹\redis\Sentinel\s3:/etc/redis/sentinel   -d   redis    redis-sentinel  /etc/redis/sentinel/sentinel.conf
docker  run  --name  sentinel04  -p   27004:27004  -v  D:\新建文件夹\redis\Sentinel\s4:/etc/redis/sentinel   -d   redis    redis-sentinel  /etc/redis/sentinel/sentinel.conf
docker  run  --name  sentinel05  -p   27005:27005  -v  D:\新建文件夹\redis\Sentinel\s5:/etc/redis/sentinel   -d   redis    redis-sentinel  /etc/redis/sentinel/sentinel.conf
   就相当于启动容器并执行sentinel.conf配置文件
   所有的sentinel实例主要用来监测主节点, 并在配置文件中已经定义了当有多少个sentinel实例认为主节点下线,主节点就一定下线了
   这里定义的是3个,一般这里定义的数量要超过sentinel实例的一半,这样判断起来才准确,
   其次所创建的sentinel实例随便多少个,不过最好要有三个,这样判断主节点是否下线才会比较准确, 

哨兵日志解读:

1:X 30 Jul 2024 10:41:03.581 * +slave slave 172.30.0.1:6390 172.30.0.1 6390 @ mymaster 192.168.0.179 6389            
1:X 30 Jul 2024 10:41:03.581 * +slave slave 172.30.0.6:6390 172.30.0.6 6390 @ mymaster 192.168.0.179 6389
1:X 30 Jul 2024 10:41:03.581 * +slave slave 172.30.0.7:6390 172.30.0.7 6390 @ mymaster 192.168.0.179 6389

最开始我没有在redis容器的配置文件中设置replica-announce-ip和replica-announce-port的值,导致哨兵实例在读取redis容器信息的时候,不知道具体使用哪一个ip, 搞不懂这里的6389端口居然有三个ip地址,最终报错,搞半天

-

-

-

-

-

-

然后再启动哨兵实例,日志显示:
+monitor master mymaster 192.168.0.179 6389 quorum 2                //开始监控主节点
+slave slave 192.168.0.179 6390    192.168.0.179 6390 @ mymaster 192.168.0.179 6389              //开始添加端口为6390的从节点
+slave slave 192.168.0.179  6391   192.168.0.179  6391 @ mymaster 192.168.0.179 6389              //开始添加端口为6391的从节点

-

-

-

-

-

然后当关闭主节点后,哨兵实例的日志显示:
 +switch-master mymaster 192.168.0.179 6389   192.168.0.179  6390           //成功选举端口6390的slave节点成为新的master节点


+slave slave 192.168.0.179:6391    192.168.0.179 6391 @ mymaster 192.168.0.179  6390     //开始添加从节点信息,这里将6391添加到主节点6390中去


+slave slave 192.168.0.179:6389    192.168.0.179 6389 @ mymaster 192.168.0.179  6390      //这里将所宕机的6389添加成从节点


+sdown slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179  6390         //发现6389端口的设备处于下线状态
   

-

-

-

-

-

然后启动之前所关闭的6389端口的容器,会发现哨兵实例的日志显示:
1:X 30 Jul 2024 12:00:08.251 # -sdown slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179 6390         //-sdown表示发现6389端口的设备已经重新上线了


1:X 30 Jul 2024 12:00:18.256 * +convert-to-slave slave 192.168.0.179:6389 192.168.0.179 6389 @ mymaster 192.168.0.179 6390              //这里就是在修改6389设备的配置文件,让6389成为6390的从节点                                                                                      


总结:redis集群和哨兵集群的一次性搭建

目录结构:

 自己看吧:

第一级目录

-

-

-

-

第二级目录

-

-

-

第三级目录

docker-compose.yml文件的内容:

version: "3.2"

services:
  redis1:
    image: redis
    volumes:
    - "D:/新建文件夹/redis/redis/6389:/etc/redis/conf"                      #不能挂载data目录,否则搭建的时候报错
    ports:                                                                                        #挂载配置文件目录
      - "6389:6379"
    command: redis-server /etc/redis/conf/redis.conf   --replica-announce-ip   192.168.0.179   --replica-announce-port   6389    #加载配置文件,并声明哨兵实例所能使用的ip和端口

  redis2: 
    image: redis
    volumes:
      - "D:/新建文件夹/redis/redis/6390:/etc/redis/conf"
    ports:
      - "6390:6379"
    command: redis-server /etc/redis/conf/redis.conf    --replica-announce-ip   192.168.0.179   --replica-announce-port   6390

  redis3:
    image: redis
    volumes:
      - "D:/新建文件夹/redis/redis/6391:/etc/redis/conf"
    ports:
      - "6391:6379"
    command: redis-server /etc/redis/conf/redis.conf    --replica-announce-ip   192.168.0.179   --replica-announce-port   6391


  sentinel1:                  #创建哨兵实例
    image: redis
    volumes:
      - "D:/新建文件夹/redis/Sentinel/s1:/etc/redis/sentinel"
    ports:
      - "27001:27001"
    command: redis-sentinel /etc/redis/sentinel/sentinel.conf

  sentinel2:
    image: redis
    volumes:
      - "D:/新建文件夹/redis/Sentinel/s2:/etc/redis/sentinel"
    ports:
      - "27002:27002"
    command: redis-sentinel /etc/redis/sentinel/sentinel.conf


  sentinel3:
    image: redis
    volumes:
      - "D:/新建文件夹/redis/Sentinel/s3:/etc/redis/sentinel"
    ports:
      - "27003:27003"
    command: redis-sentinel /etc/redis/sentinel/sentinel.conf

<think>好的,我现在需要帮助用户理解Redis集群哨兵模式在Spring中的配置差异。首先,我应该回顾一下用户提供的引用内容,特别是引用[1]、[2]、[3],这些资料提到了Spring Data Redis的配置、Redis集群哨兵模式的部署,以及具体的配置示例。 首先,我需要明确Redis集群哨兵模式的基本概念。根据引用[2],Redis集群Redis3.0引入的官方分布式解决方案,而哨兵模式主要用于高可用性,监控主从节点并在主节点故障时进行故障转移。接下来,用户想知道在Spring中这两种模式如何配置,所以需要对比它们的配置方式实现步骤。 根据引用[1],Spring Data Redis通过配置可以支持集群哨兵模式。引用[3]提到了在YAML中配置哨兵模式的具体参数,比如哨兵节点、主节点名称密码。而集群模式的配置可能涉及到不同的属性,比如集群节点最大重定向次数。 接下来,我需要整理这两种模式在Spring中的配置差异。可能包括不同的配置属性(如spring.redis.sentinelspring.redis.cluster)、连接工厂类的选择(Jedis或Lettuce),以及是否需要额外的依赖。另外,需要注意在Spring Boot中,Lettuce默认支持集群,而Jedis可能需要额外配置。 还要考虑代码示例部分,用户可能需要看到具体的YAML配置Java配置类。比如,哨兵模式需要指定master名称sentinel节点,而集群模式需要配置节点地址拓扑刷新等属性。同时,可能需要提到连接池的配置,虽然这不是模式特有的,但也是常见配置。 另外,需要指出适用场景的区别,帮助用户理解何时选择集群哨兵。比如,集群用于数据分片高并发,而哨兵用于高可用主从自动切换。同时,引用[2]提到Redis3.0的集群功能,可能影响版本兼容性,所以需要提醒用户注意版本要求。 最后,生成相关问题,可能需要围绕配置参数、连接工厂选择、版本差异、性能优化等方面提问,确保覆盖用户可能感兴趣的扩展话题。 现在,需要确保回答结构清晰,分点说明配置差异、实现方式,并给出示例代码配置。同时,引用提供的资料来支持说明,比如引用[3]中的YAML配置示例,引用[2]中关于集群的特性,引用[1]中的总结部分。</think>### Redis集群哨兵模式在Spring中的配置差异 #### 一、核心区别概述 1. **目标场景** - **哨兵模式**:主从架构的高可用方案,通过监控主节点实现故障自动转移[^2] - **集群模式**:分布式数据分片方案,支持水平扩展高并发访问[^2] 2. **配置关键点** - 哨兵依赖`主节点名称``哨兵节点列表` - 集群依赖`节点地址列表``拓扑刷新策略` --- #### 二、配置方式对比(YAML示例) **1. 哨兵模式配置** ```yaml spring: redis: password: 123456 sentinel: master: mymaster # 主节点名称 nodes: # 哨兵节点列表 - 192.168.1.101:26379 - 192.168.1.102:26379 - 192.168.1.103:26379 lettuce: pool: # 连接池配置(可选) max-active: 8 ``` *实现原理*:通过哨兵节点获取当前有效主节点地址[^3] **2. 集群模式配置** ```yaml spring: redis: password: 123456 cluster: nodes: # 集群节点列表(至少3个) - 192.168.1.201:6379 - 192.168.1.202:6379 - 192.168.1.203:6379 max-redirects: 3 # 最大重定向次数 lettuce: cluster: refresh: adaptive: true # 自动刷新拓扑 period: 2000 # 刷新间隔(ms) ``` *特性说明*:Lettuce客户端默认支持集群拓扑动态发现[^1] --- #### 三、代码实现差异 ```java // 公共配置类 @Configuration public class RedisConfig { // 哨兵模式连接工厂 @Bean public RedisConnectionFactory sentinelConnectionFactory(RedisProperties properties) { RedisSentinelConfiguration config = new RedisSentinelConfiguration() .master(properties.getSentinel().getMaster()) .sents(properties.getSentinel().getNodes().stream() .map(node -> new RedisNode(node.split(":")[0], Integer.parseInt(node.split(":")[1]))) .collect(Collectors.toSet())); return new LettuceConnectionFactory(config); } // 集群模式连接工厂 @Bean public RedisConnectionFactory clusterConnectionFactory(RedisProperties properties) { RedisClusterConfiguration config = new RedisClusterConfiguration( properties.getCluster().getNodes()); config.setMaxRedirects(properties.getCluster().getMaxRedirects()); return new LettuceConnectionFactory(config); } } ``` --- #### 四、选择建议 | 维度 | 哨兵模式 | 集群模式 | |--------------|------------------------------|------------------------------| | 数据规模 | 单节点内存可容纳 | 需要分片存储 | | 写入吞吐量 | 主节点单点写入(万级QPS) | 多主节点并行写入(十万级QPS) | | 故障恢复速度 | 30秒级切换[^3] | 依赖分片迁移 | | Spring版本 | 所有版本支持 | 需Spring Data 2.0+ | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值