Redis哨兵(主从架构 + Sentinel)


整合 Sentinel 与现有主从架构的完整步骤


在这里插入图片描述

一、配置修正说明

您当前的配置存在概念混淆:cluster.nodes 是用于 Redis Cluster 模式 的配置,而主从架构 + Sentinel 需要使用 Sentinel 专用配置。以下是正确的整合方案:


二、正确配置方案

1. 修改 application.yml
spring:
  redis:
    # 删除 cluster 配置段
    # 新增 sentinel 配置段
    sentinel:
      master: mymaster  # 主节点名称(需与哨兵配置一致) 创建 Sentinel 配置文件 第二句里面的 这个 sentinel monitor mymaster 127.0.0.1 6379 2
      nodes:
        - 127.0.0.1:26379  # Sentinel 节点1
        - 127.0.0.1:26380  # Sentinel 节点2
        - 127.0.0.1:26381  # Sentinel 节点3
    # 保留原有配置
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 2
      read-from: REPLICA_PREFERRED # 开启读写分离
    # 密码配置(按需)
    password: your_redis_password  # Redis节点密码
    # Sentinel节点密码(如果哨兵有密码)
    sentinel:
      password: sentinel_password

配置写好之后无需关心内部是如何来处理的,写业务代码和之前的一个Redis是一样的。

三、Sentinel 服务端配置

1. 创建 Sentinel 配置文件
# 创建配置目录
mkdir -p /etc/redis/sentinel/{26379,26380,26381}

# Sentinel 1 (26379)
cat > /etc/redis/sentinel/26379/sentinel.conf <<EOF
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster your_redis_password
sentinel parallel-syncs mymaster 1
daemonize yes
logfile "/var/log/redis/sentinel_26379.log"
EOF

# Sentinel 2 (26380) 和 Sentinel 3 (26381) 配置类似,修改 port 和 logfile 路径

Sentinel 配置文件第二句这个 sentinel monitor mymaster 127.0.0.1 6379 2 指定了Redis主节点然后就需要其配置Redis的地址了,需要注意你配置的主节点的地址和端口号,上面这个只是一个例子而已。

2. 启动 Sentinel 服务
redis-sentinel /etc/redis/sentinel/26379/sentinel.conf
redis-sentinel /etc/redis/sentinel/26380/sentinel.conf
redis-sentinel /etc/redis/sentinel/26381/sentinel.conf

四、验证整合效果

1. 检查 Sentinel 拓扑发现
# 连接任意 Sentinel 节点
redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster

预期输出包含:

num-slaves 2  # 从节点数量
2. 客户端连接验证
@SpringBootTest
public class SentinelIntegrationTest {

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Test
    void testSentinelConnection() {
        LettuceConnectionFactory lettuceFactory = (LettuceConnectionFactory) connectionFactory;
        RedisSentinelConfiguration sentinelConfig = lettuceFactory.getSentinelConfiguration();
        
        System.out.println("当前主节点: " + lettuceFactory.getHostName() + ":" + lettuceFactory.getPort());
        System.out.println("哨兵节点列表: " + sentinelConfig.getSentinels());
    }
}

五、故障转移测试

1. 模拟主节点宕机
# 停止主节点 Redis 服务
redis-cli -p 6379 shutdown
2. 观察故障转移过程
# 查看 Sentinel 日志
tail -f /var/log/redis/sentinel_26379.log

预期日志内容:

+sdown master mymaster 127.0.0.1 6379
+vote-for-leader XXXX 1
+switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3. 验证客户端自动切换

重新运行测试用例,观察主节点地址是否变为新选举的主节点(如 6380)


六、生产环境优化配置

1. 安全加固
spring:
  redis:
    ssl: true  # 启用 TLS 加密
    lettuce:
      sentinel:
        password: $SENTINEL_PASSWORD  # 从环境变量读取
2. 连接池调优
spring:
  redis:
    lettuce:
      pool:
        max-wait: 1000ms  # 最大等待时间
        time-between-eviction-runs: 30s  # 空闲连接检查间隔
3. 监控配置
management:
  endpoints:
    web:
      exposure:
        include: health,metrics,redis
  metrics:
    export:
      prometheus:
        enabled: true

七、架构示意图

Spring Boot
Sentinel 26379
Sentinel 26380
Sentinel 26381
Master 6379
Slave 6380
Slave 6381

八、关键配置对照表

