深入剖析 Redis 的三種集群方式以及實戰(zhàn)配置
Redis作為高性能內(nèi)存數(shù)據(jù)庫,其集群化部署是解決單節(jié)點性能瓶頸與實現(xiàn)高可用的關鍵。本篇將深入剖析三種主流的集群方式:主從復制、哨兵模式(Sentinel)與官方集群(Cluster),并為您提供詳細的搭建指南與配置示例。
一、主從復制 (Master-Slave Replication)
主從復制是最基礎的集群模式,通過一個主節(jié)點(Master)和一個或多個從節(jié)點(Slave)實現(xiàn)讀寫分離。主節(jié)點負責處理寫操作,從節(jié)點負責處理讀操作,并實時從主節(jié)點同步數(shù)據(jù)。
1. 核心原理
- 數(shù)據(jù)同步 :從節(jié)點啟動后,向主節(jié)點發(fā)送 `SYNC` 命令。主節(jié)點執(zhí)行 `bgsave` 生成RDB快照并發(fā)送給從節(jié)點,同時將快照期間的寫命令記錄到復制積壓緩沖區(qū)。從節(jié)點加載RDB并執(zhí)行緩沖區(qū)中的命令,完成初始化同步。
- 增量同步 :初始化后,主節(jié)點每次執(zhí)行的寫命令都會同步發(fā)送給從節(jié)點,實現(xiàn)增量同步。
2. 搭建步驟與配置
以下以單機偽集群為例,在一臺服務器上啟動3個Redis實例(1個主節(jié)點,2個從節(jié)點)。
主節(jié)點配置 (redis-master.conf):
# 端口 port 6379 # 后臺運行 daemonize yes # PID文件 pidfile /var/run/redis_6379.pid # 日志文件 logfile "/usr/local/redis-cluster/logs/redis_6379.log" # 工作目錄 dir /usr/local/redis-cluster/data # 持久化 dbfilename dump-6379.rdb # 開啟AOF appendonly yes appendfilename "appendonly-6379.aof"
從節(jié)點1配置 (redis-slave1.conf):
# 端口 port 6380 # 后臺運行 daemonize yes # PID文件 pidfile /var/run/redis_6380.pid # 日志文件 logfile "/usr/local/redis-cluster/logs/redis_6380.log" # 工作目錄 dir /usr/local/redis-cluster/data # 持久化 dbfilename dump-6380.rdb # 開啟AOF appendonly yes appendfilename "appendonly-6380.aof" # 指定主節(jié)點 replicaof 127.0.0.1 6379 # 主節(jié)點密碼(如果設置了) masterauth 123456
從節(jié)點2配置 (redis-slave2.conf):
# 端口 port 6381 # 后臺運行 daemonize yes # PID文件 pidfile /var/run/redis_6381.pid # 日志文件 logfile "/usr/local/redis-cluster/logs/redis_6381.log" # 工作目錄 dir /usr/local/redis-cluster/data # 持久化 dbfilename dump-6381.rdb # 開啟AOF appendonly yes appendfilename "appendonly-6381.aof" # 指定主節(jié)點 replicaof 127.0.0.1 6379 # 主節(jié)點密碼(如果設置了) masterauth 123456
3. 啟動服務
redis-server /usr/local/redis-cluster/conf/redis-master.conf redis-server /usr/local/redis-cluster/conf/redis-slave1.conf redis-server /usr/local/redis-cluster/conf/redis-slave2.conf
4. 驗證主從關系
# 連接主節(jié)點 redis-cli -p 6379 127.0.0.1:6379> info replication # 連接從節(jié)點 redis-cli -p 6380 127.0.0.1:6380> info replication
5. 全量復制與增量復制對比

