找回密码
 立即注册
首页 业界区 业界 Redis高可用与高并发探险之旅:从单机到集群的完美进化 ...

Redis高可用与高并发探险之旅:从单机到集群的完美进化【第三部分】

豺独 2025-11-6 20:40:00
可以结合之前的文章融合起来一起理解学习:分布式缓存-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
详细搭建步骤

环境准备:
  1. # 三台服务器
  2. 主节点:192.168.1.10:6379
  3. 从节点1:192.168.1.11:6379
  4. 从节点2:192.168.1.12:6379
复制代码
步骤1:在所有节点安装Redis
  1. # 以Ubuntu为例,安装Redis 6.2.6
  2. sudo apt update
  3. sudo apt install -y redis-server
  4. # 或者编译安装最新版本
  5. wget https://download.redis.io/releases/redis-6.2.6.tar.gz
  6. tar xzf redis-6.2.6.tar.gz
  7. cd redis-6.2.6
  8. make
  9. sudo make install
  10. # 创建必要的目录
  11. sudo mkdir -p /var/lib/redis
  12. sudo mkdir -p /var/log/redis
  13. sudo chown redis:redis /var/lib/redis
  14. sudo chown redis:redis /var/log/redis
复制代码
步骤2:配置主节点(192.168.1.10)
编辑主节点配置文件:
  1. sudo vim /etc/redis/redis.conf
复制代码
主节点核心配置:
  1. # ==================== 基础配置 ====================
  2. bind 0.0.0.0                    # 允许所有IP连接
  3. port 6379                       # 监听端口
  4. protected-mode no               # 关闭保护模式,允许外部连接
  5. daemonize yes                   # 后台运行
  6. pidfile /var/run/redis_6379.pid
  7. logfile "/var/log/redis/redis.log"
  8. dir /var/lib/redis              # 数据目录
  9. # ==================== 持久化配置 ====================
  10. save 900 1                      # 15分钟内至少1个key变化则保存
  11. save 300 10                     # 5分钟内至少10个key变化则保存  
  12. save 60 10000                   # 1分钟内至少10000个key变化则保存
  13. rdbcompression yes              # 压缩RDB文件
  14. dbfilename dump.rdb
  15. # ==================== 安全配置 ====================
  16. requirepass MasterRedis123!     # 主节点密码
  17. # ==================== 内存配置 ====================
  18. maxmemory 2gb                   # 最大内存限制
  19. maxmemory-policy allkeys-lru    # 内存淘汰策略
  20. # ==================== 主从复制配置 ====================
  21. # 主节点无需特殊配置,但建议设置以下参数优化复制
  22. repl-backlog-size 1mb           # 复制积压缓冲区大小
  23. repl-backlog-ttl 3600           # 复制积压缓冲区存活时间
  24. repl-timeout 60                 # 复制超时时间
复制代码
步骤3:配置从节点1(192.168.1.11)
编辑从节点1配置文件:
  1. sudo vim /etc/redis/redis.conf
复制代码
从节点1核心配置:
  1. # ==================== 基础配置 ====================
  2. bind 0.0.0.0
  3. port 6379
  4. protected-mode no
  5. daemonize yes
  6. pidfile /var/run/redis_6379.pid
  7. logfile "/var/log/redis/redis_slave1.log"  # 不同从节点使用不同日志文件
  8. dir /var/lib/redis
  9. # ==================== 持久化配置 ====================
  10. # 从节点也需要持久化配置,与主节点保持一致
  11. save 900 1
  12. save 300 10
  13. save 60 10000
  14. rdbcompression yes
  15. dbfilename dump.rdb
  16. # ==================== 安全配置 ====================
  17. requirepass SlaveRedis123!      # 从节点自身密码
  18. # ==================== 主从复制核心配置 ====================
  19. replicaof 192.168.1.10 6379     # 关键配置:指向主节点
  20. masterauth MasterRedis123!      # 主节点密码
  21. replica-read-only yes           # 从节点只读,确保数据一致性
  22. # ==================== 复制优化配置 ====================
  23. repl-diskless-sync no           # 不使用无盘复制
  24. repl-diskless-sync-delay 5      # 无盘复制延迟
  25. repl-disable-tcp-nodelay no     # 启用TCP_NODELAY
  26. repl-backlog-size 1mb           # 复制积压缓冲区
  27. repl-ping-replica-period 10     # 从节点ping主节点间隔
  28. repl-timeout 60                 # 复制超时时间
  29. # ==================== 内存配置 ====================
  30. maxmemory 2gb
  31. maxmemory-policy allkeys-lru
