『壹』 Redis詳解九(哨兵模式)
配置3個哨兵和1主2從的Redis伺服器來演示這個過程。
多哨兵監控Redis
首先配置Redis的主從伺服器,修改redis.conf文件如下
上述內容主要是配置Redis伺服器,從伺服器比主伺服器多一個slaveof的配置和密碼。
配置3個哨兵,每個哨兵的配置都是一樣的。在Redis安裝目錄下有一個sentinel.conf文件,一份進行修改。
上述關閉了保護模式,便於測試。
有了上述的修改,我們可以進入Redis的安裝目錄的src目錄,通過下面的命令啟動伺服器和哨兵
注意啟動的順序。 首先是主機(192.168.11.128)的Redis服務進程,然後啟動從機的服務進程,最後啟動3個哨兵的服務進程。
如果主機宕機後,啟用新的主機,原來的主機回歸後,會作為從機。
從單個實例配置到哨兵:
『貳』 Docker部署Redis哨兵集群腳本V1
操作系統版本 CentOS Linux release 7.6.1810 (Core)
Docker 版本 19.03.11, build 42e35e61f3
Redis 版本 3.2.3-alpine
『叄』 redis sentinel(哨兵)模式
本文使用docker啟動的sentinel,啟動腳本如下
發現最後的sentinels=3,說明有3個哨兵服務正在監控
報錯、此時sentinel可以獲取到主節點信息,但是獲取的ip為docker內部配置的地址
配置完畢
『肆』 Redis哨兵(Sentinel)模式
主從切換技術的方法是:當主伺服器宕機後,需要手動把一台從伺服器切換為主伺服器,這就需要人工干預,費事費力,還會造成一段時間內服務不可用。 這不是一種推薦的方式,更多時候,我們優先考慮 哨兵模式 。
哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作為進程,它會獨立運行。其原理是 哨兵通過發送命令,等待Redis伺服器響應,從而監控運行的多個Redis實例。
這里的哨兵有兩個作用
然而一個哨兵進程對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。
用文字描述一下 故障切換(failover) 的過程。假設主伺服器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認為主伺服器不可用,這個現象成為 主觀下線 。當後面的哨兵也檢測到主伺服器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發布訂閱模式,讓各個哨兵把自己監控的從伺服器實現切換主機,這個過程稱為 客觀下線 。這樣對於客戶端而言,一切都是透明的。
配置3個哨兵和1主2從的Redis伺服器來演示這個過程。
首先配置Redis的主從伺服器,修改redis.conf文件如下
上述內容主要是配置Redis伺服器,從伺服器比主伺服器多一個slaveof的配置和密碼。
配置3個哨兵,每個哨兵的配置都是一樣的。在Redis安裝目錄下有一個sentinel.conf文件,一份進行修改
上述關閉了保護模式,便於測試。
有了上述的修改,我們可以進入Redis的安裝目錄的src目錄,通過下面的命令啟動伺服器和哨兵
注意啟動的順序。 首先是主機(192.168.11.128)的Redis服務進程,然後啟動從機的服務進程,最後啟動3個哨兵的服務進程。
上面是通過Jedis進行使用的,同樣也可以使用Spring進行配置RedisTemplate使用。
sentinel down-after-milliseconds配置項只是一個哨兵在超過規定時間依舊沒有得到響應後,會自己認為主機不可用。對於其他哨兵而言,並不是這樣認為。哨兵會記錄這個消息,當擁有認為主觀下線的哨兵達到sentinel monitor所配置的數量時,就會發起一次投票,進行failover,此時哨兵會重寫Redis的哨兵配置文件,以適應新場景的需要。
『伍』 Redis集群哨兵模式配置優化解析
1、sentinel monitor
當所有節點啟動後,配置文件中的內容發生了變化。
2、sentinel down-after-milliseconds
每個Sentinel節點都要通過定期發送ping命令來判斷Redis數據節點和其餘Sentinel節點是否可達,如果超過了down-after-milliseconds配置的時間且沒有有效的回復,則判定節點不可達,
3、sentinel parallel-syncs
parallel-syncs就是用來限制在一次故障轉移之後,每次向新的主節點發起復制操作的從節點個數。
4、sentinel failover-timeout
ailover-timeout通常被解釋成故障轉移超時時間,但實際上它作用於故障轉移的各個階段:
a)選出合適從節點。
b)晉升選出的從節點為主節點。
c)命令其餘從節點復制新的主節點。
d)等待原主節點恢復後命令它去復制新的主節點。
failover-timeout的作用具體體現在四個方面:
1)如果Redis Sentinel對一個主節點故障轉移失敗,那麼下次再對該主節點做故障轉移的起始時間是failover-timeout的2倍。
2)在b)階段時,如果Sentinel節點向a)階段選出來的從節點執行slaveof no one一直失敗(例如該從節點此時出現故障),當此過程超過failover-timeout時,則故障轉移失敗。
3)在b)階段如果執行成功,Sentinel節點還會執行info命令來確認a)階段選出來的節點確實晉升為主節點,如果此過程執行時間超過failover-timeout時,則故障轉移失敗。
4)如果c)階段執行時間超過了failover-timeout(不包含復制時間),則故障轉移失敗。注意即使超過了這個時間,Sentinel節點也會最終配置從節點去同步最新的主節點。
5、sentinel auth-pass
如果Sentinel監控的主節點配置了密碼,sentinel auth-pass配置通過添加主節點的密碼,防止Sentinel節點對主節點無法監控。
6、sentinel notification-script
sentinel notification-script的作用是在故障轉移期間,當一些警告級別的Sentinel事件發生(指重要事件,例如-sdown:客觀下線、-odown:主觀下線)時,會觸發對應路徑的腳本,並向腳本發送相應的事件參數。
7、sentinel client-reconfig-script
sentinel client-reconfig-script的作用是在故障轉移結束後,會觸發對應路徑的腳本,並向腳本發送故障轉移結果的相關參數
Redis Sentinel可以同時監控多個主節點,具體拓撲圖如下:
配置方法也比較簡單,和監控一個主節點配置類型,只需要指定多個masterName來區分不同的主節點即可。
Sentinel節點也支持動態地設置參數,而且和普通的Redis數據節點一樣並不是支持所有的參數。
Sentinel節點可以使用sentinel set
支持的參數:
sentinel set命令只對當前Sentinel節點有效,sentinel set命令如果執行成功會立即刷新配置文件,這點和Redis普通數據節點設置配置需要執行config rewrite刷新到配置文件不同。建議所有Sentinel節點的配置盡可能一致,這樣在故障發現和轉移時比較容易達成一致。Sentinel對外不支持config命令。
『陸』 Redis 學習總結(3) Redis 哨兵模式
在實際開發中不會僅僅部署一個 Redis 伺服器,為了獲得高可用,Redis 哨兵模式 則是高可用的一種選擇。
本文先介紹下 哨兵模式,再介紹了如何在 springboot 項目中使用。
這意味著使用 Sentinel (哨兵模式),您可以創建一個 Redis 部署,它可抵抗某些類型的故障(進行故障遷移)而無需人工干預。
它有這些功能:
Sentinel 的分布式特性
Redis Sentinel 是一個分布式系統,多個 Sentinel 進程協同工作,有這些優勢:
部署前需要了解:
三個節點的基本配置
法定人數和仲裁
在配置 哨兵模式時,要指定一個 quorum,它可理解為「法定人數」。
假設有3 個 哨兵,法定人數為2。那麼:
哨兵和副本的自動發現
Sentinel 與其他 Sentinel 保持連接,以便相互檢查彼此的可用性並交換消息。
但是,您不需要在您運行的每個 Sentinel 實例中配置其他 Sentinel 地址的列表,因為 Sentinel 使用 Redis 實例的 Pub/Sub 功能來發現正在監視相同主節點和副本的其他 Sentinel。
類似地,您不需要配置附加到主伺服器的副本地址在哪裡,因為 Sentinel 會通過查詢 Redis 自動發現它們。
參考我的另一篇文章:
一般需要三個節點,每個節點有一個 redis 和一個哨兵。
下面再分別描述。
我這里按三個 節點,先配置 redis 的主從復制。1個節點作為 master ,2個副本。
配置節點1:master
這里的 redis 作為 master 主redis,其他兩個節點作為從節點。
我的文件夾名字叫 box1,這里編輯一個 box1/redis.conf 文件,主要配置內容如下:
配置節點2:副本
編輯一個 box2/redis.conf 文件,主要配置內容如下:
配置節點3:副本
編輯一個 box3/redis.conf 文件,主要配置內容如下:
分別啟動這三個redis
命令行執行 redis-server ,並指定 配置文件的路徑參數。
如何查看「主從復制」是否配置成功?
使用 info replication 命令,操作如下:
副本節點設置為只讀?
從 Redis 2.6 開始,副本已被默認設置為 只讀,無需額外配置。.
一般情況下,至少會需要三個哨兵對redis 進行監控,我們可以通過修改埠啟動多個sentinel 服務。
第一個哨兵:
哨兵的 默認埠是 26379 ,這里不改。
第二個哨兵:
修改哨兵埠。
第三個哨兵:
修改哨兵埠。
啟動哨兵
使用 redis-sentinel 命令,分別啟動這三個哨兵
哨兵的自動發現
當三個哨兵都啟動後,在各個哨兵的列印日誌里可以看到, 三個哨兵已互相發現了彼此的存在 。
至此,配置完畢了,我們有三個 redis,和三個哨兵,看下截圖。
模擬 master 宕機
按 ctrl+c 停止 master ,其位於 6379 。停止後,從日誌可以看到,哨兵和 redis副本先努力繼續連接 6379,反復幾次失敗後,開始選舉出新的 master。截圖如下:
至此,配置完畢。
我們看下 springboot 項目的客戶端如何配置 以訪問 哨兵模式的 redis。
Redis 哨兵支持
對於處理高可用Redis,Spring Data Redis 已經支持Redis Sentinel,使用RedisSentinelConfiguration,如下例所示:
Jedis 和 Lettuce 兩種 redis 驅動都可以支持。
RedisSentinelConfiguration 也可以用可以 通過 PropertySource 來設置,它允許您設置以下屬性:
配置application.yml
比如我這里修改我的 application.yml 文件如下:
我的配置文件示例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel
我的 springboot 配置實例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel/springboot_redis_demo
Redis官網 sentinel 介紹
https://redis.io/topics/sentinel
spring-data/data-redis
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel
https://www.cnblogs.com/jaycekon/p/6237562.html
END