组件原配置新配置作用变化
Spring Bootcluster.nodessentinel.nodes从直连节点改为通过哨兵发现
Redis独立主从主从 + Sentinel 监控实现自动故障转移能力
客户端路由硬编码节点地址动态获取拓扑信息支持自动切换主节点

九、常见问题解决

问题1:客户端无法连接 Sentinel

现象RedisConnectionFailureException: Unable to connect to Sentinel
解决方案

  1. 检查 Sentinel 端口是否开放:netstat -tulnp | grep 26379
  2. 验证 Sentinel 认证密码是否正确
  3. 查看 Sentinel 日志:tail -f /var/log/redis/sentinel_26379.log
问题2:读写分离失效

现象:所有请求都路由到主节点
排查步骤

  1. 确认 read-from: REPLICA_PREFERRED 配置生效
  2. 检查从节点复制状态:redis-cli -p 6380 info replication
  3. 查看 Lettuce 拓扑发现结果:
    ((LettuceConnectionFactory) redisTemplate.getConnectionFactory()).getTopology()
    

通过以上配置,您的 Spring Boot 应用将实现:

  1. 自动故障转移:主节点宕机时自动切换
  2. 读写分离:读操作优先分发到从节点
  3. 动态拓扑感知:客户端实时感知集群状态变化
  4. 生产级可靠性:通过连接池和 SSL 确保稳定安全