复制代码
从节点2配置与从节点1类似,只需修改日志文件名。
步骤4:启动所有Redis实例
  1. # 在主节点启动
  2. sudo systemctl start redis
  3. # 或者手动启动
  4. sudo redis-server /etc/redis/redis.conf
  5. # 在从节点1启动
  6. sudo systemctl start redis
  7. # 在从节点2启动  
  8. sudo systemctl start redis
复制代码
步骤5:验证主从复制状态
  1. # 连接到主节点查看复制信息
  2. redis-cli -h 192.168.1.10 -a MasterRedis123! info replication
  3. # 预期输出示例:
  4. # Replication
  5. # role:master
  6. # connected_slaves:2
  7. # slave0:ip=192.168.1.11,port=6379,state=online,offset=xxx,lag=0
  8. # slave1:ip=192.168.1.12,port=6379,state=online,offset=xxx,lag=0
  9. # master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  10. # master_repl_offset:xxx
  11. # 测试数据同步
  12. redis-cli -h 192.168.1.10 -a MasterRedis123! set test_key "hello_master"
  13. redis-cli -h 192.168.1.11 -a SlaveRedis123! get test_key
  14. # 应该返回 "hello_master"
  15. # 验证从节点只读特性
  16. redis-cli -h 192.168.1.11 -a SlaveRedis123! set test_key2 "hello_slave"
  17. # 应该返回错误:(error) READONLY You can't write against a read only replica.
复制代码
步骤6:创建系统服务(可选但推荐)
  1. # 如果使用编译安装,需要创建systemd服务
  2. sudo vim /etc/systemd/system/redis.service
复制代码
  1. [Unit]
  2. Description=Redis persistent key-value database
  3. After=network.target
  4. [Service]
  5. ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
  6. ExecReload=/bin/kill -USR2 $MAINPID
  7. TimeoutStopSec=0
  8. Restart=always
  9. User=redis
  10. Group=redis
  11. RuntimeDirectory=redis
  12. RuntimeDirectoryMode=0755
  13. [Install]
  14. 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
  • 配置认证信息确保安全
详细搭建步骤

环境准备:
  1. # 三台服务器部署Sentinel
  2. Sentinel1: 192.168.1.20:26379
  3. Sentinel2: 192.168.1.21:26379  
  4. Sentinel3: 192.168.1.22:26379
  5. # 监控的主从架构
  6. 主节点: 192.168.1.10:6379
  7. 从节点1: 192.168.1.11:6379
  8. 从节点2: 192.168.1.12:6379
复制代码
步骤1:在所有Sentinel节点创建配置目录
  1. # 创建Sentinel专用目录
  2. sudo mkdir -p /etc/redis/sentinel
  3. sudo mkdir -p /var/lib/redis/sentinel
  4. sudo mkdir -p /var/log/redis/sentinel
  5. sudo chown -R redis:redis /var/lib/redis/sentinel
  6. sudo chown redis:redis /var/log/redis/sentinel
复制代码
步骤2:配置Sentinel节点
Sentinel核心配置文件:
  1. sudo vim /etc/redis/sentinel/sentinel.conf
