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