Redis高可用-主從復(fù)制、哨兵模式與集群模式詳解
Redis高可用-主從復(fù)制、哨兵模式與集群模式
概要
Redis作為一款內(nèi)存數(shù)據(jù)庫(kù),憑借其極高的性能和豐富的功能,已經(jīng)成為了很多互聯(lián)網(wǎng)應(yīng)用的核心組件。然而,單機(jī)Redis雖然性能卓越,但存在著單點(diǎn)故障、擴(kuò)展性差等問題,限制了它在高可用性和高擴(kuò)展性方面的應(yīng)用。
為了提升Redis的可用性和擴(kuò)展性,Redis提供了多種架構(gòu)模式:主從復(fù)制、哨兵模式和集群模式。每種模式都在不同的場(chǎng)景中發(fā)揮著重要作用。
一、主從復(fù)制(Master-Slave Replication)
1、概述
Redis的主從復(fù)制(Master-Slave Replication)是最基礎(chǔ)的高可用架構(gòu)之一。
在這種架構(gòu)中,Redis部署了一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)。
主節(jié)點(diǎn)負(fù)責(zé)處理所有的寫操作(如SET、DEL等),而從節(jié)點(diǎn)則通過同步主節(jié)點(diǎn)的數(shù)據(jù)來進(jìn)行數(shù)據(jù)備份和提供讀操作服務(wù)。
2、工作原理
- 主節(jié)點(diǎn)(Master)是數(shù)據(jù)的來源節(jié)點(diǎn),所有寫操作都首先執(zhí)行在主節(jié)點(diǎn)上。
- 從節(jié)點(diǎn)(Slave)通過復(fù)制主節(jié)點(diǎn)的數(shù)據(jù)來保證數(shù)據(jù)一致性。從節(jié)點(diǎn)定期從主節(jié)點(diǎn)獲取數(shù)據(jù)的快照(RDB)或增量數(shù)據(jù)(AOF)進(jìn)行同步。
- 同步方式 從節(jié)點(diǎn)與主節(jié)點(diǎn)之間的同步分為全量同步和增量同步。在第一次連接時(shí),執(zhí)行全量同步,將主節(jié)點(diǎn)的數(shù)據(jù)完整復(fù)制到從節(jié)點(diǎn);后續(xù)的增量同步則只同步主節(jié)點(diǎn)上的變更數(shù)據(jù)。
3、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 讀寫分離:主從復(fù)制可以將讀請(qǐng)求分配到從節(jié)點(diǎn),從而減輕主節(jié)點(diǎn)的壓力,提高系統(tǒng)的并發(fā)能力。
- 數(shù)據(jù)冗余:從節(jié)點(diǎn)提供了數(shù)據(jù)的備份,增強(qiáng)了系統(tǒng)的容錯(cuò)性。
缺點(diǎn):
- 單點(diǎn)故障:主節(jié)點(diǎn)故障后,系統(tǒng)會(huì)面臨數(shù)據(jù)不可用的情況。雖然從節(jié)點(diǎn)可以恢復(fù)數(shù)據(jù),但需要手動(dòng)將從節(jié)點(diǎn)提升為主節(jié)點(diǎn)。
- 同步延遲:主從同步可能存在延遲,尤其是在寫操作頻繁時(shí),從節(jié)點(diǎn)的數(shù)據(jù)同步可能會(huì)滯后,導(dǎo)致讀請(qǐng)求不一致。
4、適用場(chǎng)景
主從復(fù)制適用于讀操作遠(yuǎn)大于寫操作的場(chǎng)景,比如緩存系統(tǒng)、日志系統(tǒng)等。
在這些場(chǎng)景下,可以將從節(jié)點(diǎn)作為讀副本,減少主節(jié)點(diǎn)的壓力,提高讀取性能。
5、配置步驟
5.1 配置主節(jié)點(diǎn)
在Redis中,主節(jié)點(diǎn)默認(rèn)配置就可以作為主節(jié)點(diǎn)工作,因此啟動(dòng)主節(jié)點(diǎn)非常簡(jiǎn)單。
# 啟動(dòng)主節(jié)點(diǎn) redis-server /etc/redis/redis.conf
5.2 配置從節(jié)點(diǎn)
從節(jié)點(diǎn)的配置稍微復(fù)雜一些,主要是需要告訴Redis自己是一個(gè)從節(jié)點(diǎn),并指定要復(fù)制的主節(jié)點(diǎn)信息。
在從節(jié)點(diǎn)的redis.conf配置文件中添加以下內(nèi)容:
# 配置從節(jié)點(diǎn),指定主節(jié)點(diǎn) slaveof 192.168.1.1 6379
這里的192.168.1.1是主節(jié)點(diǎn)的IP地址,6379是主節(jié)點(diǎn)的端口。通過這行配置,從節(jié)點(diǎn)會(huì)自動(dòng)與主節(jié)點(diǎn)建立連接,開始同步數(shù)據(jù)。
配置好從節(jié)點(diǎn)后,啟動(dòng)從節(jié)點(diǎn):
# 啟動(dòng)從節(jié)點(diǎn) redis-server /etc/redis/redis.conf
5.3 驗(yàn)證主從復(fù)制
在主節(jié)點(diǎn)上執(zhí)行INFO replication命令查看復(fù)制狀態(tài):
127.0.0.1:6379> INFO replication # 輸出: # role:master # connected_slaves:1 # slave0:ip=192.168.1.2,port=6379,state=online,offset=12345,lag=0
在從節(jié)點(diǎn)上執(zhí)行相同的命令,查看從節(jié)點(diǎn)的狀態(tài):
127.0.0.1:6380> INFO replication # 輸出: # role:slave # master_host:192.168.1.1 # master_port:6379 # master_link_status:up
二、哨兵模式(Sentinel)
1、概述
為了彌補(bǔ)主從復(fù)制的單點(diǎn)故障問題,Redis引入了哨兵模式。Redis哨兵是一個(gè)高可用解決方案,通過自動(dòng)故障轉(zhuǎn)移和主從監(jiān)控來保證Redis集群的高可用性。
在哨兵模式下,除了主節(jié)點(diǎn)和從節(jié)點(diǎn)外,還需要部署多個(gè)哨兵節(jié)點(diǎn)(Sentinel)。哨兵節(jié)點(diǎn)的主要職責(zé)包括:
- 監(jiān)控主節(jié)點(diǎn)和從節(jié)點(diǎn)的健康狀態(tài)。
- 當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),自動(dòng)進(jìn)行故障轉(zhuǎn)移,將某個(gè)從節(jié)點(diǎn)提升為主節(jié)點(diǎn)。
- 在故障恢復(fù)后,更新主從關(guān)系,重新配置從節(jié)點(diǎn)。
- 提供服務(wù)發(fā)現(xiàn)功能,客戶端可以通過哨兵獲取到當(dāng)前的主節(jié)點(diǎn)信息。
2、工作原理
- 監(jiān)控:哨兵節(jié)點(diǎn)周期性地向主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送PING請(qǐng)求,監(jiān)測(cè)節(jié)點(diǎn)的健康狀態(tài)。
- 故障轉(zhuǎn)移:當(dāng)多個(gè)哨兵節(jié)點(diǎn)確認(rèn)主節(jié)點(diǎn)不可用時(shí),哨兵將自動(dòng)選舉一個(gè)從節(jié)點(diǎn)并將其提升為新的主節(jié)點(diǎn)。之后,新的主節(jié)點(diǎn)會(huì)開始接收寫操作,其他從節(jié)點(diǎn)會(huì)開始同步新的主節(jié)點(diǎn)數(shù)據(jù)。
- 配置更新:哨兵節(jié)點(diǎn)會(huì)向所有從節(jié)點(diǎn)廣播新的主節(jié)點(diǎn)信息,從節(jié)點(diǎn)會(huì)自動(dòng)向新的主節(jié)點(diǎn)同步數(shù)據(jù)。
3、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 自動(dòng)故障轉(zhuǎn)移:當(dāng)主節(jié)點(diǎn)發(fā)生故障時(shí),哨兵會(huì)自動(dòng)檢測(cè)并將一個(gè)從節(jié)點(diǎn)提升為主節(jié)點(diǎn),無需人工干預(yù),保證了系統(tǒng)的高可用性。
- 高可用性:多個(gè)哨兵節(jié)點(diǎn)提供了高可靠性,避免了單個(gè)哨兵故障導(dǎo)致的影響。
- 服務(wù)發(fā)現(xiàn):哨兵能夠動(dòng)態(tài)地向客戶端提供當(dāng)前的主節(jié)點(diǎn)信息,確??蛻舳丝偸窃L問到最新的主節(jié)點(diǎn)。
缺點(diǎn):
- 復(fù)雜性高:哨兵模式相比單純的主從復(fù)制更加復(fù)雜,配置和運(yùn)維難度較大。
- 故障恢復(fù)時(shí)間較長(zhǎng):雖然哨兵能夠自動(dòng)故障轉(zhuǎn)移,但在發(fā)生故障時(shí),故障轉(zhuǎn)移的過程仍然會(huì)有一定的延遲,導(dǎo)致短時(shí)間內(nèi)系統(tǒng)不可用。
4、適用場(chǎng)景
哨兵模式適用于對(duì)高可用性有較高要求的場(chǎng)景,比如實(shí)時(shí)業(yè)務(wù)系統(tǒng)、在線服務(wù)等。
它能保證Redis集群在主節(jié)點(diǎn)故障時(shí)依然能夠提供穩(wěn)定的服務(wù)。
5、配置步驟
5.1 配置哨兵文件
哨兵的配置通常在sentinel.conf文件中進(jìn)行。在文件中需要指定要監(jiān)控的主節(jié)點(diǎn),設(shè)置監(jiān)控參數(shù)等。
以下是一個(gè)簡(jiǎn)單的sentinel.conf配置文件示例:
# sentinel.conf port 26379 sentinel monitor mymaster 192.168.1.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1
- sentinel monitor mymaster <master_ip> <master_port> :監(jiān)控名為mymaster的主節(jié)點(diǎn),IP為192.168.1.1,端口為6379,需要至少2個(gè)哨兵確認(rèn)主節(jié)點(diǎn)故障。
- sentinel down-after-milliseconds mymaster 5000:主節(jié)點(diǎn)在5000毫秒內(nèi)未響應(yīng)時(shí)判定為故障。
- sentinel failover-timeout mymaster 60000:故障轉(zhuǎn)移的超時(shí)時(shí)間為60秒。
啟動(dòng)哨兵
啟動(dòng)哨兵時(shí),執(zhí)行以下命令:
redis-sentinel /etc/redis/sentinel.conf
5.2 驗(yàn)證哨兵模式
可以通過以下命令查看哨兵的狀態(tài):
127.0.0.1:26379> INFO sentinel # 輸出: # sentinel_masters # name=mymaster # ip=192.168.1.1 # port=6379 # quorum=2 # status=ok
三、集群模式(Cluster)
1、概述
對(duì)于需要大規(guī)模分布式部署和水平擴(kuò)展的應(yīng)用,Redis提供了集群模式(Redis Cluster)。與主從復(fù)制和哨兵模式不同,Redis集群采用了分片的方式將數(shù)據(jù)分布到多個(gè)節(jié)點(diǎn)上,從而支持更高的數(shù)據(jù)存儲(chǔ)能力和更強(qiáng)的擴(kuò)展性。
Redis集群中,數(shù)據(jù)會(huì)按照**哈希槽(hash slots)**的方式進(jìn)行分配。Redis集群總共有16384個(gè)哈希槽,集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分哈希槽。數(shù)據(jù)的分配和管理是自動(dòng)完成的,客戶端可以直接連接到集群中的任何節(jié)點(diǎn),集群會(huì)根據(jù)請(qǐng)求的數(shù)據(jù)哈希值將請(qǐng)求路由到正確的節(jié)點(diǎn)。
2、工作原理
- 分片:Redis Cluster將所有的鍵值對(duì)按哈希算法分成16384個(gè)哈希槽,并將這些哈希槽分配到多個(gè)節(jié)點(diǎn)上。每個(gè)節(jié)點(diǎn)存儲(chǔ)一部分?jǐn)?shù)據(jù),并負(fù)責(zé)該哈希槽范圍內(nèi)的鍵。
- 數(shù)據(jù)復(fù)制:每個(gè)主節(jié)點(diǎn)都有一個(gè)或多個(gè)從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)備份,從節(jié)點(diǎn)可以在主節(jié)點(diǎn)故障時(shí)接管。
- 故障轉(zhuǎn)移:當(dāng)主節(jié)點(diǎn)故障時(shí),集群會(huì)自動(dòng)將該主節(jié)點(diǎn)的從節(jié)點(diǎn)提升為新的主節(jié)點(diǎn),確保數(shù)據(jù)的可用性。
3、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 高擴(kuò)展性:集群模式支持水平擴(kuò)展,可以根據(jù)需要?jiǎng)討B(tài)增加或減少節(jié)點(diǎn),輕松處理海量數(shù)據(jù)。
- 自動(dòng)故障轉(zhuǎn)移:Redis集群提供了自動(dòng)故障轉(zhuǎn)移機(jī)制,保證節(jié)點(diǎn)宕機(jī)時(shí)系統(tǒng)能夠自動(dòng)恢復(fù)。
- 分布式存儲(chǔ):數(shù)據(jù)被分片存儲(chǔ)在不同的節(jié)點(diǎn)上,可以支持超大規(guī)模的數(shù)據(jù)存儲(chǔ)。
缺點(diǎn):
- 復(fù)雜性高:與主從復(fù)制和哨兵模式相比,Redis集群的配置和運(yùn)維復(fù)雜度更高,要求對(duì)分片、數(shù)據(jù)遷移、集群管理等有較深入的理解。
- 跨節(jié)點(diǎn)操作性能差:如果客戶端的操作涉及多個(gè)哈希槽,Redis集群需要跨節(jié)點(diǎn)進(jìn)行通信,性能會(huì)有所下降。
4、適用場(chǎng)景
集群模式適用于需要大規(guī)模數(shù)據(jù)存儲(chǔ)和高并發(fā)的場(chǎng)景,如社交媒體、電子商務(wù)、廣告投放等場(chǎng)景。
對(duì)于需要支持?jǐn)?shù)十億鍵的數(shù)據(jù)存儲(chǔ)和快速讀寫操作,Redis集群是最合適的架構(gòu)模式。
5、配置步驟
5.1 配置集群節(jié)點(diǎn)
在集群模式下,每個(gè)Redis節(jié)點(diǎn)的配置文件中需要啟用集群相關(guān)的參數(shù):
# redis.conf cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000
- cluster-enabled yes:?jiǎn)⒂眉耗J健?/li>
- cluster-config-file nodes.conf:指定集群配置文件,保存集群的節(jié)點(diǎn)信息。
- cluster-node-timeout 5000:設(shè)置節(jié)點(diǎn)超時(shí)時(shí)間。
5.2 啟動(dòng)集群節(jié)點(diǎn)
啟動(dòng)多個(gè)Redis實(shí)例,每個(gè)實(shí)例都要使用上述配置文件。假設(shè)我們有6個(gè)節(jié)點(diǎn)(3個(gè)主節(jié)點(diǎn),3個(gè)從節(jié)點(diǎn)):
# 啟動(dòng)每個(gè)節(jié)點(diǎn) redis-server /etc/redis/redis.conf
5.3 創(chuàng)建集群
使用redis-cli工具來創(chuàng)建集群,并為每個(gè)主節(jié)點(diǎn)分配從節(jié)點(diǎn):
# 創(chuàng)建集群 redis-cli --cluster create <node1>:6379 <node2>:6379 <node3>:6379 <node4>:6379 <node5>:6379 <node6>:6379 --cluster-replicas 1
這條命令會(huì)創(chuàng)建一個(gè)包含3個(gè)主節(jié)點(diǎn)和3個(gè)從節(jié)點(diǎn)的集群。
5.4 驗(yàn)證集群狀態(tài)
通過以下命令來驗(yàn)證集群狀態(tài):
redis-cli -c -h <node_ip> -p 6379 cluster info
總結(jié)
在Redis的高可用架構(gòu)中,主從復(fù)制、哨兵模式和集群模式各自有不同的適用場(chǎng)景和優(yōu)勢(shì)。選擇合適的架構(gòu)模式,需要根據(jù)業(yè)務(wù)的需求、系統(tǒng)規(guī)模、數(shù)據(jù)量和故障恢復(fù)時(shí)間的要求來決定。
- 主從復(fù)制 適用于讀操作較多,寫操作較少的場(chǎng)景,能夠有效實(shí)現(xiàn)讀寫分離,提高系統(tǒng)性能。
- 哨兵模式 通過自動(dòng)故障轉(zhuǎn)移和監(jiān)控,保障了Redis系統(tǒng)的高可用性,適用于高可用性要求較高的業(yè)務(wù)場(chǎng)景。
- 集群模式 提供了水平擴(kuò)展的能力,適用于大規(guī)模數(shù)據(jù)存儲(chǔ)和高并發(fā)請(qǐng)求的場(chǎng)景。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Redis實(shí)現(xiàn)延時(shí)任務(wù)的解決方案
這篇文章主要介紹了使用Redis實(shí)現(xiàn)延時(shí)任務(wù)的解決方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08k8s部署redis遠(yuǎn)程連接的項(xiàng)目實(shí)踐
本文主要介紹了k8s部署redis遠(yuǎn)程連接的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10基于Redis實(shí)現(xiàn)抽獎(jiǎng)功能及問題小結(jié)
這篇文章主要介紹了基于Redis實(shí)現(xiàn)抽獎(jiǎng)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)的配置步驟
這篇文章主要介紹了Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)詳細(xì)教程,配置步驟需要先下載redistimeseries.so 文件,文中介紹了啟動(dòng)失敗問題排查,需要的朋友可以參考下2024-01-01基于Redis?zSet實(shí)現(xiàn)滑動(dòng)窗口對(duì)短信進(jìn)行防刷限流的問題
這篇文章主要介紹了基于Redis?zSet實(shí)現(xiàn)滑動(dòng)窗口對(duì)短信進(jìn)行防刷限流,主要針對(duì)目前線上短信被腳本惡意盜刷的情況,用Redis實(shí)現(xiàn)滑動(dòng)窗口限流,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-02-02通過prometheus監(jiān)控redis實(shí)時(shí)運(yùn)行狀態(tài)的操作方法
本文詳細(xì)介紹了如何通過Prometheus監(jiān)控Redis的運(yùn)行狀態(tài),包括安裝配置Redis、Redis Exporter以及Prometheus,配置Prometheus監(jiān)控Redis指標(biāo),以及常見的Redis指標(biāo)和告警規(guī)則,需要的朋友可以參考下2025-02-02Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析
這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07