Docker + Redis 部署集群的实现步骤
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、环境准备</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 服务器规划(3 台服务器)</a></li><li><a href="#_lab2_0_1">2. 防火墙配置(三台服务器均执行)</a></li><li><a href="#_lab2_0_2">3. 安装 Docker 并配置跨主机通信</a></li></ul><li><a href="#_label1">二、部署 Redis 节点(每台服务器部署 2 个节点)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_3">1. 在 server1(192.168.1.100)部署节点</a></li><li><a href="#_lab2_1_4">2. 在 server2(192.168.1.101)部署节点</a></li><li><a href="#_lab2_1_5">3. 在 server3(192.168.1.102)部署节点</a></li></ul><li><a href="#_label2">三、创建 Redis 集群(关键步骤)</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_6">1. 进入 server1 的任意 Redis 容器(如 redis-6379)</a></li><li><a href="#_lab2_2_7">2. 执行集群创建命令</a></li><li><a href="#_lab2_2_8">3. 确认集群配置</a></li></ul><li><a href="#_label3">四、验证集群状态</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_9">1. 查看集群信息</a></li><li><a href="#_lab2_3_10">2. 测试数据读写与分片</a></li></ul><li><a href="#_label4">五、高可用测试(主节点故障转移)</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">六、关键配置说明</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">七、常见问题解决</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、环境准备</h2><p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 服务器规划(3 台服务器)</h3>
<table><thead><tr><th>服务器</th><th>IP 地址</th><th>角色</th><th>运行 Redis 节点</th><th>开放端口(防火墙)</th></tr></thead><tbody><tr><td>server1</td><td>192.168.1.100</td><td>主节点 1 + 从节点 1</td><td>redis-6379(主)、redis-6380(从)</td><td>6379-6380(Redis 端口)、16379-16380(集群总线端口)</td></tr><tr><td>server2</td><td>192.168.1.101</td><td>主节点 2 + 从节点 2</td><td>redis-6379(主)、redis-6380(从)</td><td>同上</td></tr><tr><td>server3</td><td>192.168.1.102</td><td>主节点 3 + 从节点 3</td><td>redis-6379(主)、redis-6380(从)</td><td>同上</td></tr></tbody></table>
<ul><li><strong>端口说明</strong>:Redis 集群需开放 <strong>服务端口</strong>(如 6379)和 <strong>集群总线端口</strong>(服务端口 + 10000,如 16379),总线端口用于节点间通信。</li></ul>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 防火墙配置(三台服务器均执行)</h3>
<div class="jb51code"><pre class="brush:bash;"># 开放 Redis 服务端口和集群总线端口
sudo firewall-cmd --permanent --add-port=6379-6380/tcp
sudo firewall-cmd --permanent --add-port=16379-16380/tcp
sudo firewall-cmd --reload</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>3. 安装 Docker 并配置跨主机通信</h3>
<p>三台服务器均需安装 Docker,并确保彼此网络互通(可 ping 通对方 IP)。无需额外创建 Docker 网络,直接通过 <strong>主机 IP + 端口</strong> 实现跨服务器节点通信。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、部署 Redis 节点(每台服务器部署 2 个节点)</h2>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>1. 在 server1(192.168.1.100)部署节点</h3>
<div class="jb51code"><pre class="brush:bash;"># 创建数据目录(持久化用)
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"
</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>2. 在 server2(192.168.1.101)部署节点</h3>
<div class="jb51code"><pre class="brush:bash;"># 创建数据目录
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"
</pre></div>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>3. 在 server3(192.168.1.102)部署节点</h3>
<div class="jb51code"><pre class="brush:bash;"># 创建数据目录
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"
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、创建 Redis 集群(关键步骤)</h2>
<p>在任意一台服务器(如 server1)执行集群创建命令,将 6 个节点(3 主 3 从)加入集群:</p>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>1. 进入 server1 的任意 Redis 容器(如 redis-6379)</h3>
<p>bash</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it redis-6379 sh </pre></div>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>2. 执行集群创建命令</h3>
<div class="jb51code"><pre class="brush:sql;"># 格式: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 个从节点
</pre></div>
<ul><li><strong>参数说明</strong>:<code>--cluster-replicas 1</code> 表示 “1 个主节点对应 1 个从节点”,6 个节点将自动分配为 3 主 3 从。前 3 个节点默认作为主节点,后 3 个作为从节点(自动关联到主节点)。</li></ul>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>3. 确认集群配置</h3>
<p>执行命令后,会显示节点分配方案,输入 <code>yes</code> 确认:</p>
<div class="jb51code"><pre class="brush:plain;">>>> Performing hash slots allocation on 6 nodes...
Master -> Slots 0-5460
Master -> Slots 5461-10922
Master -> 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
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、验证集群状态</h2>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>1. 查看集群信息</h3>
<p>在任意节点容器内执行(需带密码):</p>
<div class="jb51code"><pre class="brush:sql;"># 连接集群(-c 表示集群模式)
redis-cli -c -h 192.168.1.100 -p 6379 -a D83544E45CA39C7653BF21612FAD0FD1
# 查看集群状态
cluster info
# 查看节点列表(角色、ID、 slots 等)
cluster nodes
</pre></div>
<ul><li>正常输出中,<code>cluster_state:ok</code> 表示集群健康;</li><li>节点列表中,<code>master</code> 标识主节点,<code>slave</code> 标识从节点,并显示对应主节点的 ID。</li></ul>
<p class="maodian"><a name="_lab2_3_10"></a></p><h3>2. 测试数据读写与分片</h3>
<div class="jb51code"><pre class="brush:bash;"># 在集群模式下设置 key(会自动路由到对应主节点)
set test-key "hello redis cluster"
# 获取 key(自动路由)
get test-key
# 查看 key 所在的槽位和节点
cluster keyslot test-key
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、高可用测试(主节点故障转移)</h2>
<p><strong>模拟主节点故障</strong>:在 server1 停止主节点容器(6379):</p>
<div class="jb51code"><pre class="brush:bash;">docker stop redis-6379 </pre></div>
<p><strong>观察从节点是否自动升级为主节点</strong>:在任意节点容器内执行 <code>cluster nodes</code>,查看原 server1:6380(从节点)是否变为 <code>master</code>。</p>
<p><strong>恢复故障节点</strong>:重启 server1 的 6379 容器,它会自动作为从节点加入集群:</p>
<div class="jb51code"><pre class="brush:bash;">docker start redis-6379 </pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>六、关键配置说明</h2>
<ul><li><code>--net host</code><strong> 的作用</strong>:使用主机网络模式,避免 Docker 端口映射的复杂配置,使 Redis 节点直接通过服务器 IP + 端口通信(集群必须)。</li><li><strong>密码一致性</strong>:所有节点的 <code>requirepass</code>(访问密码)和 <code>masterauth</code>(主从同步密码)必须相同,否则从节点无法同步主节点数据。</li><li><strong>持久化</strong>:通过 <code>-v /data/redis/6379:/data</code> 挂载数据目录,确保 Redis 数据持久化(重启容器不丢失数据)。</li><li><strong>集群总线端口</strong>:必须开放 <code>端口 + 10000</code>(如 6379 对应 16379),用于节点间的心跳检测和数据同步。</li></ul>
<p class="maodian"><a name="_label6"></a></p><h2>七、常见问题解决</h2>
<ul><li><strong>集群创建失败</strong>:检查所有节点是否启动、端口是否开放、服务器间是否互通,以及密码是否一致。</li><li><strong>从节点无法同步主节点</strong>:确认 <code>masterauth</code> 与主节点 <code>requirepass</code> 一致,且主节点防火墙未拦截从节点的同步请求。</li><li><strong>节点重启后脱离集群</strong>:确保数据目录挂载正确(<code>/data/redis/端口</code>),集群配置文件(<code>nodes-端口.conf</code>)会保存在挂载目录,重启后自动加载。</li></ul>
<p>通过以上步骤,可在三台服务器上部署一个高可用的 Redis 集群,实现数据分片存储和自动故障转移,适合生产环境使用。</p>
頁:
[1]