二、哨兵模式 (Sentinel)
哨兵模式在主從復制的基礎上增加了高可用(HA)能力。通過多個哨兵進程監(jiān)控主從節(jié)點,當主節(jié)點故障時,哨兵會自動選舉一個從節(jié)點升級為新的主節(jié)點,并通知其他從節(jié)點切換主節(jié)點,實現(xiàn)故障轉移。

1. 核心原理
- 監(jiān)控 :哨兵進程持續(xù)監(jiān)控主節(jié)點和從節(jié)點的健康狀態(tài)。
- 通知 :當某個節(jié)點(主或從)出現(xiàn)故障時,哨兵會向系統(tǒng)管理員發(fā)送通知。
- 故障轉移 :當主節(jié)點故障時,哨兵會選舉一個從節(jié)點成為新的主節(jié)點,并讓其他從節(jié)點指向新的主節(jié)點。
2. 搭建步驟與配置
同樣以單機偽集群為例,部署1個主節(jié)點、2個從節(jié)點和3個哨兵節(jié)點。
主節(jié)點配置 (redis-master.conf):
port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/usr/local/redis-cluster/logs/redis_6379.log" dir /usr/local/redis-cluster/data dbfilename dump-6379.rdb appendonly yes appendfilename "appendonly-6379.aof" # 設置密碼(可選) requirepass 123456
從節(jié)點1配置 (redis-slave1.conf):
port 6380 daemonize yes pidfile /var/run/redis_6380.pid logfile "/usr/local/redis-cluster/logs/redis_6380.log" dir /usr/local/redis-cluster/data dbfilename dump-6380.rdb appendonly yes appendfilename "appendonly-6380.aof" # 指向主節(jié)點 replicaof 127.0.0.1 6379 # 如果主節(jié)點有密碼 masterauth 123456
哨兵1配置 (sentinel1.conf):
port 26379 daemonize yes pidfile /var/run/redis-sentinel_26379.pid logfile "/usr/local/redis-cluster/logs/sentinel_26379.log" dir /usr/local/redis-cluster/data # 監(jiān)控主節(jié)點 sentinel monitor mymaster 127.0.0.1 6379 2 # 密碼(如果主節(jié)點有) sentinel auth-pass mymaster 123456 # 故障轉移超時時間 sentinel down-after-milliseconds mymaster 5000 # 故障轉移后最多保留的失敗次數(shù) sentinel failover-timeout mymaster 10000 # 故障轉移時最多同時遷移的key數(shù)量 sentinel parallel-syncs mymaster 1
哨兵2配置 (sentinel2.conf):
port 26380 daemonize yes pidfile /var/run/redis-sentinel_26380.pid logfile "/usr/local/redis-cluster/logs/sentinel_26380.log" dir /usr/local/redis-cluster/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel auth-pass mymaster 123456 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1
哨兵3配置 (sentinel3.conf):
port 26381 daemonize yes pidfile /var/run/redis-sentinel_26381.pid logfile "/usr/local/redis-cluster/logs/sentinel_26381.log" dir /usr/local/redis-cluster/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel auth-pass mymaster 123456 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1
3. 啟動服務
# 啟動Redis節(jié)點
redis-server /usr/local/redis-cluster/conf/redis-master.conf
redis-server /usr/local/redis-cluster/conf/redis-slave1.conf
redis-server /usr/local/redis-cluster/conf/redis-slave2.conf
# 啟動哨兵
redis-sentinel /usr/local/redis-cluster/conf/sentinel1.conf
redis-sentinel /usr/local/redis-cluster/conf/sentinel2.conf
redis-sentinel /usr/local/redis-cluster/conf/sentinel3.conf
4. 測試故障轉移
# 連接哨兵查看主節(jié)點 redis-cli -p 26379 127.0.0.1:26379> sentinel master mymaster # 關閉主節(jié)點 redis-cli -p 6379 shutdown # 等待哨兵選舉后,再次查看 127.0.0.1:26379> sentinel master mymaster
三、官方集群 (Redis Cluster)
Redis Cluster是官方提供的分布式解決方案,通過數(shù)據(jù)分片(Sharding)解決單節(jié)點內(nèi)存限制問題,并內(nèi)置高可用能力。它不需要中間件,節(jié)點間直接通信。
1. 核心原理
- 數(shù)據(jù)分片 :Redis Cluster將16384個哈希槽(Hash Slot)分布在多個主節(jié)點上。
- 哈希槽分配 :每個鍵通過CRC16算法計算后對16384取模,決定其所在的哈希槽。
- 高可用 :每個主節(jié)點都綁定一個或多個從節(jié)點。當主節(jié)點故障時,從節(jié)點會升級為新的主節(jié)點。
2. 搭建步驟與配置
以單機偽集群為例,部署3個主節(jié)點和3個從節(jié)點。
主節(jié)點1配置 (redis-7000.conf):
port 7000 daemonize yes pidfile /var/run/redis_7000.pid logfile "/usr/local/redis-cluster/logs/redis_7000.log" dir /usr/local/redis-cluster/data dbfilename dump-7000.rdb appendonly yes appendfilename "appendonly-7000.aof" # 開啟集群模式 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 # 關閉集群完整性檢查(單機測試) cluster-require-full-coverage no
從節(jié)點1配置 (redis-7003.conf):
port 7003 daemonize yes pidfile /var/run/redis_7003.pid logfile "/usr/local/redis-cluster/logs/redis_7003.log" dir /usr/local/redis-cluster/data dbfilename dump-7003.rdb appendonly yes appendfilename "appendonly-7003.aof" # 開啟集群模式 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 # 指定主節(jié)點 replicaof 127.0.0.1 7000
依次創(chuàng)建 `redis-7001.conf`, `redis-7002.conf`, `redis-7004.conf`, `redis-7005.conf`, `redis-7006.conf`,并修改端口號。
3. 啟動服務
redis-server /usr/local/redis-cluster/conf/redis-7000.conf redis-server /usr/local/redis-cluster/conf/redis-7001.conf redis-server /usr/local/redis-cluster/conf/redis-7002.conf redis-server /usr/local/redis-cluster/conf/redis-7003.conf redis-server /usr/local/redis-cluster/conf/redis-7004.conf redis-server /usr/local/redis-cluster/conf/redis-7005.conf redis-server /usr/local/redis-cluster/conf/redis-7006.conf
4. 創(chuàng)建集群
# 進入Redis源碼目錄 cd /path/to/redis-5.0.5/src # 使用官方工具創(chuàng)建集群 ./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
執(zhí)行命令后,會提示輸入 `yes` 來確認分配哈希槽和創(chuàng)建集群。
5. 連接集群
# 使用 -c 參數(shù)連接集群 redis-cli -c -p 7000 # 設置key 127.0.0.1:7000> set name "redis-cluster" # 讀取key(可能重定向到其他節(jié)點) 127.0.0.1:7000> get name -> Redirected to slot [12182] located at 127.0.0.1:7002 "redis-cluster" 127.0.0.1:7002>
四、總結與對比
| 特性 | 主從復制 | 哨兵模式 | 官方集群 |
|---|---|---|---|
| 讀寫分離 | ? | ? | ? |
| 數(shù)據(jù)分片 | ? | ? | ? |
| 高可用 | ? | ? (自動故障轉移) | ? (內(nèi)置) |
| 部署復雜度 | 低 | 中 | 高 |
| 適用場景 | 讀多寫少、簡單擴展 | 需要高可用、讀寫分離 | 大數(shù)據(jù)量、高并發(fā) |
到此這篇關于深入剖析 Redis 的三種集群方式以及實戰(zhàn)配置的文章就介紹到這了,更多相關Redis 三種集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
redis-cli創(chuàng)建redis集群的實現(xiàn)
Redis鎖的過期時間小于業(yè)務的執(zhí)行時間如何續(xù)期

