云计算百科
云计算领域专业知识百科平台

Redis集群实战:3主3从与容器部署

Redis集群实战:3主3从与容器部署

文章目录

  • Redis集群实战:3主3从与容器部署
    • redis集群(3主3从)
      • 一、核心概念
      • 二、工作原理
      • 三、使用场景
      • 四、操作步骤(3 主 3 从实战)
  • redis1
  • redis2
    • 容器部署redis
      • 容器部署基础

redis集群(3主3从)

Redis 集群(Cluster)是 Redis 3.0+ 官方推出的分布式解决方案,核心是数据分片(Sharding)+ 主

从复制 + 去中心化故障转移,解决单机 Redis 的容量、性能、单点故障瓶颈,实现水平扩展、高可用、

高并发。

一、核心概念

1. 基本定义

Redis 集群是无中心架构的分布式系统,数据自动分散到多个节点,每个节点只存部分数据;节点间通过Gossip 协议通信,自带故障转移,无需 Sentinel。

2. 关键角色

主节点(Master):处理读写、管理哈希槽、参与故障投票,是核心节点。

从节点(Replica/Slave):异步复制主节点数据,默认只读;主节点宕机时自动选举晋升为主。

哈希槽(Hash Slot):集群固定16384个槽(0~16383),是数据分片的最小单位。

节点 ID:每个节点唯一标识,用于集群内识别与通信。

3. 核心特性

数据分片:突破单机内存限制,总容量 = 所有主节点内存之和。

高可用:部分节点故障不影响整体,自动故障转移。

线性扩展:加节点即可提升容量与并发。

去中心化:无中心节点,避免单点瓶颈。

自动路由:客户端连接任意节点,自动重定向到目标节点。

二、工作原理

1. 数据分片(哈希槽机制)

槽位总数:16384(2¹⁴)。

键→槽映射

HASH_SLOT = CRC16(key) mod 16384

槽位分配

:每个主节点负责一段连续槽位(如 3 主集群:0-5460、5461-10922、10923-16383)。

img

2. 节点通信(Gossip 协议)

节点间通过集群总线(独立端口,默认 + 10000)通信。

消息类型:

PING/PONG:心跳检测、状态同步。

FAIL:广播节点失效。

UPDATE:槽位映射、集群拓扑更新。

