7245b3ec006dd7c08884d838c9dce749b6c1c854
Redis-Cluster\344\270\211\344\270\273\344\270\211\344\273\216\351\233\206\347\276\244\351\203\250\347\275\262\346\226\207\346\241\243.md
| ... | ... | @@ -0,0 +1,210 @@ |
| 1 | + |
|
| 2 | + |
|
| 3 | +# Redis Cluster 三主三从集群部署文档 |
|
| 4 | + |
|
| 5 | +## 1. 集群架构概述 |
|
| 6 | +Redis Cluster 采用**无中心架构**,通过分片(Sharding)将数据分布到多个节点,每个分片由一个主节点(Master)和至少一个从节点(Slave)组成,实现高可用和负载均衡。本例部署**3个主节点 + 3个从节点**,共6个节点,保障集群的高可用性和数据冗余。 |
|
| 7 | + |
|
| 8 | +**关键特性**: |
|
| 9 | +- 数据分片:使用哈希槽(Hash Slot)机制,将数据划分为16384个槽,分配给不同主节点。 |
|
| 10 | +- 故障自动转移:当主节点宕机时,其对应的从节点会自动晋升为主节点。 |
|
| 11 | +- 客户端重定向:客户端可访问任意节点,若 key 不属于当前节点,会返回重定向信息。 |
|
| 12 | + |
|
| 13 | +## 2. 环境准备与节点规划 |
|
| 14 | +### 2.1 服务器与端口规划 |
|
| 15 | +| 节点类型 | IP地址 | 端口范围 | 示例端口 | |
|
| 16 | +|----------|--------|----------|----------| |
|
| 17 | +| 3主3从 | 192.168.184.122 | 16379–16384 | 16379(主)、16382(从)| |
|
| 18 | + |
|
| 19 | +**注意**: |
|
| 20 | +- 若跨服务器部署,需确保网络互通,并开放**节点端口**(如16379)和**集群总线端口**(节点端口 + 10000,如26379)。 |
|
| 21 | +- 集群总线用于节点间通信、故障检测和故障转移,需在防火墙中放行。 |
|
| 22 | + |
|
| 23 | +### 2.2 依赖安装 |
|
| 24 | +确保所有节点已安装相同版本的 Redis(建议 5.0 及以上版本)。 |
|
| 25 | +```bash |
|
| 26 | +# 安装编译工具 |
|
| 27 | +yum install -y gcc tcl |
|
| 28 | +# 下载并编译 Redis(以 7.0.4 为例) |
|
| 29 | +wget https://download.redis.io/releases/redis-7.0.4.tar.gz |
|
| 30 | +tar -xzf redis-7.0.4.tar.gz |
|
| 31 | +cd redis-7.0.4 && make && make install |
|
| 32 | +``` |
|
| 33 | + |
|
| 34 | +## 3. 节点配置 |
|
| 35 | +每个节点需独立配置,以下以端口 `16379` 为例,其他节点需修改 `port`、文件路径及端口相关参数。 |
|
| 36 | + |
|
| 37 | +### 3.1 配置文件示例(redis-16379.conf) |
|
| 38 | +```ini |
|
| 39 | +# 网络绑定地址(改为实际内网 IP 或 0.0.0.0 允许所有连接) |
|
| 40 | +bind 0.0.0.0 |
|
| 41 | +# 监听端口 |
|
| 42 | +port 16379 |
|
| 43 | +# 后台运行模式 |
|
| 44 | +daemonize yes |
|
| 45 | +# 启用集群模式 |
|
| 46 | +cluster-enabled yes |
|
| 47 | +# 集群节点配置文件(自动生成,保存集群状态) |
|
| 48 | +cluster-config-file "node01/nodes.conf" |
|
| 49 | +# 节点超时时间(毫秒) |
|
| 50 | +cluster-node-timeout 15000 |
|
| 51 | +# 进程 ID 存储路径 |
|
| 52 | +pidfile "node01/redis.pid" |
|
| 53 | +# 日志级别 |
|
| 54 | +loglevel warning |
|
| 55 | +# 日志文件路径 |
|
| 56 | +logfile "node01/redis.log" |
|
| 57 | +# 数据持久化目录 |
|
| 58 | +dir "node01" |
|
| 59 | +# 关闭 AOF 持久化(根据需求可改为 yes) |
|
| 60 | +appendonly no |
|
| 61 | +# 实例访问密码 |
|
| 62 | +requirepass snest123 |
|
| 63 | +# 主节点密码(用于从节点同步认证) |
|
| 64 | +masterauth snest123 |
|
| 65 | +``` |
|
| 66 | + |
|
| 67 | +### 3.2 目录结构准备 |
|
| 68 | +为每个节点创建数据、日志、配置文件目录: |
|
| 69 | +```bash |
|
| 70 | +# 以节点 16379 为例 |
|
| 71 | +mkdir -p node01 |
|
| 72 | +``` |
|
| 73 | + |
|
| 74 | +### 3.3 启动所有节点 |
|
| 75 | +```bash |
|
| 76 | +# 逐个启动节点 |
|
| 77 | +redis-server redis-16379.conf |
|
| 78 | +redis-server redis-16380.conf |
|
| 79 | +... # 其他节点同理 |
|
| 80 | + |
|
| 81 | +# 验证进程是否启动 |
|
| 82 | +ps -ef | grep redis-server |
|
| 83 | +``` |
|
| 84 | + |
|
| 85 | +## 4. 创建集群 |
|
| 86 | +使用 `redis-cli --cluster create` 命令自动分配槽和主从关系。 |
|
| 87 | +```bash |
|
| 88 | +redis-cli -p 16379 --cluster create \ |
|
| 89 | +192.168.184.122:16379 192.168.184.122:16380 192.168.184.122:16381 \ |
|
| 90 | +192.168.184.122:16382 192.168.184.122:16383 192.168.184.122:16384 \ |
|
| 91 | +--cluster-replicas 1 -a snest123 |
|
| 92 | +``` |
|
| 93 | +**参数说明**: |
|
| 94 | +- `--cluster-replicas 1`:每个主节点配置1个从节点。 |
|
| 95 | +- `-a snest123`:使用密码认证。 |
|
| 96 | + |
|
| 97 | +**输出示例**: |
|
| 98 | +``` |
|
| 99 | +>>> Performing hash slots allocation on 6 nodes... |
|
| 100 | +Master[0] -> Slots 0 - 5460 主节点0 分配槽信息 |
|
| 101 | +Master[1] -> Slots 5461 - 10922 主节点1 分配槽信息 |
|
| 102 | +Master[2] -> Slots 10923 - 16383 主节点2 分配槽信息 |
|
| 103 | +Adding replica 192.168.184.122:16383 to 192.168.184.122:16379 |
|
| 104 | +Adding replica 192.168.184.122:16384 to 192.168.184.122:16380 |
|
| 105 | +Adding replica 192.168.184.122:16382 to 192.168.184.122:16381 |
|
| 106 | +>>> Trying to optimize slaves allocation for anti-affinity |
|
| 107 | +[WARNING] Some slaves are in the same host as their master |
|
| 108 | +M: a2bb98c2eb817466caac4f32e31b9945ffb32e64 192.168.184.122:16379 |
|
| 109 | + slots:[0-5460] (5461 slots) master |
|
| 110 | +M: 588eb4717da5a33c6cc6302c76862af49ec9cea8 192.168.184.122:16380 |
|
| 111 | + slots:[5461-10922],[11228] (5462 slots) master |
|
| 112 | +M: 2e57e54f805625b9f3785ce313dcb08f02c7b4bd 192.168.184.122:16381 |
|
| 113 | + slots:[10923-16383] (5461 slots) master |
|
| 114 | +S: f75d2cd89d65f2c2e733bbe154bf7cdcc6c21163 192.168.184.122:16382 slave信息 |
|
| 115 | + replicates a2bb98c2eb817466caac4f32e31b9945ffb32e64 |
|
| 116 | +S: e8a85ee21c18b4511d69f2262397951b083301ab 192.168.184.122:16383 |
|
| 117 | + replicates 588eb4717da5a33c6cc6302c76862af49ec9cea8 |
|
| 118 | +S: 0fda6e296d09b16de637dc23f90642c89665f4cc 192.168.184.122:16384 |
|
| 119 | + replicates 2e57e54f805625b9f3785ce313dcb08f02c7b4bd |
|
| 120 | +Can I set the above configuration? (type 'yes' to accept): yes |
|
| 121 | +>>> Nodes configuration updated |
|
| 122 | +>>> Assign a different config epoch to each node |
|
| 123 | +58816:M 04 Nov 2025 10:07:56.326 * configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH |
|
| 124 | +60985:M 04 Nov 2025 10:07:56.327 * configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH |
|
| 125 | +61519:M 04 Nov 2025 10:07:56.327 * configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH |
|
| 126 | +44101:M 04 Nov 2025 10:07:56.328 * configEpoch set to 4 via CLUSTER SET-CONFIG-EPOCH |
|
| 127 | +45300:M 04 Nov 2025 10:07:56.329 * configEpoch set to 5 via CLUSTER SET-CONFIG-EPOCH |
|
| 128 | +48035:M 04 Nov 2025 10:07:56.329 * configEpoch set to 6 via CLUSTER SET-CONFIG-EPOCH |
|
| 129 | +>>> Sending CLUSTER MEET messages to join the cluster |
|
| 130 | + |
|
| 131 | + |
|
| 132 | +``` |
|
| 133 | +输入 `yes` 确认配置后,集群自动完成节点握手和槽分配。 |
|
| 134 | + |
|
| 135 | +## 5. 集群验证 |
|
| 136 | +### 5.1 检查节点状态 |
|
| 137 | +```bash |
|
| 138 | +# 查看节点列表和角色 |
|
| 139 | +redis-cli -p 16379 -a snest123 cluster nodes |
|
| 140 | + |
|
| 141 | +2c485565af665ad70c0f7a75030263543d4a92ef 192.168.184.122:16382@26382,,shard-id=375d91dfb257fcdb791e533932aee1e8db37691c slave c6c396d94430d113454b4d2ffb760e06ed2c016c 0 1762226356828 2 connected |
|
| 142 | +c6c396d94430d113454b4d2ffb760e06ed2c016c 192.168.184.122:16380@26380,,shard-id=375d91dfb257fcdb791e533932aee1e8db37691c master - 0 1762226356000 2 connected 5461-10922 |
|
| 143 | +ae772e2508ce4c7ce111d8f380c04afdc2cbca62 192.168.184.122:16379@26379,,shard-id=bdcffed9f55bd814b0c8ac7eda43c26f34a933fb myself,master - 0 1762226355000 1 connected 0-5460 |
|
| 144 | +f9e124c4519f56208824db695547bbe7b99896dd 192.168.184.122:16383@26383,,shard-id=9896905ec818477b8b2d657d6cf2c1fbf571f9ad slave 2d358d3756882e035476753c6d52e36103968b20 0 1762226356526 3 connected |
|
| 145 | +9afdcb87be5b4e485562411d65b9c32a83e504f0 192.168.184.122:16384@26384,,shard-id=bdcffed9f55bd814b0c8ac7eda43c26f34a933fb slave ae772e2508ce4c7ce111d8f380c04afdc2cbca62 0 1762226356526 1 connected |
|
| 146 | +2d358d3756882e035476753c6d52e36103968b20 192.168.184.122:16381@26381,,shard-id=9896905ec818477b8b2d657d6cf2c1fbf571f9ad master - 0 1762226355823 3 connected 10923-16383 |
|
| 147 | + |
|
| 148 | + |
|
| 149 | +--- |
|
| 150 | + |
|
| 151 | +redis-cli -p 16379 cluster info |
|
| 152 | +cluster_state:ok |
|
| 153 | +cluster_slots_assigned:16384 |
|
| 154 | +cluster_slots_ok:16384 |
|
| 155 | +cluster_slots_pfail:0 |
|
| 156 | +cluster_slots_fail:0 |
|
| 157 | +cluster_known_nodes:6 |
|
| 158 | +cluster_size:3 |
|
| 159 | +cluster_current_epoch:6 |
|
| 160 | +cluster_my_epoch:1 |
|
| 161 | +cluster_stats_messages_ping_sent:6756 |
|
| 162 | +cluster_stats_messages_pong_sent:6687 |
|
| 163 | +cluster_stats_messages_sent:13443 |
|
| 164 | +cluster_stats_messages_ping_received:6682 |
|
| 165 | +cluster_stats_messages_pong_received:6756 |
|
| 166 | +cluster_stats_messages_meet_received:5 |
|
| 167 | +cluster_stats_messages_received:13443 |
|
| 168 | +total_cluster_links_buffer_limit_exceeded: |
|
| 169 | +``` |
|
| 170 | + |
|
| 171 | +### 5.2 检查集群健康度 |
|
| 172 | +```bash |
|
| 173 | +redis-cli -p 16379 -a snest123 cluster info |
|
| 174 | +``` |
|
| 175 | +**关键指标**: |
|
| 176 | +- `cluster_state:ok`:集群状态正常。 |
|
| 177 | +- `cluster_slots_assigned:16384`:所有槽已分配。 |
|
| 178 | +- `cluster_known_nodes:6`:识别到6个节点。 |
|
| 179 | + |
|
| 180 | +### 5.3 数据读写测试 |
|
| 181 | +```bash |
|
| 182 | +# 连接集群(-c 参数启用集群模式) |
|
| 183 | +redis-cli -c -p 16380 -a snest123 |
|
| 184 | +127.0.0.1:16380> set key1 value1 |
|
| 185 | +-> Redirected to slot [9189] located at 192.168.184.122:16380 |
|
| 186 | +OK |
|
| 187 | +192.168.184.122:16380> get key1 |
|
| 188 | +"value1" |
|
| 189 | +``` |
|
| 190 | + |
|
| 191 | +## 6. 关键注意事项 |
|
| 192 | +1. **密钥哈希标签**: |
|
| 193 | + 若需确保多个 key 分配到同一槽(如 Lua 脚本、事务、pipeline等),需使用哈希标签(例如 `{user1000}.profile` 和 `{user1000}.history` 会被分配到同一槽)。 |
|
| 194 | + |
|
| 195 | +2. **客户端兼容性**: |
|
| 196 | + 客户端需支持集群模式(如 Jedis、Lettuce),并能处理 `MOVED/ASK` 重定向错误。 |
|
| 197 | + |
|
| 198 | +3. **备份与监控**: |
|
| 199 | + - 定期持久化 RDB/AOF 数据。 |
|
| 200 | + - 监控集群状态:`cluster info`、节点延迟、内存使用。 |
|
| 201 | + |
|
| 202 | +4. **故障模拟测试**: |
|
| 203 | + 可手动关闭主节点,验证从节点是否自动晋升(通过 `cluster nodes` 观察角色变化)。 |
|
| 204 | + |
|
| 205 | +## 7. 常见问题 |
|
| 206 | +- **集群创建失败**:检查防火墙、密码一致性、总线端口是否开放。 |
|
| 207 | +- **节点无法加入集群**:确认所有节点已启动,且 `cluster-config-file` 可写入。 |
|
| 208 | +- **槽未完全分配**:执行 `redis-cli --cluster fix <host:port> -a <password>` 修复。 |
|
| 209 | + |
|
| 210 | + |