复制代码
Sentinel配置详解:
  1. # ==================== 基础配置 ====================
  2. port 26379                              # Sentinel监听端口
  3. bind 0.0.0.0                           # 绑定所有IP
  4. protected-mode no                       # 关闭保护模式
  5. daemonize yes                          # 后台运行
  6. pidfile "/var/run/redis-sentinel.pid"
  7. logfile "/var/log/redis/sentinel/sentinel.log"
  8. dir "/var/lib/redis/sentinel"          # Sentinel工作目录
  9. # ==================== 核心监控配置 ====================
  10. # 格式:sentinel monitor <master-name> <ip> <port> <quorum>
  11. sentinel monitor mymaster 192.168.1.10 6379 2
  12. # ==================== 主节点认证配置 ====================
  13. # 如果主节点有密码,必须配置
  14. sentinel auth-pass mymaster MasterRedis123!
  15. # ==================== 故障检测配置 ====================
  16. # 主观下线时间:30秒无响应则认为主观下线
  17. sentinel down-after-milliseconds mymaster 30000
  18. # ==================== 故障转移配置 ====================
  19. # 故障转移超时时间:3分钟
  20. sentinel failover-timeout mymaster 180000
  21. # 并行同步数量:故障转移后同时同步的从节点数
  22. sentinel parallel-syncs mymaster 1
  23. # ==================== 安全配置 ====================
  24. # Sentinel自身密码(所有Sentinel必须相同)
  25. requirepass "SentinelAuth123!"
  26. # ==================== 通知脚本(可选) ====================
  27. # 故障转移时执行脚本
  28. # sentinel notification-script mymaster /path/to/script.sh
  29. # ==================== 客户端重配置脚本(可选) ====================
  30. # sentinel client-reconfig-script mymaster /path/to/script.sh
  31. # ==================== 运行配置 ====================
  32. loglevel notice                        # 日志级别
复制代码
步骤3:启动所有Sentinel实例
  1. # 方式1:使用redis-sentinel启动
  2. redis-sentinel /etc/redis/sentinel/sentinel.conf
  3. # 方式2:使用redis-server启动
  4. redis-server /etc/redis/sentinel/sentinel.conf --sentinel
  5. # 验证Sentinel是否启动
  6. ps aux | grep redis-sentinel
  7. netstat -lnpt | grep 26379
复制代码
步骤4:验证Sentinel集群状态
  1. # 连接到任意Sentinel节点查看状态
  2. redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! info sentinel
  3. # 预期输出:
  4. # Sentinel
  5. # sentinel_masters:1
  6. # sentinel_tilt:0
  7. # sentinel_running_scripts:0
  8. # sentinel_scripts_queue_length:0
  9. # sentinel_simulate_failure_flags:0
  10. # master0:name=mymaster,status=ok,address=192.168.1.10:6379,slaves=2,sentinels=3
  11. # 查看详细的主节点信息
  12. redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel master mymaster
  13. # 查看从节点信息
  14. redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel slaves mymaster
  15. # 查看其他Sentinel节点信息
  16. redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel sentinels mymaster
复制代码
步骤5:测试故障转移功能
  1. # 1. 查看当前主节点
  2. redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel get-master-addr-by-name mymaster
  3. # 2. 模拟主节点故障(在主节点执行)
  4. redis-cli -h 192.168.1.10 -a MasterRedis123! debug segfault
  5. # 3. 观察Sentinel日志
  6. tail -f /var/log/redis/sentinel/sentinel.log
  7. # 4. 等待约30-60秒,查看新的主节点
  8. redis-cli -h 192.168.1.20 -p 26379 -a SentinelAuth123! sentinel get-master-addr-by-name mymaster
  9. # 5. 恢复原主节点,观察它如何重新加入为从节点
  10. redis-server /etc/redis/redis.conf
复制代码
步骤6:创建Sentinel系统服务
  1. sudo vim /etc/systemd/system/redis-sentinel.service
复制代码
  1. [Unit]
  2. Description=Redis Sentinel
  3. After=network.target
  4. [Service]
  5. Type=forking
  6. User=redis
  7. Group=redis
  8. ExecStart=/usr/local/bin/redis-sentinel /etc/redis/sentinel/sentinel.conf
  9. ExecStop=/usr/local/bin/redis-cli -p 26379 -a SentinelAuth123! shutdown
  10. Restart=always
  11. RestartSec=3
  12. [Install]
  13. WantedBy=multi-user.target
复制代码
  1. # 启用并启动服务
  2. sudo systemctl daemon-reload
  3. sudo systemctl enable redis-sentinel
  4. sudo systemctl start redis-sentinel
  5. 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
  • 设置统一的集群密码
  • 配置集群总线端口
详细搭建步骤

