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

 更新时间:2025年11月13日 11:00:45   作者:路過的好心人  
本文详细介绍了在三台服务器上部署高可用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" \  # 密码(所有节点必须一致)
  --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 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"

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 stop 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 一致,且主节点防火墙未拦截从节点的同步请求。
  • 节点重启后脱离集群:确保数据目录挂载正确(/data/redis/端口),集群配置文件(nodes-端口.conf)会保存在挂载目录,重启后自动加载。

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

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

相关文章

  • linux安装配置及使用redis

    linux安装配置及使用redis

    本文主要跟大家讲解的是在Linux环境下,Redis的安装与部署,非常的简单实用,有需要的小伙伴可以参考下
    2018-04-04
  • Redis实战之Lettuce的使用技巧详解

    Redis实战之Lettuce的使用技巧详解

    Lettuce 是 Redis 的一款高级 Java 客户端,与 Jedis 并列成为最热门的客户端之一,目前已成为 SpringBoot 2.0 版本默认的 redis 客户端。本文主要和大家讲讲Lettuce的使用技巧,感兴趣的可以了解一下
    2022-12-12
  • Redis过期键的删除策略分享

    Redis过期键的删除策略分享

    redis是内存型数据库,可对键设置过期时间,当键过期时时怎么淘汰这些键的呢?我们先来想一想,如果让我们设计,我们会想到哪些过期删除策略呢?本文给大家详细介绍了Redis过期键的删除策略,需要的朋友可以参考下
    2024-11-11
  • Django使用redis配置缓存的方法

    Django使用redis配置缓存的方法

    Redis是一个内存数据库由于其性能极高,因此经常作为中间件、缓存使用,缓存某些内容是为了保存昂贵计算的结果,这样就不必在下次执行计算,接下来通过本文给大家分享redis配置缓存的方法,感兴趣的朋友一起看看吧
    2021-06-06
  • Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind:解决方法

    Redis报错:Could not create server TCP 

    这篇文章主要介绍了Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind:解决方法,是安装与启动Redis过程中比较常见的问题,需要的朋友可以参考下
    2023-06-06
  • Redis中跳表的实现原理分析

    Redis中跳表的实现原理分析

    Redis中的跳表是一种高效的多层链表结构,通过随机概率算法决定节点的层数,从而实现快速的插入、删除和查询操作,跳表的平均时间复杂度为O(logn),最差情况为O(n),每个节点包含值和指向更高层节点的指针,以及回退指针以提高操作效率
    2025-02-02
  • 批量导入txt数据到的redis过程

    批量导入txt数据到的redis过程

    用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以"Product*"匹配的Key操作,提高了数据清理效率
    2025-08-08
  • redis搭建哨兵集群的实现步骤

    redis搭建哨兵集群的实现步骤

    本文主要介绍了redis搭建哨兵集群的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 如何打造redis缓存组件

    如何打造redis缓存组件

    文章介绍了如何使用热插拔AOP、反射、Redis自定义注解和SpringEL表达式来打造一个优雅的Redis缓存组件,通过这种方式,可以重构和简化缓存代码,并提供了Redis配置和自定义注解的详细说明,文章还包含了AOP测试的总结,并鼓励读者参考和支持
    2024-12-12
  • Redis全局ID生成器的实现

    Redis全局ID生成器的实现

    全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,本文主要介绍了Redis全局ID生成器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论