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
+