<think>首先,用户的问题是基于之前的引用,但指令说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 然而,本次对话历史中没有显示上一次的问题和回答。在系统消息中,这是第一条用户消息,所以可能没有上一次的问题。系统消息中提到了“用户上一次的问题”,但查看上下文,这是对话的开始。 系统指令说:“尽可能多的参考用户上一次的问题和你的回答”,但由于这是第一条消息,我需要假设没有历史。用户消息中提到:“上述引用仅供参考,并不是用户真正的需求”,所以我应该专注于用户的当前问题。 用户当前问题是:“我想查找在docker中安装redis并配置主从和Sentinel的方法 请问docker安装redis并配置主从和Sentinel的详细步骤” 所以,我需要提供详细的步骤。 现在,回答必须遵循系统级指令: 1. 所有行内数学表达式使用 $...$ 格式。但在本上下文中,是关于Docker和Redis,所以可能没有数学表达式。如果有变量或路径,我应该考虑是否适用。例如,路径或端口号可能算作变量,但指令指定“变量、不等式、方程等”,所以可能不需要。尽量只在有数学内容时使用。 2. 独立公式使用 $$...$$。同样,可能不适用。 3. LaTeX语法正确。既然没有数学,可能不需要。 4. 使用中文回答。 5. 生成相关问题。指令说:“生成相关问题”,并在示例中显示在末尾。 6. 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。引用来自用户提供的引用[1]到[5],我应该引用这些作为来源。 用户提供了引用[1]到[5],是关于Docker Compose部署Redis主从和Sentinel集群的。所以,在回答中,我需要引用这些来源。 回答结构:指令说“回答结构清晰,帮助用户逐步解决问题”,所以需要逐步说明。 从引用中提取关键步骤: - 引用[1]:提到了使用Docker Compose部署Redis主从与Sentinel,配置文件的示例(redis-master.conf, redis-slave.conf, sentinel.conf)。 - 引用[2]:创建Sentinel配置文件,示例内容。 - 引用[3]:运行Sentinel容器的命令示例。 - 引用[4]:类似,docker run命令启动Sentinel。 - 引用[5]:Docker安装Redis+Sentinel,SpringBoot配置,但用户只问安装部分。 用户指定了“docker中安装redis并配置主从和Sentinel”,所以专注于安装和配置。 详细步骤大纲: 1. 准备Docker环境:确保Docker和Docker Compose已安装。 2. 创建配置文件目录。 3. 编写主Redis节点的配置文件。 4. 编写从Redis节点的配置文件。 5. 编写Sentinel配置文件。 6. 使用Docker Compose或docker run命令启动容器。 从引用[1]中,有Docker Compose配置的暗示。引用[5]也有部分。 我应该建议使用Docker Compose来简化,因为引用[1]提到它。 步骤: - 创建目录结构。 - 编写配置文件:主redis.conf, 从redis.conf, sentinel.conf。 - 编写docker-compose.yml文件。 - 运行docker-compose up。 在回答中,提供示例配置文件内容,基于引用。 例如: - 主节点配置:基于引用[1],redis-master.conf可能包括port, requirepass, etc. - 从节点配置:slaveof指向主节点。 - Sentinel配置:monitor主节点,auth-pass等。 然后,在docker-compose.yml中定义服务。 引用[2],[3],[4]提供了docker run命令,但Compose更清晰。 最终,在回答中: - 使用中文。 - 结构清晰:分步骤。 - 在引用内容的末尾添加引用标识。 - 生成相关问题。 相关问题示例:类似于示例中的“快速排序相关问题”。 例如: 1. 如何验证Redis主从复制是否正常工作? 2. 如何测试Sentinel故障转移? 3. 如何扩展Redis Sentinel集群? 4. Docker中部署Redis的常见问题? 现在,编写回答。 </think>### Docker 中安装 Redis 并配置主从与 Sentinel 的详细步骤 以下是基于 Docker 部署 Redis 主从(Replication)和 Sentinel哨兵)高可用集群的完整步骤。Sentinel 用于监控主节点的健康状态,并在故障时自动切换到从节点,确保集群的高可用性[^1]。整个过程使用 Docker Compose 工具简化部署,参考了用户提供的引用内容。步骤包括准备工作、配置文件创建、启动容器和验证配置。 #### **准备工作** 1. **确保 Docker 环境已安装** 在开始前,确保 Docker 和 Docker Compose 已安装在您的系统上。可以通过以下命令检查版本: ```bash docker --version docker-compose --version ``` 如果未安装,请参考 [Docker 官方文档](https://docs.docker.com/get-docker/)安装。 2. **创建项目目录结构** 在本地创建一个项目目录(例如 `redis-cluster`),并为其子目录用于存放配置文件和数据卷: ```bash mkdir -p redis-cluster/master redis-cluster/slave1 redis-cluster/slave2 redis-cluster/sentinel cd redis-cluster ``` 这个结构便于管理主节点、从节点和 Sentinel 的配置[^1]。 #### **步骤 1: 编写 Redis 配置文件** Redis 主从复制需要为每个节点创建配置文件。以下配置文件基于引用[1]和[2]的示例调整,确保安全性(如设置密码)。 - **主节点配置文件 (`master/redis.conf`)** 创建文件 `redis-cluster/master/redis.conf`,内容如下: ```conf port 6379 requirepass "123456" # 主节点密码,用于从节点和Sentinel认证 masterauth "123456" # 从节点连接主节点时使用相同密码 dir /data # 数据存储目录 daemonize no # 在Docker中保持前台运行 appendonly yes # 启用AOF持久化 protected-mode no # 禁用保护模式,允许外部访问 ``` 此配置指定 Redis 主节点监听端口 6379,并启用认证[^1][^2]。 - **从节点配置文件 (`slave1/redis.conf` 和 `slave2/redis.conf`)** 创建两个从节点配置文件(示例为 `slave1/redis.conf`),内容类似: ```conf port 6380 # 从节点端口,slave2 可设置为 6381 requirepass "123456" # 从节点密码 masterauth "123456" # 用于连接主节点的密码 replicaof master 6379 # 指向主节点(在Docker网络中通过服务名访问) dir /data # 数据存储目录 daemonize no appendonly yes protected-mode no ``` 注意:`replicaof` 参数指定主节点的服务名(在后续 Docker Compose 中定义为 `master`)和端口[^1][^5]。 #### **步骤 2: 编写 Sentinel 配置文件** Sentinel 监控 Redis 主节点,并在故障时选举新的主节点。创建多个 Sentinel 配置文件(例如 `sentinel/sentinel.conf`),参考引用[2]和[4]调整。 - **Sentinel 配置文件 (`sentinel/sentinel.conf`)** 创建文件 `redis-cluster/sentinel/sentinel.conf`,内容如下: ```conf port 26379 # Sentinel 端口(可复制文件用于多个Sentinel,端口改为26380等) dir "/tmp" # 临时目录 sentinel monitor the_master master 6379 2 # 监控主节点(名称"the_master",服务名"master",端口6379,quorum=2) sentinel auth-pass the_master 123456 # 主节点认证密码 sentinel failover-timeout the_master 10000 # 故障转移超时时间 sentinel deny-scripts-reconfig yes # 禁用脚本重配置,增强安全 daemonize no protected-mode no ``` 关键点: - `sentinel monitor the_master master 6379 2`:指定监控的主节点(服务名 `master`),`2` 表示需要至少 2 个 Sentinel 同意才能触发故障转移[^2][^4]。 - 如果需要多个 Sentinel,复制此文件并修改端口(如 26380),quorum 值保持至少 2 以确保高可用[^5]。 #### **步骤 3: 编写 Docker Compose 文件** 使用 Docker Compose 定义所有服务,简化启动过程。创建文件 `docker-compose.yml` 在项目根目录,内容如下(基于引用[1]和[5]调整): ```yaml version: '3.8' services: # Redis 主节点 master: image: redis:7.0.5 # 指定Redis镜像版本 container_name: redis-master command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./master/redis.conf:/usr/local/etc/redis/redis.conf - ./master/data:/data # 数据卷持久化数据 networks: - redis-net ports: - "6379:6379" # 暴露主节点端口 # Redis 从节点 1 slave1: image: redis:7.0.5 container_name: redis-slave1 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./slave1/redis.conf:/usr/local/etc/redis/redis.conf - ./slave1/data:/data networks: - redis-net ports: - "6380:6380" depends_on: - master # 确保主节点先启动 # Redis 从节点 2(可选,增加冗余) slave2: image: redis:7.0.5 container_name: redis-slave2 command: redis-server /usr/local/etc/redis/redis.conf volumes: - ./slave2/redis.conf:/usr/local/etc/redis/redis.conf - ./slave2/data:/data networks: - redis-net ports: - "6381:6381" depends_on: - master # Sentinel 节点 1 sentinel1: image: redis:7.0.5 container_name: sentinel-26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf networks: - redis-net ports: - "26379:26379" depends_on: - master - slave1 - slave2 # Sentinel 节点 2(增加Sentinel节点提高可靠性) sentinel2: image: redis:7.0.5 container_name: sentinel-26380 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf # 复用配置文件,实际中可为不同文件 networks: - redis-net ports: - "26380:26380" depends_on: - master # 定义自定义网络,确保容器间可通过服务名通信 networks: redis-net: driver: bridge ``` 关键点: - **网络配置**:自定义网络 `redis-net` 允许容器通过服务名(如 `master`)相互访问,避免 IP 硬编码[^1][^5]。 - **数据卷**:映射本地目录到容器内部,确保配置和数据持久化(避免重启丢失)[^3][^4]。 - **Sentinel 数量**:部署至少 2-3 个 Sentinel 节点,quorum 值设置为多数(例如 2)以支持故障转移[^2][^4]。 #### **步骤 4: 启动集群** 在项目根目录运行 Docker Compose 命令启动所有服务: ```bash docker-compose up -d # -d 后台运行 ``` 启动后,检查容器状态: ```bash docker ps # 确认所有容器正常运行 ``` #### **步骤 5: 验证配置** - **验证主从复制**:连接到主节点,检查复制状态: ```bash docker exec -it redis-master redis-cli -a 123456 info replication ``` 输出中应显示 `role:master` 和 `connected_slaves:2`(表示两个从节点已连接)[^1]。 - **验证 Sentinel 监控**:连接到 Sentinel 节点,检查主节点状态: ```bash docker exec -it sentinel-26379 redis-cli -p 26379 sentinel masters ``` 输出应显示主节点信息,包括 IP 和状态[^2][^5]。 - **测试故障转移**:手动停止主节点,Sentinel 应自动选举新主节点: ```bash docker stop redis-master docker exec -it sentinel-26379 redis-cli -p 26379 sentinel get-master-addr-by-name the_master ``` 输出应显示新的主节点 IP[^4]。 #### **注意事项** - **安全性**:密码(如 `123456`)仅为示例,生产环境应使用强密码并限制访问[^2]。 - **资源优化**:可根据需要调整容器资源(如 CPU 和内存),或添加更多从节点/Sentinel 节点增强可靠性[^5]。 - **备份恢复**:定期备份数据卷目录(如 `./master/data`),以防数据丢失[^1]。 通过以上步骤,您已成功在 Docker 中部署 Redis 主从与 Sentinel 集群。Sentinel 系统会自动处理故障转移,确保服务高可用[^1][^5]。 ### 相关问题 1. 如何监控 Redis Sentinel 的运行状态和日志? 2. Docker 中部署 Redis 主从时,如何处理网络配置冲突(如端口占用)? 3. 如何扩展 Redis Sentinel 集群以支持更多节点? 4. Spring Boot 应用如何配置连接到 Redis Sentinel 集群(如引用[5]中的示例)?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值