深入剖析 Redis 的三種集群方式以及實(shí)戰(zhàn)配置
Redis作為高性能內(nèi)存數(shù)據(jù)庫,其集群化部署是解決單節(jié)點(diǎn)性能瓶頸與實(shí)現(xiàn)高可用的關(guān)鍵。本篇將深入剖析三種主流的集群方式:主從復(fù)制、哨兵模式(Sentinel)與官方集群(Cluster),并為您提供詳細(xì)的搭建指南與配置示例。
一、主從復(fù)制 (Master-Slave Replication)
主從復(fù)制是最基礎(chǔ)的集群模式,通過一個(gè)主節(jié)點(diǎn)(Master)和一個(gè)或多個(gè)從節(jié)點(diǎn)(Slave)實(shí)現(xiàn)讀寫分離。主節(jié)點(diǎn)負(fù)責(zé)處理寫操作,從節(jié)點(diǎn)負(fù)責(zé)處理讀操作,并實(shí)時(shí)從主節(jié)點(diǎn)同步數(shù)據(jù)。
1. 核心原理
- 數(shù)據(jù)同步 :從節(jié)點(diǎn)啟動(dòng)后,向主節(jié)點(diǎn)發(fā)送 `SYNC` 命令。主節(jié)點(diǎn)執(zhí)行 `bgsave` 生成RDB快照并發(fā)送給從節(jié)點(diǎn),同時(shí)將快照期間的寫命令記錄到復(fù)制積壓緩沖區(qū)。從節(jié)點(diǎn)加載RDB并執(zhí)行緩沖區(qū)中的命令,完成初始化同步。
- 增量同步 :初始化后,主節(jié)點(diǎn)每次執(zhí)行的寫命令都會(huì)同步發(fā)送給從節(jié)點(diǎn),實(shí)現(xiàn)增量同步。
2. 搭建步驟與配置
以下以單機(jī)偽集群為例,在一臺(tái)服務(wù)器上啟動(dòng)3個(gè)Redis實(shí)例(1個(gè)主節(jié)點(diǎn),2個(gè)從節(jié)點(diǎn))。
主節(jié)點(diǎn)配置 (redis-master.conf):
# 端口 port 6379 # 后臺(tái)運(yùn)行 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é)點(diǎn)1配置 (redis-slave1.conf):
# 端口 port 6380 # 后臺(tái)運(yùn)行 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é)點(diǎn) replicaof 127.0.0.1 6379 # 主節(jié)點(diǎn)密碼(如果設(shè)置了) masterauth 123456
從節(jié)點(diǎn)2配置 (redis-slave2.conf):
# 端口 port 6381 # 后臺(tái)運(yùn)行 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é)點(diǎn) replicaof 127.0.0.1 6379 # 主節(jié)點(diǎn)密碼(如果設(shè)置了) masterauth 123456
3. 啟動(dòng)服務(wù)
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. 驗(yàn)證主從關(guān)系
# 連接主節(jié)點(diǎn) redis-cli -p 6379 127.0.0.1:6379> info replication # 連接從節(jié)點(diǎn) redis-cli -p 6380 127.0.0.1:6380> info replication
5. 全量復(fù)制與增量復(fù)制對(duì)比

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

