三台服务器跑Redis主从哨兵,顺带讲下Docker和Springboot整合怎么弄
- 问答
- 2025-12-25 05:02:01
- 3
关于三台服务器跑Redis主从哨兵,以及Docker和Spring Boot整合,内容如下。
第一部分:三台服务器搭建Redis主从哨兵
这个方案的核心思想是:用三台服务器(比如IP分别是192.168.1.10, 192.168.1.11, 192.168.1.12)来搭建一个高可用的Redis集群,一台是主节点(Master),负责写数据;另外两台是从节点(Slave),负责复制主节点的数据,提供读服务,哨兵(Sentinel)是独立的进程,每台服务器上都运行一个,它们像侦察兵一样时刻监控着主节点是否健康,一旦主节点挂了,哨兵们会自动开会投票,从两个从节点中选出一个新的主节点,让系统继续正常工作,整个过程对使用Redis的应用程序来说是透明的。
具体操作步骤,大致是这样的:
-
在每台服务器上安装Redis:在三台服务器上都安装好Redis,包括Redis服务器本身和哨兵功能,它们通常在一个安装包里。
-
配置主从关系:
- 选定一台服务器作为主节点(比如192.168.1.10),修改它的Redis配置文件(redis.conf),主要设置包括:
bind 0.0.0.0(允许所有连接,生产环境要谨慎)、设置一个密码(requirepass yourpassword和masterauth yourpassword,为了安全)、以及一些常规优化。 - 配置另外两台服务器为从节点(192.168.1.11和192.168.1.12),它们的配置文件里,除了和主节点类似的基础设置外,最关键的是要加上一行:
replicaof 192.168.1.10 6379(老版本可能是slaveof),这行命令告诉它们去认192.168.1.10这台机器为主人,并复制其数据,同样,也要设置masterauth yourpassword,确保能从有密码的主节点那里同步数据。
- 选定一台服务器作为主节点(比如192.168.1.10),修改它的Redis配置文件(redis.conf),主要设置包括:
-
配置哨兵(Sentinel):
- 每台服务器上都有一个哨兵的配置文件(sentinel.conf)。
- 需要修改的关键参数是:
sentinel monitor mymaster 192.168.1.10 6379 2,这行意思是,哨兵监控着一个名叫mymaster的主节点,它的地址是192.168.1.10:6379,最后的数字2表示,当有2个哨兵都认为主节点下线时,才判定它为“客观下线”,这时才会触发自动故障转移。 - 还要配置
sentinel auth-pass mymaster yourpassword,因为哨兵也需要密码才能去监控有认证的Redis节点。 - 三台服务器的哨兵配置基本一样,这样它们才能互相发现并组成一个哨兵集群。
-
启动和验证:
- 按照顺序启动:先启动三台服务器的Redis服务,再启动三台服务器的哨兵服务。
- 连接到任意一个Redis节点,用
info replication命令查看主从状态,确认主从复制是否正常。 - 连接到任意一个哨兵节点,用
sentinel masters和sentinel slaves mymaster命令查看哨兵监控的状态。 - 可以进行故障模拟:手动停掉主节点的Redis服务,观察哨兵日志,看它是否自动选举出了新的主节点,并且应用程序是否能自动切换到新的主节点上。
这样一来,即使一台服务器完全宕机,只要不是同时宕机太多台,Redis服务依然能提供读写能力。

第二部分:Docker和Spring Boot整合怎么弄
用Docker来部署Spring Boot应用非常方便,可以实现一次构建,到处运行,整合的核心是将Spring Boot应用打包成一个Docker镜像,然后通过容器运行。
步骤如下:
-
准备Spring Boot应用:你有一个可以正常运行的Spring Boot项目,假设你用的是Maven来构建项目,在它的配置文件(比如application.yml)中,配置Redis的连接信息,这里不能直接写死IP,因为用Docker运行后,IP可能会变,通常的做法是:
- 连接地址可以写为
redis-sentinel这样的服务名(后面会解释),或者使用Docker的环境变量注入。spring: redis: sentinel: master: mymaster # 哨兵中定义的主节点名称 nodes: 192.168.1.10:26379,192.168.1.11:26379,192.168.1.12:26379 # 哨兵地址列表 password: yourpassword在Docker环境中,这个节点列表可以通过环境变量传入,增加灵活性。