环境准备:
  1. # 6台服务器,3主3从
  2. 节点1: 192.168.1.30:7000 (主)
  3. 节点2: 192.168.1.31:7001 (主)
  4. 节点3: 192.168.1.32:7002 (主)
  5. 节点4: 192.168.1.33:7003 (从,复制节点1)
  6. 节点5: 192.168.1.34:7004 (从,复制节点2)
  7. 节点6: 192.168.1.35:7005 (从,复制节点3)
复制代码
步骤1:在所有节点创建集群配置目录
  1. # 为每个节点创建独立目录
  2. sudo mkdir -p /etc/redis/cluster
  3. sudo mkdir -p /var/lib/redis/700{0..5}
  4. sudo mkdir -p /var/log/redis/cluster
  5. sudo chown -R redis:redis /var/lib/redis/700*
  6. sudo chown redis:redis /var/log/redis/cluster
复制代码
步骤2:配置集群节点
节点1核心配置(192.168.1.30:7000):
  1. sudo vim /etc/redis/cluster/redis-7000.conf
复制代码
  1. # ==================== 基础配置 ====================
  2. port 7000                               # 节点端口
  3. bind 0.0.0.0                           # 绑定所有IP
  4. protected-mode no                       # 关闭保护模式
  5. daemonize yes                          # 后台运行
  6. pidfile "/var/run/redis-7000.pid"
  7. logfile "/var/log/redis/cluster/redis-7000.log"
  8. dir "/var/lib/redis/7000"              # 数据目录
  9. # ==================== 集群核心配置 ====================
  10. cluster-enabled yes                     # 开启集群模式
  11. cluster-config-file nodes-7000.conf     # 集群节点配置文件(自动生成)
  12. cluster-node-timeout 15000              # 节点超时时间(毫秒)
  13. cluster-replica-validity-factor 10      # 从节点有效性因子
  14. cluster-migration-barrier 1             # 主节点迁移屏障
  15. cluster-require-full-coverage yes       # 要求所有槽位被覆盖
  16. # ==================== 安全配置 ====================
  17. requirepass ClusterRedis123!            # 节点访问密码
  18. masterauth ClusterRedis123!             # 主节点间认证密码
  19. # ==================== 持久化配置 ====================
  20. appendonly yes                          # 开启AOF持久化
  21. appendfilename "appendonly-7000.aof"    # AOF文件名
  22. appendfsync everysec                    # 每秒同步
  23. auto-aof-rewrite-percentage 100         # AOF重写触发条件
  24. auto-aof-rewrite-min-size 64mb
  25. # ==================== 内存配置 ====================
  26. maxmemory 2gb
  27. maxmemory-policy allkeys-lru
  28. # ==================== 集群网络配置 ====================
  29. cluster-announce-port 7000              # 集群通信端口
  30. cluster-announce-bus-port 17000         # 集群总线端口
  31. # ==================== 性能配置 ====================
  32. tcp-keepalive 60
  33. timeout 0
  34. tcp-backlog 511
复制代码
为其他节点创建类似配置:
  1. # 节点2 (192.168.1.31:7001)
  2. sudo cp /etc/redis/cluster/redis-7000.conf /etc/redis/cluster/redis-7001.conf
  3. sudo sed -i 's/7000/7001/g' /etc/redis/cluster/redis-7001.conf
  4. sudo sed -i 's/17000/17001/g' /etc/redis/cluster/redis-7001.conf
  5. # 节点3 (192.168.1.32:7002)
  6. sudo cp /etc/redis/cluster/redis-7000.conf /etc/redis/cluster/redis-7002.conf
  7. sudo sed -i 's/7000/7002/g' /etc/redis/cluster/redis-7002.conf
  8. sudo sed -i 's/17000/17002/g' /etc/redis/cluster/redis-7002.conf
  9. # 节点4-6类似修改
复制代码
步骤3:启动所有集群节点
  1. # 在每个节点上启动对应的Redis实例
  2. # 节点1
  3. redis-server /etc/redis/cluster/redis-7000.conf
  4. # 节点2
  5. redis-server /etc/redis/cluster/redis-7001.conf
  6. # 节点3
  7. redis-server /etc/redis/cluster/redis-7002.conf
  8. # 节点4
  9. redis-server /etc/redis/cluster/redis-7003.conf
  10. # 节点5
  11. redis-server /etc/redis/cluster/redis-7004.conf
  12. # 节点6
  13. redis-server /etc/redis/cluster/redis-7005.conf
  14. # 验证节点是否启动
  15. ps aux | grep redis-server
  16. netstat -lnpt | grep 700
