可以结合之前的文章融合起来一起理解学习:分布式缓存-Redis集群
在一个名为"数据大陆"的世界里,Redis王国正面临着前所未有的挑战。随着用户流量的激增,单机Redis服务器已经不堪重负。今天,就让我们跟随年轻的架构师小明,一起踏上Redis高可用与高并发的探险之旅!
第一章:危机初现 - 单机Redis的困境
小明所在公司的电商平台迎来了爆发式增长,原本稳定的Redis单机服务器开始出现性能瓶颈:
- 内存不足,无法缓存更多热门商品数据
- QPS达到瓶颈,秒杀活动时响应缓慢
- 单点故障风险,一旦宕机整个系统将崩溃
"必须升级我们的Redis架构了!"小明下定决心,开始了他的技术探索之旅。
第二章:主从复制 - 建立Redis的"后备军团"
2.1 主从复制原理探秘
小明首先想到了主从复制架构,这就像是给Redis国王配备了一支忠诚的护卫队。
全量同步流程:
graph TB A[从节点启动] --> B[发送PSYNC命令] B --> C{主节点判断} C -->|第一次同步| D[执行BGSAVE] D --> E[生成RDB文件] E --> F[发送RDB文件给从节点] F --> G[从节点加载RDB] G --> H[主节点发送缓冲区命令] H --> I[从节点执行缓冲命令] I --> J[同步完成] C -->|非第一次同步| K[发送部分同步命令] K --> J增量同步机制:
- 主节点维护复制积压缓冲区(repl_backlog_buffer)
- 从节点断线重连后发送PSYNC命令,携带复制偏移量
- 主节点判断偏移量是否在缓冲区内,决定全量还是增量同步
2.2 保姆级主从复制搭建实战
配置思路
架构规划:
- 1个主节点 + 2个从节点
- 主节点负责写操作,从节点负责读操作
- 数据实时同步,从节点作为热备份
配置要点:
- 主节点:正常Redis配置,无需特殊复制配置
- 从节点:配置replicaof指向主节点,设置replica-read-only
- 认证:主从节点间配置masterauth和requirepass
详细搭建步骤
环境准备:- # 三台服务器
- 主节点:192.168.1.10:6379
- 从节点1:192.168.1.11:6379
- 从节点2:192.168.1.12:6379
复制代码 步骤1:在所有节点安装Redis- # 以Ubuntu为例,安装Redis 6.2.6
- sudo apt update
- sudo apt install -y redis-server
- # 或者编译安装最新版本
- wget https://download.redis.io/releases/redis-6.2.6.tar.gz
- tar xzf redis-6.2.6.tar.gz
- cd redis-6.2.6
- make
- sudo make install
- # 创建必要的目录
- sudo mkdir -p /var/lib/redis
- sudo mkdir -p /var/log/redis
- sudo chown redis:redis /var/lib/redis
- sudo chown redis:redis /var/log/redis
复制代码 步骤2:配置主节点(192.168.1.10)
编辑主节点配置文件:- sudo vim /etc/redis/redis.conf
复制代码 主节点核心配置:- # ==================== 基础配置 ====================
- bind 0.0.0.0 # 允许所有IP连接
- port 6379 # 监听端口
- protected-mode no # 关闭保护模式,允许外部连接
- daemonize yes # 后台运行
- pidfile /var/run/redis_6379.pid
- logfile "/var/log/redis/redis.log"
- dir /var/lib/redis # 数据目录
- # ==================== 持久化配置 ====================
- save 900 1 # 15分钟内至少1个key变化则保存
- save 300 10 # 5分钟内至少10个key变化则保存
- save 60 10000 # 1分钟内至少10000个key变化则保存
- rdbcompression yes # 压缩RDB文件
- dbfilename dump.rdb
- # ==================== 安全配置 ====================
- requirepass MasterRedis123! # 主节点密码
- # ==================== 内存配置 ====================
- maxmemory 2gb # 最大内存限制
- maxmemory-policy allkeys-lru # 内存淘汰策略
- # ==================== 主从复制配置 ====================
- # 主节点无需特殊配置,但建议设置以下参数优化复制
- repl-backlog-size 1mb # 复制积压缓冲区大小
- repl-backlog-ttl 3600 # 复制积压缓冲区存活时间
- repl-timeout 60 # 复制超时时间
复制代码 步骤3:配置从节点1(192.168.1.11)
编辑从节点1配置文件:- sudo vim /etc/redis/redis.conf
复制代码 从节点1核心配置:- # ==================== 基础配置 ====================
- bind 0.0.0.0
- port 6379
- protected-mode no
- daemonize yes
- pidfile /var/run/redis_6379.pid
- logfile "/var/log/redis/redis_slave1.log" # 不同从节点使用不同日志文件
- dir /var/lib/redis
- # ==================== 持久化配置 ====================
- # 从节点也需要持久化配置,与主节点保持一致
- save 900 1
- save 300 10
- save 60 10000
- rdbcompression yes
- dbfilename dump.rdb
- # ==================== 安全配置 ====================
- requirepass SlaveRedis123! # 从节点自身密码
- # ==================== 主从复制核心配置 ====================
- replicaof 192.168.1.10 6379 # 关键配置:指向主节点
- masterauth MasterRedis123! # 主节点密码
- replica-read-only yes # 从节点只读,确保数据一致性
- # ==================== 复制优化配置 ====================
- repl-diskless-sync no # 不使用无盘复制
- repl-diskless-sync-delay 5 # 无盘复制延迟
- repl-disable-tcp-nodelay no # 启用TCP_NODELAY
- repl-backlog-size 1mb # 复制积压缓冲区
- repl-ping-replica-period 10 # 从节点ping主节点间隔
- repl-timeout 60 # 复制超时时间
- # ==================== 内存配置 ====================
- maxmemory 2gb
- maxmemory-policy allkeys-lru
复制代码 从节点2配置与从节点1类似,只需修改日志文件名。
步骤4:启动所有Redis实例- # 在主节点启动
- sudo systemctl start redis
- # 或者手动启动
- sudo redis-server /etc/redis/redis.conf
- # 在从节点1启动
- sudo systemctl start redis
- # 在从节点2启动
- sudo systemctl start redis
复制代码 步骤5:验证主从复制状态- # 连接到主节点查看复制信息
- redis-cli -h 192.168.1.10 -a MasterRedis123! info replication
- # 预期输出示例:
- # Replication
- # role:master
- # connected_slaves:2
- # slave0:ip=192.168.1.11,port=6379,state=online,offset=xxx,lag=0
- # slave1:ip=192.168.1.12,port=6379,state=online,offset=xxx,lag=0
- # master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- # master_repl_offset:xxx
- # 测试数据同步
- redis-cli -h 192.168.1.10 -a MasterRedis123! set test_key "hello_master"
- redis-cli -h 192.168.1.11 -a SlaveRedis123! get test_key
- # 应该返回 "hello_master"
- # 验证从节点只读特性
- redis-cli -h 192.168.1.11 -a SlaveRedis123! set test_key2 "hello_slave"
- # 应该返回错误:(error) READONLY You can't write against a read only replica.
复制代码 步骤6:创建系统服务(可选但推荐)- # 如果使用编译安装,需要创建systemd服务
- sudo vim /etc/systemd/system/redis.service
复制代码- [Unit]
- Description=Redis persistent key-value database
- After=network.target
- [Service]
- ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
- ExecReload=/bin/kill -USR2 $MAINPID
- TimeoutStopSec=0
- Restart=always
- User=redis
- Group=redis
- RuntimeDirectory=redis
- RuntimeDirectoryMode=0755
- [Install]
- WantedBy=multi-user.target
复制代码 第三章:Sentinel哨兵 - 智慧的"守护者"
3.1 Sentinel工作原理深度解析
小明发现主从架构还有个致命弱点:主节点宕机时需要手动切换。于是他引入了Sentinel哨兵系统。
Sentinel四大核心功能:
- 监控:定期检查主从节点健康状态
- 通知:通过API向管理员发送故障报警
- 自动故障转移:主节点故障时选举新的主节点
- 配置提供者:为客户端提供服务发现功能
Sentinel故障转移流程:
sequenceDiagram participant S1 as Sentinel1 participant S2 as Sentinel2 participant S3 as Sentinel3 participant M as Master participant S as Slave Note over S1,S3: 监控阶段 S1->>M: PING (每1秒) S2->>M: PING S3->>M: PING Note over S1,S3: 主观下线 S1->>S1: 检测Master无响应
标记为+sdown Note over S1,S3: 客观下线 S1->>S2: SENTINEL is-master-down-by-addr S1->>S3: SENTINEL is-master-down-by-addr S2->>S1: 同意下线 S3->>S1: 同意下线 S1->>S1: 收到足够投票
标记为+odown Note over S1,S3: 选举领导者 S1->>S2: 请求投票 S2->>S1: 投票给S1 S3->>S1: 投票给S1 Note over S1,S3: 故障转移 S1->>S: 升级为新的Master S1->>其他Slave: 指向新Master3.2 保姆级Sentinel集群搭建实战
配置思路
架构规划:
- 3个Sentinel节点形成集群(最少3个避免脑裂)
- 每个Sentinel监控同一个主节点
- 法定人数(quorum)设置为2,即需要2个Sentinel同意才能进行故障转移
配置要点:
- 所有Sentinel配置相同的monitor规则
- 设置合理的down-after-milliseconds和failover-timeout
- 配置认证信息确保安全
详细搭建步骤
环境准备:- # 三台服务器部署Sentinel
- Sentinel1: 192.168.1.20:26379
- Sentinel2: 192.168.1.21:26379
- Sentinel3: 192.168.1.22:26379
- # 监控的主从架构
- 主节点: 192.168.1.10:6379
- 从节点1: 192.168.1.11:6379
- 从节点2: 192.168.1.12:6379
复制代码 步骤1:在所有Sentinel节点创建配置目录- # 创建Sentinel专用目录
- sudo mkdir -p /etc/redis/sentinel
- sudo mkdir -p /var/lib/redis/sentinel
- sudo mkdir -p /var/log/redis/sentinel
- sudo chown -R redis:redis /var/lib/redis/sentinel
- sudo chown redis:redis /var/log/redis/sentinel
复制代码 步骤2:配置Sentinel节点
Sentinel核心配置文件:- sudo vim /etc/redis/sentinel/sentinel.conf
复制代码 Sentinel配置详解:- # ==================== 基础配置 ====================
- port 26379 # Sentinel监听端口
- bind 0.0.0.0 # 绑定所有IP
- protected-mode no # 关闭保护模式
- daemonize yes # 后台运行
- pidfile "/var/run/redis-sentinel.pid"
- logfile "/var/log/redis/sentinel/sentinel.log"
- dir "/var/lib/redis/sentinel" # Sentinel工作目录
- # ==================== 核心监控配置 ====================
- # 格式:sentinel monitor <master-name> <ip> <port> <quorum>
- sentinel monitor mymaster 192.168.1.10 6379 2
- # ==================== 主节点认证配置 ====================
- # 如果主节点有密码,必须配置
- sentinel auth-pass mymaster MasterRedis123!
- # ==================== 故障检测配置 ====================
- # 主观下线时间:30秒无响应则认为主观下线
- sentinel down-after-milliseconds mymaster 30000
- # ==================== 故障转移配置 ====================
- # 故障转移超时时间:3分钟
- sentinel failover-timeout mymaster 180000
- # 并行同步数量:故障转移后同时同步的从节点数
- sentinel parallel-syncs mymaster 1
- # ==================== 安全配置 ====================
- # Sentinel自身密码(所有Sentinel必须相同)
- requirepass "SentinelAuth123!"
- # ==================== 通知脚本(可选) ====================
- # 故障转移时执行脚本
- # sentinel notification-script mymaster /path/to/script.sh
- # ==================== 客户端重配置脚本(可选) ====================
- # sentinel client-reconfig-script mymaster /path/to/script.sh
- # ==================== 运行配置 ====================
- loglevel notice # 日志级别
复制代码 步骤3:启动所有Sentinel实例- # 方式1:使用redis-sentinel启动
- redis-sentinel /etc/redis/sentinel/sentinel.conf
- # 方式2:使用redis-server启动
- redis-server /etc/redis/sentinel/sentinel.conf --sentinel
- # 验证Sentinel是否启动
- ps aux | grep redis-sentinel
- netstat -lnpt | grep 26379
复制代码 步骤4:验证Sentinel集群状态- # 连接到任意Sentinel节点查看状态
- redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! info sentinel
- # 预期输出:
- # Sentinel
- # sentinel_masters:1
- # sentinel_tilt:0
- # sentinel_running_scripts:0
- # sentinel_scripts_queue_length:0
- # sentinel_simulate_failure_flags:0
- # master0:name=mymaster,status=ok,address=192.168.1.10:6379,slaves=2,sentinels=3
- # 查看详细的主节点信息
- redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel master mymaster
- # 查看从节点信息
- redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel slaves mymaster
- # 查看其他Sentinel节点信息
- redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel sentinels mymaster
复制代码 步骤5:测试故障转移功能- # 1. 查看当前主节点
- redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel get-master-addr-by-name mymaster
- # 2. 模拟主节点故障(在主节点执行)
- redis-cli -h 192.168.1.10 -a MasterRedis123! debug segfault
- # 3. 观察Sentinel日志
- tail -f /var/log/redis/sentinel/sentinel.log
- # 4. 等待约30-60秒,查看新的主节点
- redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel get-master-addr-by-name mymaster
- # 5. 恢复原主节点,观察它如何重新加入为从节点
- redis-server /etc/redis/redis.conf
复制代码 步骤6:创建Sentinel系统服务- sudo vim /etc/systemd/system/redis-sentinel.service
复制代码- [Unit]
- Description=Redis Sentinel
- After=network.target
- [Service]
- Type=forking
- User=redis
- Group=redis
- ExecStart=/usr/local/bin/redis-sentinel /etc/redis/sentinel/sentinel.conf
- ExecStop=/usr/local/bin/redis-cli -p 26379 -a SentinelAuth123! shutdown
- Restart=always
- RestartSec=3
- [Install]
- WantedBy=multi-user.target
复制代码- # 启用并启动服务
- sudo systemctl daemon-reload
- sudo systemctl enable redis-sentinel
- sudo systemctl start redis-sentinel
- sudo systemctl status redis-sentinel
复制代码 第四章:Redis Cluster - 终极解决方案
4.1 数据分片与哈希槽原理
随着数据量持续增长,小明发现即使有主从和哨兵,单机内存限制仍然是瓶颈。于是他决定采用Redis Cluster——分布式终极方案。
哈希槽分配机制:
- Redis Cluster将整个数据集划分为16384个哈希槽
- 每个键通过CRC16校验后对16384取模决定所属槽位
- 集群中的每个节点负责一部分哈希槽
4.2 保姆级Redis Cluster搭建实战
配置思路
架构规划:
- 6节点集群:3主3从
- 每个主节点有一个从节点作为备份
- 数据自动分片到不同节点
- 支持节点故障自动转移
配置要点:
- 所有节点开启集群模式cluster-enabled yes
- 配置集群节点超时时间cluster-node-timeout
- 设置统一的集群密码
- 配置集群总线端口
详细搭建步骤
环境准备:- # 6台服务器,3主3从
- 节点1: 192.168.1.30:7000 (主)
- 节点2: 192.168.1.31:7001 (主)
- 节点3: 192.168.1.32:7002 (主)
- 节点4: 192.168.1.33:7003 (从,复制节点1)
- 节点5: 192.168.1.34:7004 (从,复制节点2)
- 节点6: 192.168.1.35:7005 (从,复制节点3)
复制代码 步骤1:在所有节点创建集群配置目录- # 为每个节点创建独立目录
- sudo mkdir -p /etc/redis/cluster
- sudo mkdir -p /var/lib/redis/700{0..5}
- sudo mkdir -p /var/log/redis/cluster
- sudo chown -R redis:redis /var/lib/redis/700*
- sudo chown redis:redis /var/log/redis/cluster
复制代码 步骤2:配置集群节点
节点1核心配置(192.168.1.30:7000):- sudo vim /etc/redis/cluster/redis-7000.conf
复制代码- # ==================== 基础配置 ====================
- port 7000 # 节点端口
- bind 0.0.0.0 # 绑定所有IP
- protected-mode no # 关闭保护模式
- daemonize yes # 后台运行
- pidfile "/var/run/redis-7000.pid"
- logfile "/var/log/redis/cluster/redis-7000.log"
- dir "/var/lib/redis/7000" # 数据目录
- # ==================== 集群核心配置 ====================
- cluster-enabled yes # 开启集群模式
- cluster-config-file nodes-7000.conf # 集群节点配置文件(自动生成)
- cluster-node-timeout 15000 # 节点超时时间(毫秒)
- cluster-replica-validity-factor 10 # 从节点有效性因子
- cluster-migration-barrier 1 # 主节点迁移屏障
- cluster-require-full-coverage yes # 要求所有槽位被覆盖
- # ==================== 安全配置 ====================
- requirepass ClusterRedis123! # 节点访问密码
- masterauth ClusterRedis123! # 主节点间认证密码
- # ==================== 持久化配置 ====================
- appendonly yes # 开启AOF持久化
- appendfilename "appendonly-7000.aof" # AOF文件名
- appendfsync everysec # 每秒同步
- auto-aof-rewrite-percentage 100 # AOF重写触发条件
- auto-aof-rewrite-min-size 64mb
- # ==================== 内存配置 ====================
- maxmemory 2gb
- maxmemory-policy allkeys-lru
- # ==================== 集群网络配置 ====================
- cluster-announce-port 7000 # 集群通信端口
- cluster-announce-bus-port 17000 # 集群总线端口
- # ==================== 性能配置 ====================
- tcp-keepalive 60
- timeout 0
- tcp-backlog 511
复制代码 为其他节点创建类似配置:- # 节点2 (192.168.1.31:7001)
- sudo cp /etc/redis/cluster/redis-7000.conf /etc/redis/cluster/redis-7001.conf
- sudo sed -i 's/7000/7001/g' /etc/redis/cluster/redis-7001.conf
- sudo sed -i 's/17000/17001/g' /etc/redis/cluster/redis-7001.conf
- # 节点3 (192.168.1.32:7002)
- sudo cp /etc/redis/cluster/redis-7000.conf /etc/redis/cluster/redis-7002.conf
- sudo sed -i 's/7000/7002/g' /etc/redis/cluster/redis-7002.conf
- sudo sed -i 's/17000/17002/g' /etc/redis/cluster/redis-7002.conf
- # 节点4-6类似修改
复制代码 步骤3:启动所有集群节点- # 在每个节点上启动对应的Redis实例
- # 节点1
- redis-server /etc/redis/cluster/redis-7000.conf
- # 节点2
- redis-server /etc/redis/cluster/redis-7001.conf
- # 节点3
- redis-server /etc/redis/cluster/redis-7002.conf
- # 节点4
- redis-server /etc/redis/cluster/redis-7003.conf
- # 节点5
- redis-server /etc/redis/cluster/redis-7004.conf
- # 节点6
- redis-server /etc/redis/cluster/redis-7005.conf
- # 验证节点是否启动
- ps aux | grep redis-server
- netstat -lnpt | grep 700
复制代码 步骤4:创建Redis集群- # 在任意节点执行集群创建命令
- redis-cli --cluster create \
- 192.168.1.30:7000 \
- 192.168.1.31:7001 \
- 192.168.1.32:7002 \
- 192.168.1.33:7003 \
- 192.168.1.34:7004 \
- 192.168.1.35:7005 \
- --cluster-replicas 1 \
- -a ClusterRedis123!
复制代码 详细交互过程:- # 执行创建命令后,会显示槽位分配方案
- >>> 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.33:7003 to 192.168.1.30:7000
- Adding replica 192.168.1.34:7004 to 192.168.1.31:7001
- Adding replica 192.168.1.35:7005 to 192.168.1.32:7002
- # 询问是否接受这个分配方案
- 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 node 192.168.1.30:7000)
- M: 3a3b... 192.168.1.30:7000
- slots:[0-5460] (5461 slots) master
- 1 additional replica(s)
- S: 8c7d... 192.168.1.33:7003
- slots: (0 slots) slave
- replicates 3a3b...
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered.
复制代码 步骤5:验证集群状态- # 查看集群节点信息
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster nodes
- # 预期输出示例:
- # 3a3b... 192.168.1.30:7000@17000 myself,master - 0 0 1 connected 0-5460
- # 8c7d... 192.168.1.31:7001@17001 master - 0 1620000000000 2 connected 5461-10922
- # e9f0... 192.168.1.32:7002@17002 master - 0 1620000000000 3 connected 10923-16383
- # a1b2... 192.168.1.33:7003@17003 slave 3a3b... 0 1620000000000 1 connected
- # c3d4... 192.168.1.34:7004@17004 slave 8c7d... 0 1620000000000 2 connected
- # e5f6... 192.168.1.35:7005@17005 slave e9f0... 0 1620000000000 3 connected
- # 查看集群信息
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster info
- # 测试数据分布和重定向
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! set user:1001 "user_data_1"
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! set user:2001 "user_data_2"
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! set user:3001 "user_data_3"
- # 观察重定向过程,数据会自动路由到正确的节点
复制代码 步骤6:创建集群系统服务- # 创建集群服务模板
- sudo vim /etc/systemd/system/redis-cluster@.service
复制代码- [Unit]
- Description=Redis Cluster Node on port %i
- After=network.target
- [Service]
- Type=forking
- User=redis
- Group=redis
- ExecStart=/usr/local/bin/redis-server /etc/redis/cluster/redis-%i.conf
- ExecStop=/usr/local/bin/redis-cli -p %i -a ClusterRedis123! shutdown
- Restart=always
- RestartSec=3
- [Install]
- WantedBy=multi-user.target
复制代码- # 启用所有节点服务
- sudo systemctl daemon-reload
- sudo systemctl enable redis-cluster@7000
- sudo systemctl enable redis-cluster@7001
- sudo systemctl enable redis-cluster@7002
- sudo systemctl enable redis-cluster@7003
- sudo systemctl enable redis-cluster@7004
- sudo systemctl enable redis-cluster@7005
- # 启动所有服务
- sudo systemctl start redis-cluster@7000
- sudo systemctl start redis-cluster@7001
- sudo systemctl start redis-cluster@7002
- sudo systemctl start redis-cluster@7003
- sudo systemctl start redis-cluster@7004
- sudo systemctl start redis-cluster@7005
- # 检查服务状态
- sudo systemctl status redis-cluster@7000
复制代码 4.3 集群管理操作
检查集群健康状态:- # 检查集群状态
- redis-cli --cluster check 192.168.1.30:7000 -a ClusterRedis123!
- # 查看集群信息
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster info
- # 查看节点信息
- redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster nodes
复制代码 添加新节点:- # 准备新节点配置文件(端口7006)
- # 按照步骤2创建配置并启动
- # 添加新主节点到集群
- redis-cli --cluster add-node 192.168.1.36:7006 192.168.1.30:7000 -a ClusterRedis123!
- # 重新分片(将部分槽位迁移到新节点)
- redis-cli --cluster reshard 192.168.1.30:7000 -a ClusterRedis123!
- # 交互过程:
- # How many slots do you want to move (from 1 to 16384)? 1000
- # What is the receiving node ID? [输入新节点的ID]
- # Source node #1: all
- # 输入yes开始迁移
复制代码 故障转移测试:- # 模拟主节点故障
- redis-cli -h 192.168.1.30 -p 7000 -a ClusterRedis123! debug segfault
- # 观察从节点自动升级为主节点
- redis-cli -c -h 192.168.1.31 -p 7001 -a ClusterRedis123! cluster nodes
- # 恢复节点,观察它如何重新加入集群
- redis-server /etc/redis/cluster/redis-7000.conf
复制代码 第五章:架构对比与选型指南
经过详细实践,小明总结了各种方案的适用场景:
架构方案适用场景优点缺点配置复杂度主从复制读多写少、数据备份简单易用、读写分离、数据热备无法自动故障转移、写操作单点★☆☆☆☆Sentinel高可用需求、自动故障转移自动故障转移、配置相对简单、客户端透明存储受单机限制、写操作单点★★☆☆☆Cluster大数据量、高并发、线性扩展数据分片、真正的分布式、高可用配置复杂、客户端需要支持、运维复杂★★★★★选型建议:
- 开发测试环境:主从复制
- 数据量2GB,高并发需求:Redis Cluster
- 读写分离场景:主从复制 + 读写分离中间件
第六章:生产环境最佳实践
6.1 配置优化要点
主从复制优化:- # 在主节点配置中增加
- repl-backlog-size 512mb # 增大复制积压缓冲区
- repl-backlog-ttl 3600 # 缓冲区存活时间
- min-replicas-to-write 1 # 至少1个从节点才允许写
- min-replicas-max-lag 10 # 从节点延迟不超过10秒
复制代码 Sentinel优化:- # 在Sentinel配置中增加
- sentinel parallel-syncs mymaster 1 # 控制并行同步数量
- sentinel failover-timeout mymaster 60000 # 调整故障转移超时
- sentinel down-after-milliseconds mymaster 5000 # 更敏感的下线检测
复制代码 Cluster优化:- # 在集群节点配置中增加
- cluster-node-timeout 15000 # 节点超时时间
- cluster-slave-validity-factor 10 # 从节点有效性
- cluster-migration-barrier 1 # 迁移屏障
- cluster-require-full-coverage no # 允许部分槽位不可用
复制代码 6.2 监控与告警
关键监控指标:
<ul>内存使用率( |