Docker + Redis 部署集群的实现步骤

2025-11-14 06:50

本文主要是介绍Docker + Redis 部署集群的实现步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Docker+Redis部署集群的实现步骤》本文详细介绍了在三台服务器上部署高可用Redis集群的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

一、环境准备

1. 服务器规划(3 台服务器)

服务器IP 地址角色运行 Redis 节点开放端口(防火墙)
server1192.168.1.100主节点 1 + 从节点 1redis-6379(主)、redis-6380(从)6379-6380(Redis 端口)、16379-16380(集群总线端口)
server2192.168.1.101主节点 2 + 从节点 2redis-6379(主)、redis-6380(从)同上
server3192.168.1.102主节点 3 + 从节点 3redis-6379(主)、redis-6380(从)同上
  • 端口说明:Redis 集群需开放 服务端口(如 6379)和 集群总线端口(服务端口 + 10000,如 16379),总线端口用于节点间通信。

2. 防火墙配置(三台服务器均执行)

# 开放 Redis 服务端口和集群总线端口
sudo firewall-cmd --permanent --add-port=6379-6380/tcp
sudo firewall-cmd --permanent --add-port=16379-16380/tcp
sudo firewall-cmd --reload

3. 安装 Docker 并配置跨主机通信

三台服务器均需安装 Docker,并确保彼此网络互通(可 ping 通对方 IP)。无需额外创建 Docker 网络,直接通过 主机 IP + 端口 实现跨服务器节点通信。

二、部署 Redis 节点(每台服务器部署 2 个节点)

1. 在 server1(192.168.1.100)部署节点

# 创建数据目录(持久化用)
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis

# 启动主节点(6379)
docker run -d \
  --name redis-6379 \
  --net host \  # 使用主机网络,避免端口映射问题(推荐集群模式)
  -v /data/redis/6379:/data \
  redis:7-alpine \
  redis-server \
  --port 6379 \
  --cluster-enabled yes \  # 开启集群模式
  --cluster-config-file nodes-6379.conf \  # 集群配置文件
  --cluster-node-timeout 5000 \  # 节点超时时间(毫秒)
  --appendonly yes \  # 开启 AOF 持久化
  --requirepass "D83544E45CA39C7653BF21612FAD0FD1" \  # 密码(所有节点必android须一致)
  --masterauth "D83544E45CA39C7653BF21612FAD0FD1"  # 主从同步密码(与 requirepass 一致)

# 启动从节点(6380,后续会被分配到其他主节点)
docker run -d \
  --name redis-6380 \
  --net host \
  -v /data/redis/6380:/data \
  redis:7-alpine \
  redis-server \
  --port 6380 \
  --cluster-enabled yes \
  --cluster-config-file nodes-6380.conf \
  --cluster-node-timeout 5000 \
  --appendonly yes \
  --requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
  --masterauth "D83544E45CA39C7653BF21612FAD0FD1"

2. 在 server2(192.168.1.101)部署节点

# 创建数据目录
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis

# 启动主节点(6379)
docker run -d \
  --name redis-6379 \
  --net host \
  -v /data/redis/6379:/data \
  redis:7-alpine \
  redis-server \
  --port 63China编程79 \
  --cluster-enabled yes \
  --cluster-config-file nodes-6379.conf \
  --cluster-node-timeout 5000 \
  --appendonly yes \
  --requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
  --masterauth "D83544E45CA39C7653BF21612FAD0FD1"

# 启动从节点(6380)
docker run -d \
  --name redis-6380 \
  --net host \
  -v /data/redis/6380:/dajsta \
  redis:7-alpine \
  redis-server \
  --port 6380 \
  --cluster-enabled yes \
  --cluster-config-file nodes-6380.conf \
  --cluster-node-timeout 5000 \
  --appendonly yes \
  --requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
  --masterauth "D83544E45CA39C7653BF21612FAD0FD1"

3. 在 server3(192.168.1.102)部署节点

# 创建数据目录
mkdir -p /data/redis/{6379,6380} && chmod 777 -R /data/redis

# 启动主节点(6379)
docker run -d \
  --name redis-6379 \
  --net host \
  -v /data/redis/6379:/data \
  redis:7-alpine \
  redis-server \
  --port 6379 \
  --cluster-enabled yes \
  --cluster-config-file nodes-6379.conf \
  --cluster-node-timeout 5000 \
  --appendonly yes \
  --requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
  --masterauth "D83544E45CA39C7653BF21612FAD0FD1"