复制代码
步骤4:创建Redis集群
  1. # 在任意节点执行集群创建命令
  2. redis-cli --cluster create \
  3.   192.168.1.30:7000 \
  4.   192.168.1.31:7001 \
  5.   192.168.1.32:7002 \
  6.   192.168.1.33:7003 \
  7.   192.168.1.34:7004 \
  8.   192.168.1.35:7005 \
  9.   --cluster-replicas 1 \
  10.   -a ClusterRedis123!
复制代码
详细交互过程:
  1. # 执行创建命令后,会显示槽位分配方案
  2. >>> Performing hash slots allocation on 6 nodes...
  3. Master[0] -> Slots 0 - 5460
  4. Master[1] -> Slots 5461 - 10922  
  5. Master[2] -> Slots 10923 - 16383
  6. Adding replica 192.168.1.33:7003 to 192.168.1.30:7000
  7. Adding replica 192.168.1.34:7004 to 192.168.1.31:7001
  8. Adding replica 192.168.1.35:7005 to 192.168.1.32:7002
  9. # 询问是否接受这个分配方案
  10. Can I set the above configuration? (type 'yes' to accept): yes
  11. # 开始配置节点,等待集群组建完成
  12. >>> Nodes configuration updated
  13. >>> Assign a different config epoch to each node
  14. >>> Sending CLUSTER MEET messages to join the cluster
  15. Waiting for the cluster to join
  16. ....
  17. >>> Performing Cluster Check (using node 192.168.1.30:7000)
  18. M: 3a3b... 192.168.1.30:7000
  19.    slots:[0-5460] (5461 slots) master
  20.    1 additional replica(s)
  21. S: 8c7d... 192.168.1.33:7003
  22.    slots: (0 slots) slave
  23.    replicates 3a3b...
  24. [OK] All nodes agree about slots configuration.
  25. >>> Check for open slots...
  26. >>> Check slots coverage...
  27. [OK] All 16384 slots covered.
复制代码
步骤5:验证集群状态
  1. # 查看集群节点信息
  2. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster nodes
  3. # 预期输出示例:
  4. # 3a3b... 192.168.1.30:7000@17000 myself,master - 0 0 1 connected 0-5460
  5. # 8c7d... 192.168.1.31:7001@17001 master - 0 1620000000000 2 connected 5461-10922
  6. # e9f0... 192.168.1.32:7002@17002 master - 0 1620000000000 3 connected 10923-16383
  7. # a1b2... 192.168.1.33:7003@17003 slave 3a3b... 0 1620000000000 1 connected
  8. # c3d4... 192.168.1.34:7004@17004 slave 8c7d... 0 1620000000000 2 connected  
  9. # e5f6... 192.168.1.35:7005@17005 slave e9f0... 0 1620000000000 3 connected
  10. # 查看集群信息
  11. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster info
  12. # 测试数据分布和重定向
  13. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! set user:1001 "user_data_1"
  14. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! set user:2001 "user_data_2"
  15. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! set user:3001 "user_data_3"
  16. # 观察重定向过程,数据会自动路由到正确的节点
复制代码
步骤6:创建集群系统服务
  1. # 创建集群服务模板
  2. sudo vim /etc/systemd/system/redis-cluster@.service
复制代码
  1. [Unit]
  2. Description=Redis Cluster Node on port %i
  3. After=network.target
  4. [Service]
  5. Type=forking
  6. User=redis
  7. Group=redis
  8. ExecStart=/usr/local/bin/redis-server /etc/redis/cluster/redis-%i.conf
  9. ExecStop=/usr/local/bin/redis-cli -p %i -a ClusterRedis123! shutdown
  10. Restart=always
  11. RestartSec=3
  12. [Install]
  13. WantedBy=multi-user.target