- 连接地址可以写为
-
创建Dockerfile:在Spring Boot项目的根目录下,创建一个没有后缀的文件,名叫
Dockerfile,这个文件是构建镜像的说明书。# 第一阶段:构建项目(可选,但常见) FROM maven:3.8.5-openjdk-17 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # 第二阶段:运行项目 FROM openjdk:17-jdk-slim WORKDIR /app # 从上一阶段拷贝打包好的jar文件 COPY --from=builder /app/target/your-springboot-app.jar app.jar # 暴露端口(你的Spring Boot应用端口,比如8080) EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"]
这个Dockerfile做了两件事:先用Maven镜像把代码打包成jar包,然后再用一个更小的JDK镜像来运行这个jar包。
-
构建Docker镜像:在包含Dockerfile的目录下,打开终端,执行命令来构建镜像。
-t参数是给镜像起个名字和标签。docker build -t my-springboot-app:1.0 .
-
使用Docker Compose运行(推荐):现实中,你的应用需要和Redis哨兵集群一起工作,手动启动多个容器很麻烦,最好用
docker-compose.yml文件来统一管理。version: '3.8' services: # 定义你的Spring Boot应用服务 my-app: image: my-springboot-app:1.0 container_name: my-springboot-application ports: - "8080:8080" # 把容器的8080端口映射到宿主机的8080端口 environment: # 通过环境变量覆盖Spring Boot配置,指向Docker网络内的哨兵服务名 - SPRING_REDIS_SENTINEL_NODES=sentinel1:26379,sentinel2:26379,sentinel3:26379 - SPRING_REDIS_PASSWORD=yourpassword depends_on: - sentinel1 - sentinel2 - sentinel3 networks: - redis-net # 下面开始定义三台Redis服务器和哨兵(简化版,实际每台可能在不同主机) # 注意:这里为了演示,把Redis和哨兵都放在一个compose文件里,实际生产环境三台物理机需要分别配置。 redis-master: image: redis:7.0-alpine container_name: redis-master command: redis-server --requirepass yourpassword --masterauth yourpassword networks: - redis-net redis-slave1: image: redis:7.0-alpine container_name: redis-slave1 command: redis-server --requirepass yourpassword --masterauth yourpassword --replicaof redis-master 6379 depends_on: - redis-master networks: - redis-net redis-slave2: image: redis:7.0-alpine container_name: redis-slave2 command: redis-server --requirepass yourpassword --masterauth yourpassword --replicaof redis-master 6379 depends_on: - redis-master networks: - redis-net sentinel1: image: redis:7.0-alpine container_name: sentinel1 command: > sh -c " echo 'sentinel monitor mymaster redis-master 6379 2' > /etc/sentinel.conf && echo 'sentinel auth-pass mymaster yourpassword' >> /etc/sentinel.conf && echo 'sentinel down-after-milliseconds mymaster 5000' >> /etc/sentinel.conf && echo 'sentinel parallel-syncs mymaster 1' >> /etc/sentinel.conf && echo 'sentinel failover-timeout mymaster 10000' >> /etc/sentinel.conf && cat /etc/sentinel.conf && redis-sentinel /etc/sentinel.conf " depends_on: - redis-master - redis-slave1 - redis-slave2 networks: - redis-net # ... 类似地配置 sentinel2 和 sentinel3,并指向对应的Redis从节点主机名 networks: redis-net: driver: bridge这个Compose文件定义了一个网络
redis-net,所有容器都在这个网络内,它们可以通过容器名(如redis-master,sentinel1)直接互相访问,这样Spring Boot应用里的Redis配置就可以写成sentinel1:26379,而不是固定的IP地址了。 -
启动所有服务:在
docker-compose.yml文件所在目录下,运行命令,它会按照依赖关系启动所有定义的服务。docker-compose up -d
这样,你就实现了在Docker环境中部署Spring Boot应用,并让它连接到一个高可用的Redis哨兵集群,应用本身和Redis集群都被容器化了,管理和部署变得非常清晰和简单。
本文由帖慧艳于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/67969.html