1. 核心原理
- 監(jiān)控 :哨兵進(jìn)程持續(xù)監(jiān)控主節(jié)點(diǎn)和從節(jié)點(diǎn)的健康狀態(tài)。
- 通知 :當(dāng)某個(gè)節(jié)點(diǎn)(主或從)出現(xiàn)故障時(shí),哨兵會(huì)向系統(tǒng)管理員發(fā)送通知。
- 故障轉(zhuǎn)移 :當(dāng)主節(jié)點(diǎn)故障時(shí),哨兵會(huì)選舉一個(gè)從節(jié)點(diǎn)成為新的主節(jié)點(diǎn),并讓其他從節(jié)點(diǎn)指向新的主節(jié)點(diǎn)。
2. 搭建步驟與配置
同樣以單機(jī)偽集群為例,部署1個(gè)主節(jié)點(diǎn)、2個(gè)從節(jié)點(diǎn)和3個(gè)哨兵節(jié)點(diǎn)。
主節(jié)點(diǎn)配置 (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" # 設(shè)置密碼(可選) requirepass 123456
從節(jié)點(diǎn)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é)點(diǎn) replicaof 127.0.0.1 6379 # 如果主節(jié)點(diǎn)有密碼 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é)點(diǎn) sentinel monitor mymaster 127.0.0.1 6379 2 # 密碼(如果主節(jié)點(diǎn)有) sentinel auth-pass mymaster 123456 # 故障轉(zhuǎn)移超時(shí)時(shí)間 sentinel down-after-milliseconds mymaster 5000 # 故障轉(zhuǎn)移后最多保留的失敗次數(shù) sentinel failover-timeout mymaster 10000 # 故障轉(zhuǎn)移時(shí)最多同時(shí)遷移的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. 啟動(dòng)服務(wù)
# 啟動(dòng)Redis節(jié)點(diǎn)
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
# 啟動(dòng)哨兵
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. 測(cè)試故障轉(zhuǎn)移
# 連接哨兵查看主節(jié)點(diǎn) redis-cli -p 26379 127.0.0.1:26379> sentinel master mymaster # 關(guān)閉主節(jié)點(diǎn) redis-cli -p 6379 shutdown # 等待哨兵選舉后,再次查看 127.0.0.1:26379> sentinel master mymaster
三、官方集群 (Redis Cluster)
Redis Cluster是官方提供的分布式解決方案,通過數(shù)據(jù)分片(Sharding)解決單節(jié)點(diǎn)內(nèi)存限制問題,并內(nèi)置高可用能力。它不需要中間件,節(jié)點(diǎn)間直接通信。
1. 核心原理
- 數(shù)據(jù)分片 :Redis Cluster將16384個(gè)哈希槽(Hash Slot)分布在多個(gè)主節(jié)點(diǎn)上。
- 哈希槽分配 :每個(gè)鍵通過CRC16算法計(jì)算后對(duì)16384取模,決定其所在的哈希槽。
- 高可用 :每個(gè)主節(jié)點(diǎn)都綁定一個(gè)或多個(gè)從節(jié)點(diǎn)。當(dāng)主節(jié)點(diǎn)故障時(shí),從節(jié)點(diǎn)會(huì)升級(jí)為新的主節(jié)點(diǎn)。
2. 搭建步驟與配置
以單機(jī)偽集群為例,部署3個(gè)主節(jié)點(diǎn)和3個(gè)從節(jié)點(diǎn)。
主節(jié)點(diǎn)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 # 關(guān)閉集群完整性檢查(單機(jī)測(cè)試) cluster-require-full-coverage no
從節(jié)點(diǎn)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é)點(diǎn) replicaof 127.0.0.1 7000
依次創(chuàng)建 `redis-7001.conf`, `redis-7002.conf`, `redis-7004.conf`, `redis-7005.conf`, `redis-7006.conf`,并修改端口號(hào)。
3. 啟動(dòng)服務(wù)
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)建集群
# 進(jìn)入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í)行命令后,會(huì)提示輸入 `yes` 來確認(rèn)分配哈希槽和創(chuàng)建集群。
5. 連接集群
# 使用 -c 參數(shù)連接集群 redis-cli -c -p 7000 # 設(shè)置key 127.0.0.1:7000> set name "redis-cluster" # 讀取key(可能重定向到其他節(jié)點(diǎn)) 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>
四、總結(jié)與對(duì)比
| 特性 | 主從復(fù)制 | 哨兵模式 | 官方集群 |
|---|---|---|---|
| 讀寫分離 | ? | ? | ? |
| 數(shù)據(jù)分片 | ? | ? | ? |
| 高可用 | ? | ? (自動(dòng)故障轉(zhuǎn)移) | ? (內(nèi)置) |
| 部署復(fù)雜度 | 低 | 中 | 高 |
| 適用場(chǎng)景 | 讀多寫少、簡(jiǎn)單擴(kuò)展 | 需要高可用、讀寫分離 | 大數(shù)據(jù)量、高并發(fā) |
到此這篇關(guān)于深入剖析 Redis 的三種集群方式以及實(shí)戰(zhàn)配置的文章就介紹到這了,更多相關(guān)Redis 三種集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redisson分布式限流的實(shí)現(xiàn)原理分析
這篇文章主要介紹了Redisson分布式限流的實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
redis哈希和集合_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
redis-cli創(chuàng)建redis集群的實(shí)現(xiàn)
Redis鎖的過期時(shí)間小于業(yè)務(wù)的執(zhí)行時(shí)間如何續(xù)期