复制代码
  1. # 启用所有节点服务
  2. sudo systemctl daemon-reload
  3. sudo systemctl enable redis-cluster@7000
  4. sudo systemctl enable redis-cluster@7001
  5. sudo systemctl enable redis-cluster@7002
  6. sudo systemctl enable redis-cluster@7003
  7. sudo systemctl enable redis-cluster@7004
  8. sudo systemctl enable redis-cluster@7005
  9. # 启动所有服务
  10. sudo systemctl start redis-cluster@7000
  11. sudo systemctl start redis-cluster@7001
  12. sudo systemctl start redis-cluster@7002
  13. sudo systemctl start redis-cluster@7003
  14. sudo systemctl start redis-cluster@7004
  15. sudo systemctl start redis-cluster@7005
  16. # 检查服务状态
  17. sudo systemctl status redis-cluster@7000
复制代码
4.3 集群管理操作

检查集群健康状态:
  1. # 检查集群状态
  2. redis-cli --cluster check 192.168.1.30:7000 -a ClusterRedis123!
  3. # 查看集群信息
  4. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster info
  5. # 查看节点信息
  6. redis-cli -c -h 192.168.1.30 -p 7000 -a ClusterRedis123! cluster nodes
复制代码
添加新节点:
  1. # 准备新节点配置文件(端口7006)
  2. # 按照步骤2创建配置并启动
  3. # 添加新主节点到集群
  4. redis-cli --cluster add-node 192.168.1.36:7006 192.168.1.30:7000 -a ClusterRedis123!
  5. # 重新分片(将部分槽位迁移到新节点)
  6. redis-cli --cluster reshard 192.168.1.30:7000 -a ClusterRedis123!
  7. # 交互过程:
  8. # How many slots do you want to move (from 1 to 16384)? 1000
  9. # What is the receiving node ID? [输入新节点的ID]
  10. # Source node #1: all
  11. # 输入yes开始迁移
复制代码
故障转移测试:
  1. # 模拟主节点故障
  2. redis-cli -h 192.168.1.30 -p 7000 -a ClusterRedis123! debug segfault
  3. # 观察从节点自动升级为主节点
  4. redis-cli -c -h 192.168.1.31 -p 7001 -a ClusterRedis123! cluster nodes
  5. # 恢复节点,观察它如何重新加入集群
  6. redis-server /etc/redis/cluster/redis-7000.conf
复制代码
第五章:架构对比与选型指南

经过详细实践,小明总结了各种方案的适用场景:
架构方案适用场景优点缺点配置复杂度主从复制读多写少、数据备份简单易用、读写分离、数据热备无法自动故障转移、写操作单点★☆☆☆☆Sentinel高可用需求、自动故障转移自动故障转移、配置相对简单、客户端透明存储受单机限制、写操作单点★★☆☆☆Cluster大数据量、高并发、线性扩展数据分片、真正的分布式、高可用配置复杂、客户端需要支持、运维复杂★★★★★选型建议:

  • 开发测试环境:主从复制
  • 数据量2GB,高并发需求:Redis Cluster
  • 读写分离场景:主从复制 + 读写分离中间件
第六章:生产环境最佳实践

6.1 配置优化要点

主从复制优化:
  1. # 在主节点配置中增加
  2. repl-backlog-size 512mb        # 增大复制积压缓冲区
  3. repl-backlog-ttl 3600          # 缓冲区存活时间
  4. min-replicas-to-write 1        # 至少1个从节点才允许写
  5. min-replicas-max-lag 10        # 从节点延迟不超过10秒
复制代码
Sentinel优化:
  1. # 在Sentinel配置中增加
  2. sentinel parallel-syncs mymaster 1    # 控制并行同步数量
  3. sentinel failover-timeout mymaster 60000  # 调整故障转移超时
  4. sentinel down-after-milliseconds mymaster 5000  # 更敏感的下线检测
复制代码
Cluster优化:
  1. # 在集群节点配置中增加
  2. cluster-node-timeout 15000             # 节点超时时间
  3. cluster-slave-validity-factor 10       # 从节点有效性
  4. cluster-migration-barrier 1            # 迁移屏障
  5. cluster-require-full-coverage no       # 允许部分槽位不可用
复制代码
6.2 监控与告警

关键监控指标:
<ul>内存使用率(

相关推荐

您需要登录后才可以回帖 登录 | 立即注册