3. 请求路由流程

  • 客户端连接任意节点,发送命令。

  • 节点计算 key 所属槽位。

  • 槽位归属本节点→直接处理;否则→返回MOVED重定向。

  • 智能客户端缓存槽位映射,减少重定向。

  • 4. 故障转移(高可用)

  • 故障检测:某主节点超时无响应,多数主节点标记为FAIL 。

  • 从节点选举:该主节点的从节点发起FAILOVER请求。

  • 投票晋升:主节点投票通过,从节点升级为主,接管槽位。

  • 拓扑更新:Gossip 同步新状态,集群恢复。

  • 5. 数据一致性

    异步复制:主从复制异步,存在短暂数据不一致。

    最终一致性:故障转移后数据最终一致,不保证强一致。

    写安全:多数主节点可达时,写操作尽量保留。

    三、使用场景

    1. 海量数据存储(>100GB)

    电商商品库、用户画像、社交内容、IoT 设备数据。

    突破单机内存上限,分布式存储海量热数据。

    2. 高并发读写(QPS≥5 万)

    秒杀、抢购、热点评论、实时排行榜。

    多主节点并行处理,并发能力线性提升。

    强事务、多键跨槽操作(如MSET多键不同槽)。

    数据量小、低并发(哨兵 / 主从更简单)。

    需强一致性(可搭配分布式事务)。

    四、操作步骤(3 主 3 从实战)

    架构

    系统IP地址主机名
    Centos7.9 192.168.108.21 redis1
    Centos7.9 192.168.108.22 redis2
    Centos7.9 192.168.108.23 redis3
    系统IP地址主机名
    Centos7.9 192.168.108.24 redis4
    Centos7.9 192.168.108.25 redis5
    Centos7.9 192.168.108.26 redis6

    cluster集群是Redis从3.0版本开始支持,自带的一种集群方式。它的原理使用了分布的思想,其数据会均分到所有的主节点上。此部署方式,当数据量过大时,会让服务器均摊压力。在各个主节点上分配的数据都不是全量的。是分片存储的。目前此种部署方式在生产环境的较多。至少六台,三台主,三台从。

    目的:同时解决高可用、海量数据存储和高并发读写的问题,即分布式扩展。

    原理:Redis Cluster 是 Redis 官方提供的分布式数据库解决方案。它通过数据分片 (Sharding)

    进行数据存储,并通过多主多从架构来实现高可用。

    准备6台安装了redis的虚拟机同时操作:关闭防火墙,修改配置文件

    配置

    所有主机操作

    #修改配置文件
    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# cd /usr/local/redis-6.2.14/
    [root@localhost redis-6.2.14]# vim redis.conf
    #监听地址
    75 bind 0.0.0.0 -::1
    #启动cluster集群
    1387 cluster-enabled yes
    #启动Redis
    [root@localhost redis-6.2.14]# redis-server redis.conf &
    #查看启动端口
    [root@redis1 redis-6.2.14]# netstat -anpt | grep redis
    tcp 000.0.0.0:6379 0.0.0.0:* LISTEN
    55036/redis-server
    tcp 000.0.0.0:16379 0.0.0.0:* LISTEN
    55036/redis-server
    tcp6 00 ::1:6379 :::* LISTEN
    55036/redis-server
    tcp6 00 ::1:16379 :::* LISTEN
    55036/redis-server

    任意一台即可

    [root@redis1 redis-6.2.14]# redis-cli –cluster create 192.168.108.21:6379
    192.168.108.22:6379 192.168.108.23:6379 192.168.108.24:6379 192.168.108.25:6379
    192.168.108.26:6379 –cluster-replicas 1
    >>> 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.108.25:6379 to 192.168.108.21:6379
    Adding replica 192.168.108.26:6379 to 192.168.108.22:6379
    Adding replica 192.168.108.24:6379 to 192.168.108.23:6379
    M: fcbf04a3649f4e9e6b381861a94393c31eb67e67 192.168.108.21:6379
    slots:[0-5460] (5461 slots) master #[0-5460]是负责槽位0-5064,
    (5461 slots) 是共5461个槽位
    M: f3cb00b07a7836666bd3fd391040ff308ad35685 192.168.108.22:6379
    slots:[5461-10922] (5462 slots) master
    M: 90507dea1ca425cfe6ca993f8c453b2377ded5f0 192.168.108.23:6379
    slots:[10923-16383] (5461 slots) master
    S: 95fd02ecaf3fb34822fd56ed7ae61b05d782d892 192.168.108.24:6379
    replicates 90507dea1ca425cfe6ca993f8c453b2377ded5f0
    S: 18b45e542ebbf318fd9a92cfe2adcde4c255c72b 192.168.108.25:6379
    replicates fcbf04a3649f4e9e6b381861a94393c31eb67e67
    S: 8f5e04a03ae0984d843dab8fb9cd0cc4c4537624 192.168.108.26:6379
    replicates f3cb00b07a7836666bd3fd391040ff308ad35685
    Can I set the above configuration? (type 'yes' to accept): yes#回答yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    55036:M 03 Feb 202611:35:48.414 # configEpoch set to 1 via CLUSTER SET-CONFIG-
    EPOCH
    >>> Sending CLUSTER MEET messages to join the cluster
    55036:M 03 Feb 202611:35:48.445 # IP address for this node updated to
    192.168.108.21
    Waiting for the cluster to join
    55036:M 03 Feb 202611:35:49.510 * Replica 192.168.108.25:6379 asks for
    synchronization
    55036:M 03 Feb 202611:35:49.510 * Partial resynchronization not accepted:
    Replication ID mismatch (Replica asked for
    '5ada9eaab85561721d9411eee29d9e15bf2b87b1', my replication IDs are
    '868d3acb992f408196b2367647b0cf6c3e02912a' and
    '0000000000000000000000000000000000000000')
    55036:M 03 Feb 202611:35:49.510 * Replication backlog created, my new
    replication IDs are 'cef440df5f9f0706ac9ab7e60a450839e702f045' and
    '0000000000000000000000000000000000000000'
    55036:M 03 Feb 202611:35:49.510 * Starting BGSAVE for SYNC with target: disk
    55036:M 03 Feb 202611:35:49.606 * Background saving started by pid 55327
    >>> Performing Cluster Check (using node192.168.108.21:6379)
    M: fcbf04a3649f4e9e6b381861a94393c31eb67e67 192.168.108.21:6379
    slots:[0-5460] (5461 slots) master
    1 additional replica(s)
    S: 8f5e04a03ae0984d843dab8fb9cd0cc4c4537624 192.168.108.26:6379
    slots: (0 slots) slave
    replicates f3cb00b07a7836666bd3fd391040ff308ad35685
    S: 95fd02ecaf3fb34822fd56ed7ae61b05d782d892 192.168.108.24:6379
    slots: (0 slots) slave
    replicates 90507dea1ca425cfe6ca993f8c453b2377ded5f0
    M: 90507dea1ca425cfe6ca993f8c453b2377ded5f0 192.168.108.23:6379
    slots:[10923-16383] (5461 slots) master
    1 additional replica(s)
    S: 18b45e542ebbf318fd9a92cfe2adcde4c255c72b 192.168.108.25:6379
    slots: (0 slots) slave
    replicates fcbf04a3649f4e9e6b381861a94393c31eb67e67
    M: f3cb00b07a7836666bd3fd391040ff308ad35685 192.168.108.22:6379
    slots:[5461-10922] (5462 slots) master
    1 additional replica(s)
    55327:C 03 Feb 202611:35:49.733 * DB saved on disk
    55327:C 03 Feb 202611:35:49.733 * RDB: 4 MB of memory used by copy-on-write
    55036:M 03 Feb 202611:35:49.736 * Background saving terminated with success
    55036:M 03 Feb 202611:35:49.737 * Synchronization with replica
    192.168.108.25:6379 succeeded
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    [root@redis1 redis-6.2.14]# 55036:M 03 Feb 2026 11:35:53.476 # Cluster state
    changed: ok

    查看集群状态

    [root@redis1 redis-6.2.14]# redis-cli
    127.0.0.1:6379> cluster nodes
    8f5e04a03ae0984d843dab8fb9cd0cc4c4537624 192.168.108.26:6379@16379 slave
    f3cb00b07a7836666bd3fd391040ff308ad35685 017700898970002 connected
    95fd02ecaf3fb34822fd56ed7ae61b05d782d892 192.168.108.24:6379@16379 slave
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 017700899003143 connected
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 192.168.108.23:6379@16379 master -0
    17700898980003 connected 10923-16383
    18b45e542ebbf318fd9a92cfe2adcde4c255c72b 192.168.108.25:6379@16379 slave
    fcbf04a3649f4e9e6b381861a94393c31eb67e67 017700898990001 connected
    f3cb00b07a7836666bd3fd391040ff308ad35685 192.168.108.22:6379@16379 master -0
    17700898992672 connected 5461-10922
    fcbf04a3649f4e9e6b381861a94393c31eb67e67 192.168.108.21:6379@16379 myself,master
    -017700898990001 connected 0-5460
    127.0.0.1:6379> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:1134
    cluster_stats_messages_pong_sent:1172
    cluster_stats_messages_sent:2306
    cluster_stats_messages_ping_received:1167
    cluster_stats_messages_pong_received:1134
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:2306

    创建数据

    创建数据需要到提示的地方创建;或者在redis-cli -c的命令创建数据

    redis1

    127.0.0.1:6379> set name gqd
    (error) MOVED 5798192.168.108.22:6379 #提示在redis2操作
    # redis2
    127.0.0.1:6379> set name 'gqd'
    OK
    127.0.0.1:6379> get name
    "gqd"
    # redis1
    127.0.0.1:6379> get name #创建,查看都只能在redis2
    (error) MOVED 5798192.168.108.22:6379
    #如何创建集群能够看到的
    [root@redis1 redis-6.2.14]# redis-cli -c
    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> get age
    "18"
    [root@redis3 redis-6.2.14]# redis-cli -c
    127.0.0.1:6379> get age
    –> Redirected to slot [741] located at 192.168.108.21:6379
    "18"

    模拟故障

    关掉redis1节点,再次查看集群信息

    [root@redis1 redis-6.2.14]# init 0
    # redis 2
    127.0.0.1:6379> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:7
    cluster_my_epoch:2
    cluster_stats_messages_ping_sent:1486
    cluster_stats_messages_pong_sent:1419
    cluster_stats_messages_meet_sent:1
    cluster_stats_messages_fail_sent:5
    cluster_stats_messages_auth-ack_sent:1
    cluster_stats_messages_sent:2912
    cluster_stats_messages_ping_received:1419
    cluster_stats_messages_pong_received:1487
    cluster_stats_messages_fail_received:1
    cluster_stats_messages_auth-req_received:1
    cluster_stats_messages_received:2908

    查看节点信息

    结果可知,仍保持3台master,原来的redis5节点被选举为新master节点

    redis2

    127.0.0.1:6379> cluster nodes
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 192.168.108.23:6379@16379 master -0
    17700911760003 connected 10923-16383
    18b45e542ebbf318fd9a92cfe2adcde4c255c72b 192.168.108.25:6379@16379 master -0
    17700911774327 connected 0-5460
    f3cb00b07a7836666bd3fd391040ff308ad35685 192.168.108.22:6379@16379 myself,master
    -017700911750002 connected 5461-10922
    8f5e04a03ae0984d843dab8fb9cd0cc4c4537624 192.168.108.26:6379@16379 slave
    f3cb00b07a7836666bd3fd391040ff308ad35685 017700911740002 connected
    95fd02ecaf3fb34822fd56ed7ae61b05d782d892 192.168.108.24:6379@16379 slave
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 017700911764223 connected
    fcbf04a3649f4e9e6b381861a94393c31eb67e67 192.168.108.21:6379@16379 master,fail –
    177009114369517700911400001 connected

    再把redis 业务修复,看集群状态

    完整过程

    如果你的 Redis Cluster 中192.168.108.21:6379** (Master 1)挂掉**,而它的从节点192.168.108.25:6379仍然存活,那么整个集群会自动完成故障转移(failover),服务不会中断,数据也不会丢失。下面详细说明会发生什么:

    🧩当前角色回顾(基于你之前的cluster nodes输出)

    节点 IP角色负责槽副本
    192.168.108.21 Master 0 – 5460 ← 由 .25 复制
    192.168.108.25 Slave (无槽) 复制 .21

    其他节点(.22/.26 , .23/.24 )正常运行。

    🔥如果192.168.108.21挂掉,会发生什么?✅第 1 步:故障检测(约 15 秒内)

    其他 master 节点(.22和.23 )通过Gossip 协议发现.21无响应。

    经过cluster-node-timeout (默认 15 秒)后:

    多数 master(≥2/3)将其标记为FAIL(客观下线)。

    ⏱️在这 15 秒内,访问槽 [0–5460] 的请求会失败或超时。

    ✅第 2 步:Slave .25自动发起选举

    .25 (原.21的 slave)检测到 master 已 FAIL。

    等待一个短暂随机延迟(通常 < 1 秒),然后向其他master 节点(.22和.23** )**请求投票。

    ✅第 3 步:获得多数票,晋升为新 Master

    .22和.23收到请求后,验证.25是合法副本。

    因为有2 个 master 投票(超过半数),.25成功当选。

    .25 执行:

    SLAVEOF NO ONE

    并接管槽 0–5460。

    ✅第 4 步:集群拓扑更新,恢复服务

    所有节点收到通知,更新集群视图:

    .25变为master

    槽0–5460的 owner 变为.25

    集群状态重新变为:

    cluster_state: ok cluster_slots_fail: 0

    客户端再次写入 key(如SET user:1001 “Alice” ,假设其槽在 0–5460):

    自动重定向到192.168.108.25:6379

    操作成功!

    📊故障前后对比

    项目故障前故障后(.21 挂)
    Master 节点 .21, .22, .23 .25, .22, .23
    Slave 节点 .25, .26, .24 (.25 已晋升,剩下 .26, .24)
    槽覆盖 0–16383 0–16383(完整)
    项目故障前故障后(.21 挂)
    集群状态 ok 短暂 fail → 恢复为 ok
    数据完整性 完整 完整(无丢失)
    客户端影响 写入槽 0–5460 暂时失败(< 30 秒) 自动恢复

    ✅整个过程全自动,无需人工干预!

    ❗极端情况:如果.21和.25同时挂掉?

    槽0–5460 将无人负责

    集群状态变为:

    cluster_state: fail cluster_slots_fail: 5461

    所有涉及这些槽的读写都会失败(返回(error) CLUSTERDOWN The cluster is down )

    必须手动恢复.21或.25才能恢复服务。

    🔒这就是为什么主从节点必须部署在不同物理机/可用区!

    🔧如何验证?(动手测试)

    # 1. 在 redis1 (.21) 上停止 Redis
    systemctl stop redis
    # 2. 在 redis2 (.22) 上观察集群状态
    redis-cli -c-h192.168.108.22 -p6379 cluster nodes

    你会看到:

    .21状态变为fail?→fail #faile?状态停留很短暂

    .25角色从slave变为master ,并拥有0-5460槽

    几十秒后,cluster info显示cluster_state:ok

    ✅总结

    场景集群是否可用数据是否安全是否自动恢复
    仅 .21 (master)挂 ✅ 是 ✅ 是 ✅ 是(由 .25 接管)
    .21 + .25 同时挂 ❌ 否 ⚠️ 槽 0–5460 不可用 ❌ 否

    你当前的3主3从架构完全能容忍任意一个 master 宕机,这是 Redis Cluster 高可用的核心价值!

    挂掉radis5测试

    [root@redis5 redis-6.2.14]# init 0
    [root@redis2 redis-6.2.14]# redis-cli -c -h 192.168.108.22 -p 6379 cluster nodes
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 192.168.108.23:6379@16379 master -0
    17700923432253 connected 10923-16383
    18b45e542ebbf318fd9a92cfe2adcde4c255c72b 192.168.108.25:6379@16379 master,fail –
    177009224633817700922432117 connected 0-5460
    f3cb00b07a7836666bd3fd391040ff308ad35685 192.168.108.22:6379@16379 myself,master
    -017700923410002 connected 5461-10922
    8f5e04a03ae0984d843dab8fb9cd0cc4c4537624 192.168.108.26:6379@16379 slave
    f3cb00b07a7836666bd3fd391040ff308ad35685 017700923420002 connected
    95fd02ecaf3fb34822fd56ed7ae61b05d782d892 192.168.108.24:6379@16379 slave
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 017700923452593 connected
    fcbf04a3649f4e9e6b381861a94393c31eb67e67 192.168.108.21:6379@16379 master,fail –
    177009114369517700911400001 connected
    [root@redis2 redis-6.2.14]# redis-cli -c -h 192.168.108.22 -p 6379 cluster info
    cluster_state:fail #集群状态fail
    cluster_slots_assigned:16384
    cluster_slots_ok:10923
    cluster_slots_pfail:0
    cluster_slots_fail:5461
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:7
    cluster_my_epoch:2
    cluster_stats_messages_ping_sent:2545
    cluster_stats_messages_pong_sent:2417
    cluster_stats_messages_meet_sent:1
    cluster_stats_messages_fail_sent:5
    cluster_stats_messages_auth-ack_sent:1
    cluster_stats_messages_sent:4969
    cluster_stats_messages_ping_received:2417
    cluster_stats_messages_pong_received:2545
    cluster_stats_messages_fail_received:2
    cluster_stats_messages_auth-req_received:1
    cluster_stats_messages_received:4965

    恢复集群监控

    将关掉的两台服务器开机,开启redis服务即可

    # 集群
    [root@redis2 redis-6.2.14]# redis-cli -c -h 192.168.108.22 -p 6379 cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:7
    cluster_my_epoch:2
    cluster_stats_messages_ping_sent:3130
    cluster_stats_messages_pong_sent:2952
    cluster_stats_messages_meet_sent:1
    cluster_stats_messages_fail_sent:5
    cluster_stats_messages_auth-ack_sent:1
    cluster_stats_messages_sent:6089
    cluster_stats_messages_ping_received:2952
    cluster_stats_messages_pong_received:3130
    cluster_stats_messages_fail_received:3
    cluster_stats_messages_auth-req_received:1
    cluster_stats_messages_received:6086
    [root@redis2 redis-6.2.14]# redis-cli -c -h 192.168.108.22 -p 6379 cluster nodes
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 192.168.108.23:6379@16379 master -0
    17700929777823 connected 10923-16383
    18b45e542ebbf318fd9a92cfe2adcde4c255c72b 192.168.108.25:6379@16379 master -0
    17700929788167 connected 0-5460
    f3cb00b07a7836666bd3fd391040ff308ad35685 192.168.108.22:6379@16379 myself,master
    -017700929770002 connected 5461-10922
    8f5e04a03ae0984d843dab8fb9cd0cc4c4537624 192.168.108.26:6379@16379 slave
    f3cb00b07a7836666bd3fd391040ff308ad35685 017700929770002 connected
    95fd02ecaf3fb34822fd56ed7ae61b05d782d892 192.168.108.24:6379@16379 slave
    90507dea1ca425cfe6ca993f8c453b2377ded5f0 017700929767653 connected
    fcbf04a3649f4e9e6b381861a94393c31eb67e67 192.168.108.21:6379@16379 slave
    18b45e542ebbf318fd9a92cfe2adcde4c255c72b 017700929770007 connected

    容器部署redis

    docker容器方式安装

    [root@localhost ~]# docker run –name redis -p 6379:6379 -d -v /data/redis:/data

    redis
    [root@localhost ~]# docker exec redis redis-cli info server
    # Server
    redis_version:8.6.0
    redis_git_sha1:00000000
    redis_git_dirty:1
    redis_build_id:a7d515010e105f80
    redis_mode:standalone
    os:Linux 4.18.0-553.6.1.el8.x86_64 x86_64
    arch_bits:64
    monotonic_clock:POSIX clock_gettime
    multiplexing_api:epoll
    atomicvar_api:c11-builtin
    gcc_version:14.2.0
    process_id:1
    process_supervised:no
    run_id:a2ee2aa49069ff42d23ca8d46f82d3ac61f1d385
    tcp_port:6379
    server_time_usec:1770950461439156
    uptime_in_seconds:109
    uptime_in_days:0
    hz:10
    configured_hz:10
    lru_clock:9342781
    executable:/data/redis-server
    config_file:
    io_threads_active:0
    listener0:name=tcp,bind=*,bind=-::*,port=6379
    [root@localhost ~]#
    [root@localhost ~]# docker exec redis redis-cli set name ma
    OK
    [root@localhost ~]# docker exec redis redis-cli set age 18
    OK
    [root@localhost ~]# docker exec redis redis-cli get name
    ma
    [root@localhost ~]# docker exec redis redis-cli get age
    18
    [root@localhost ~]# docker exec redis redis-cli save
    OK
    [root@localhost ~]# ls /data/redis/ -1
    dump.rdb

    默认Redis容器可以支持远程连接

    img

    img

    容器部署基础

    [root@docker ~]# vim docker-compose.yml
    version: '2.27'

    networks:
    redis-cluster-net:
    driver: bridge
    ipam:
    config:
    – subnet: 192.168.109.0/24

    services:
    # Master1 192.168.109.21
    redis-21:
    image: redis:latest
    container_name: redis-21
    restart: always
    ports:
    –"6379:6379"
    –"16379:16379"
    networks:
    redis-cluster-net:
    ipv4_address: 192.168.109.21
    volumes:
    – ./node21/data:/data
    – command: >
    redis-server
    –bind0.0.0.0
    –port6379
    –cluster-enabledyes
    –cluster-config-file nodes.conf
    –cluster-node-timeout5000
    –cluster-announce-ip192.168.109.21
    –cluster-announce-port6379
    –cluster-announce-bus-port16379
    –appendonlyyes
    –protected-mode no
    # Master2 192.168.109.22
    redis-22:
    image: redis:latest
    container_name: redis-22
    restart: always
    ports:
    –"6380:6379"
    –"16380:16379"
    networks:
    redis-cluster-net:
    ipv4_address: 192.168.109.22
    volumes:
    – ./node22/data:/data
    command: >
    redis-server
    –bind0.0.0.0
    –port6379
    –cluster-enabledyes
    –cluster-config-file nodes.conf
    –cluster-node-timeout5000
    –cluster-announce-ip192.168.109.22
    –cluster-announce-port6379
    –cluster-announce-bus-port16379
    –appendonlyyes
    –protected-mode no
    # Master3 192.168.109.23
    redis-23:
    image: redis:latest
    container_name: redis-23
    restart: always
    ports:
    –"6381:6379"
    –"16381:16379"
    networks:
    redis-cluster-net:
    ipv4_address: 192.168.109.23
    volumes:
    – ./node23/data:/data
    command: >
    redis-server
    –bind0.0.0.0
    –port6379
    –cluster-enabledyes
    –cluster-config-file nodes.conf
    –cluster-node-timeout5000
    –cluster-announce-ip192.168.109.23
    –cluster-announce-port6379
    –cluster-announce-bus-port16379
    –appendonlyyes
    –protected-mode no
    # Slave1 192.168.109.25 主:192.168.109.21
    redis-25:
    image: redis:latest
    container_name: redis-25
    restart: always
    ports:
    –"6382:6379"
    –"16382:16379"
    networks:
    redis-cluster-net:
    ipv4_address: 192.168.109.25
    volumes:
    – ./node25/data:/data
    command: >
    redis-server
    –bind0.0.0.0
    –port6379
    –cluster-enabledyes
    –cluster-config-file nodes.conf
    –cluster-node-timeout5000
    –cluster-announce-ip192.168.109.25
    –cluster-announce-port6379
    –cluster-announce-bus-port16379
    –appendonlyyes
    –protected-mode no
    # Slave2 192.168.109.26 主:192.168.109.22
    redis-26:
    image: redis:latest
    container_name: redis-26
    restart: always
    ports:
    –"6383:6379"
    –"16383:16379"
    networks:
    redis-cluster-net:
    ipv4_address: 192.168.109.26
    volumes:
    – ./node26/data:/data
    command: >
    redis-server
    –bind0.0.0.0
    –port6379
    –cluster-enabledyes
    –cluster-config-file nodes.conf
    –cluster-node-timeout5000
    –cluster-announce-ip192.168.109.26
    –cluster-announce-port6379
    –cluster-announce-bus-port16379
    –appendonlyyes
    –protected-mode no
    # Slave3 192.168.109.24 主:192.168.109.23
    redis-24:
    image: redis:latest
    container_name: redis-24
    restart: always
    ports:
    –"6384:6379"
    –"16384:16379"
    networks:
    redis-cluster-net:
    ipv4_address: 192.168.109.24
    volumes:
    – ./node24/data:/data
    command: >
    redis-server
    –bind0.0.0.0
    –port6379
    –cluster-enabledyes
    –cluster-config-file nodes.conf
    –cluster-node-timeout5000
    –cluster-announce-ip192.168.109.24
    –cluster-announce-port6379
    –cluster-announce-bus-port16379
    –appendonlyyes
    –protected-mode no
    [root@docker ~]# docker compose up -d
    [root@docker ~]# docker exec -it redis-21 redis-cli –cluster create \\
    > 192.168.109.21:6379 \\
    > 192.168.109.22:6379 \\
    > 192.168.109.23:6379 \\
    > 192.168.109.24:6379 \\
    > 192.168.109.25:6379 \\
    > 192.168.109.26:6379 \\
    > –cluster-replicas1
    >>> 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.109.25:6379 to 192.168.109.21:6379
    Adding replica 192.168.109.26:6379 to 192.168.109.22:6379
    Adding replica 192.168.109.24:6379 to 192.168.109.23:6379
    M: c6650ac0779839061763eb305340410d148a3497 192.168.109.21:6379
    slots:[0-5460] (5461 slots) master
    M: ec9e43bfc9b98c08419191fcf02a109fcbc32602 192.168.109.22:6379
    slots:[5461-10922] (5462 slots) master
    M: a973f431bda8ad53d0b9937b6045878710a4b52d 192.168.109.23:6379
    slots:[10923-16383] (5461 slots) master
    S: a982afa38457757b7f17ee72aa41440cb4752c70 192.168.109.24:6379
    replicates a973f431bda8ad53d0b9937b6045878710a4b52d
    S: 1d7a85c06a826e45a95e5af0361eeb1b6a99d1fe 192.168.109.25:6379
    replicates c6650ac0779839061763eb305340410d148a3497
    S: d98d9750c468f763a2ace5684f626a807e36dcb5 192.168.109.26:6379
    replicates ec9e43bfc9b98c08419191fcf02a109fcbc32602
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join
    ...
    >>> Performing Cluster Check (using node192.168.109.21:6379)
    M: c6650ac0779839061763eb305340410d148a3497 192.168.109.21:6379
    slots:[0-5460] (5461 slots) master
    1 additional replica(s)
    S: a982afa38457757b7f17ee72aa41440cb4752c70 192.168.109.24:6379
    slots: (0 slots) slave
    replicates a973f431bda8ad53d0b9937b6045878710a4b52d
    M: a973f431bda8ad53d0b9937b6045878710a4b52d 192.168.109.23:6379
    slots:[10923-16383] (5461 slots) master
    1 additional replica(s)
    S: 1d7a85c06a826e45a95e5af0361eeb1b6a99d1fe 192.168.109.25:6379
    slots: (0 slots) slave
    replicates c6650ac0779839061763eb305340410d148a3497
    M: ec9e43bfc9b98c08419191fcf02a109fcbc32602 192.168.109.22:6379
    slots:[5461-10922] (5462 slots) master
    1 additional replica(s)
    S: d98d9750c468f763a2ace5684f626a807e36dcb5 192.168.109.26:6379
    slots: (0 slots) slave
    replicates ec9e43bfc9b98c08419191fcf02a109fcbc32602
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    # 验证
    root@docker ~]# docker exec -it redis-21 redis-cli
    127.0.0.1:6379> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:124
    cluster_stats_messages_pong_sent:128
    cluster_stats_messages_sent:252
    cluster_stats_messages_ping_received:123
    cluster_stats_messages_pong_received:127
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:255
    total_cluster_links_buffer_limit_exceeded:0
    cluster_slot_migration_active_tasks:0
    cluster_slot_migration_active_trim_running:0
    cluster_slot_migration_active_trim_current_job_keys:0
    cluster_slot_migration_active_trim_current_job_trimmed:0
    cluster_slot_migration_stats_active_trim_started:0
    cluster_slot_migration_stats_active_trim_completed:0
    cluster_slot_migration_stats_active_trim_cancelled:0
    127.0.0.1:6379>

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Redis集群实战:3主3从与容器部署
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!