# 启动从节点(6380)
docker run -d \
  --name redis-6380 \
  --net host \
  -v /data/redis/6380:/data \
  redis:7-alpine \
  redis-server \
  --port 6380 \
  --cluster-enabled yes \
  --cluster-config-file nodes-6380.conf \
  --cluster-node-timeout 5000 \
  --appendonly yes \
  --requirepass "D83544E45CA39C7653BF21612FAD0FD1" \
  --masterauth "D83544E45CA39C7653BF21612FAD0FD1"

三、创建 Redis 集群(关键步骤)

在任意一台服务器(如 server1)执行集群创建命令,将 6 个节点(3 主 3 从)加入集群:

1. 进入 server1 的任意 Redis 容器(如 redis-6379)

bash

docker exec -it redis-6379 sh 

2. 执行集群创建命令

# 格式:redis-cli --cluster create 节点1:端口 节点2:端口 ... --cluster-replicas 1 --password 密码
redis-cli -a D83544E45CA39C7653BF21612FAD0FD1 \
--cluster create \
192.168.1.100:6379 \
192.168.1.101:6379 \
192.168.1.102:6379 \
192.168.1.100:6380 \
192.168.1.101:6380 \
192.168.1.102:6380 \
--cluster-replicas 1
# 每个主节点对应 1 个从节点

  • 参数说明--cluster-replicas 1 表示 “1 个主节点对应 1 个从节点”,6 个节点将自动分配为 3 主 3 从。前 3 个节点默认作为主节点,后 3 个作为从节点(自动关联到主节点)。

3. 确认集群配置

执行命令后,会显示节点分配方案,输入 yes 确认:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0-5460
Master[1] -> Slots 5461-10922
Master[2] -> Slots 10923-16383
Adding replica 192.168.1.101:6380 to 192.168.1.100:6379
Adding replica 192.168.1.102:6380 to 192.168.1.101:6379
Adding replica 192.168.1.100:6380 to 192.168.1.102:6379
>>> Trying to optimize slaves allocation for anti-affinity
...
Do you want to proceed with the proposed configuration? (type 'yes' to accept): yes

四、验证集群状态

1. 查看集群信息

在任意节点容器内执行(需带密码):

# 连接集群(-c 表示集群模式)
redis-cli -c -h 192.168.1.100 -p 6379 -a D83544E45CA39C7653BF21612FAD0FD1

# 查看集群状态
cluster info

# 查看节点列表(角色、ID、 slots 等)
cluster nodes
  • 正常输出中,cluster_state:ok 表示集群健康;
  • 节点列表中,master 标识主节点,slave 标识从节点,并显示对应主节点的 ID。

2. 测试数据读写与分片

# 在集群模式下设置 key(会自动路由到对应主节点)
set test-key "hello redis cluster"

# 获取 key(自动路由)
get test-key

# 查看 key 所在的槽位和节点
cluster keyslot test-key

五、高可用测试(主节点故障转移)

模拟主节点故障:在 server1 停止主节点容器(6379):

docker stopythonp redis-6379 

观察从节点是否自动升级为主节点:在任意节点容器内执行 cluster nodes,查看原 server1:6380(从节点)是否变为 master

恢复故障节点:重启 server1 的 6379 容器,它会自动作为从节点加入集群:

docker start redis-6379 

六、关键配置说明

  • --net host 的作用:使用主机网络模式,避免 Docker 端口映射的复杂配置,使 Redis 节点直接通过服务器 IP + 端口通信(集群必须)。
  • 密码一致性:所有节点的 requirepass(访问密码)和 masterauth(主从同步密码)必须相同,否则从节点无法同步主节点数据。
  • 持久化:通过 -v /data/redis/6379:/data 挂载数据目录,确保 Redis 数据持久化(重启容器不丢失数据)。
  • 集群总线端口:必须开放 端口 + 10000(如 6379 对应 16379),用于节点间的心跳检测和数据同步。

七、常见问题解决

  • 集群创建失败:检查所有节点是否启动、端口是否开放、服务器间是否互通,以及密码是否一致。
  • 从节点无法同步主节点:确认 masterauth 与主节点 requirepass 一致,且主节点防eCNwgt火墙未拦截从节点的同步请求。
  • 节点重启后脱离集群:确保数据目录挂载正确(/data/redis/端口),集群配置文件(nodes-端口.conf)会保存在挂载目录,重启后自动加载。

通过以上步骤,可在三台服务器上部署一个高可用的 Redis 集群,实现数据分片存储和自动故障转移,适合生产环境使用。

到此这篇关于Docker + Redis 部署集群的实现步骤的文章就介绍到这了,更多相关Docker Redis 部署集群内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Docker + Redis 部署集群的实现步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156168

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换