跳到文章内容
技术手记

xz 的技术手记

把问题想清楚,
把过程记下来。

关于代码、实践,以及一点一滴的理解。

开始阅读

Redis-主从+哨兵的搭建

下面以 3 台服务器,每台运行一个 Redis 和一个哨兵 为例。

服务器 Redis 端口与初始角色 哨兵端口
A:10.0.0.21 6379,主库 26379
B:10.0.0.22 6379,从库 26379
C:10.0.0.23 6379,从库 26379

1. 配置 Redis 主从

三台服务器的 redis.conf 都配置:

port 6379

# 三台 Redis 使用相同的数据访问密码,请替换示例值
requirepass RedisDataPass_change_me

# 当前节点成为从库时,连接主库使用的密码
masterauth RedisDataPass_change_me

replica-read-only yes

每台再配置自己的监听地址。例如 A:

bind 127.0.0.1 10.0.0.21

B、C 分别替换成自己的 IP,并且额外增加:

# 初始主库为 A
replicaof 10.0.0.21 6379

A 不加 replicaof。随后在三台服务器分别启动:

redis-server /etc/redis/redis.conf

此时关系是:

A 主库
├── B 从库
└── C 从库

2. 配置三个哨兵

三台服务器分别创建 sentinel.conf,内容基本相同:

port 26379

# 哨兵自身的访问密码,三个哨兵保持一致
requirepass SentinelPass_change_me

# 监控名为 mymaster 的主库 A
# 2 表示至少两个哨兵判定主库不可用
sentinel monitor mymaster 10.0.0.21 6379 2

# 哨兵访问 Redis 数据节点使用的密码
sentinel auth-pass mymaster RedisDataPass_change_me

# 连续 5 秒未收到有效响应,判定该节点主观下线
sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 60000

# 切换后,每次允许一个从库重新同步新主库
sentinel parallel-syncs mymaster 1

每台再加自己的监听地址,例如 A:

bind 127.0.0.1 10.0.0.21

分别启动:

redis-server /etc/redis/sentinel.conf --sentinel

注意:

  • 哨兵会自动发现 B、C,不用逐个填写。
  • 实际故障转移还需要多数哨兵授权。
  • sentinel.conf 及其所在目录需要允许哨兵进程写入,以保存发现的节点和切换结果。
  • 服务器之间要能访问相应的 6379、26379 端口。

3. Spring Boot 配置 Lettuce

引入依赖,默认客户端就是 Lettuce:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Spring Boot 3.x 的 application.yml:

spring:
  data:
    redis:
      # Redis 数据节点密码
      password: ${REDIS_PASSWORD}
      connect-timeout: 2s
      timeout: 2s

      sentinel:
        master: mymaster

        # 哨兵自身的密码
        password: ${REDIS_SENTINEL_PASSWORD}

        nodes:
          - 10.0.0.21:26379
          - 10.0.0.22:26379
          - 10.0.0.23:26379

两个环境变量分别填写前面设置的两类密码。

这里不需要连接池,也不需要额外开启读写分离,就可以支持发现新主库。 业务继续使用 StringRedisTemplate 即可。

4. 验证配置

查看主从状态,输入 Redis 数据密码:

redis-cli -h 10.0.0.21 -p 6379 --askpass INFO replication

分别检查三台:初始 A 应为 role:master,B、C 应为 role:slave。

向哨兵查询当前主库,输入哨兵密码:

redis-cli -h 10.0.0.21 -p 26379 --askpass SENTINEL get-master-addr-by-name mymaster

初始应返回 A 的地址。可以在测试环境停止 A 的 Redis 进程,验证主库地址是否切换,以及应用能否恢复读写。

整个过程是:

你配置初始主从
→ 哨兵监控并负责故障切换
→ Lettuce 查询哨兵,连接当前主库

切换期间可能短暂报错,异步复制也意味着切换存在丢失部分写入的风险。

posted @ 2026-11-08 11:45  xz_move_on  阅读(9)  评论(0)    收藏  举报