標籤:
Sentinel
1. Sentinel只是一個運行在特殊模式下的Redis伺服器,它使用了和普通模式不同的命令表,所以Sentinel模式能夠使用的命令和普通的Redis伺服器能夠使用的命令不同。
2. Sentinel會讀入使用者指定的設定檔,為每個要被監控的主伺服器建立相應的執行個體結構,並建立連向主伺服器的命令串連和訂閱串連,其中命令串連用於向主伺服器發送命令請求,
而訂閱串連則用於接收指定頻道的訊息。
3. Sentinel通過向主伺服器發送INFO命令來獲得主伺服器屬下所有從伺服器的地址資訊,並為這些從伺服器建立相應的執行個體結構,以及連向這些從伺服器命令串連和訂閱串連。
4. 在一般情況下,Sentinel以每十秒一次的頻率向被監視的主伺服器和從伺服器發送INFO命令,當主伺服器處於下線狀態,或者Sentinel正在對主伺服器進行容錯移轉操作時,
Sentinel向從伺服器發送INFO命令的頻率改為每秒一次。
5. 對於監視同一個主伺服器和從伺服器的多個Sentinel來說,他們會以每兩秒一次的頻率,通過向被監視伺服器的_sentinel_:hello頻道發送訊息來向其他Sentinel宣告自己的存在。
6. 每個Sentinel也會從_sentinel_:hello頻道中接收其他Sentinel發來的而資訊,並根據這些資訊為其他Sentinel建立相應的執行個體結構,以及命令串連。
7. Sentinel只會與主伺服器和從伺服器建立命令串連和訂閱串連,Sentinel與Sentinel之間則只會建立命令串連。
8. Sentinel以每秒一次的頻率向執行個體(包括主伺服器、從伺服器、其他Sentinel)發送PING命令,並根據執行個體對PING命令的回複來判斷執行個體是否線上,當一個執行個體在指定時間長度中連續向Sentinel
發送無效回複時,Sentinel會將這個執行個體判斷為主觀下線。
9. 當Sentinel將一個主服務判斷為主觀下線時,它會向同樣監視這個主伺服器的其他Sentinel進行詢問,看他們是否同意這個主伺服器已經進入主觀下線狀態。
10. 當Sentinel收集到足夠多的主觀下線投票之後,它會將主伺服器判斷為客觀下線,並發起一次針對主伺服器的容錯移轉操作。
11. 主伺服器下線後,通過一系列篩選條件過濾從伺服器,最後比較複製位移量,如果也相等,則更具主鍵。
叢集
1. 節點通過握手來將其他節點添加到自己所處的叢集當中
2. 叢集中的16384個槽可以分別指派給叢集中的各個節點,每個節點都會記錄哪些槽指派給了自己,而哪些槽又被指派給了其他節點。
3. 節點在接收到一個命令請求時,會先檢查這個命令請求要處理的鍵所在的槽是否由自己負責,如果不是的話,節點向用戶端返回一個MOVED錯誤,MOVED錯誤攜帶的資訊可以指引用戶端轉向
至正在負責相關槽的節點。
4. 對Redis叢集的重新分區工作是由redis-trib負責執行的,重新分區的關鍵是將屬於某個槽的所有索引值對從一個節點轉移至另一個節點。
5. 如果節點A正在遷移槽i至節點B,那麼當節點A沒能在自己的資料庫找到命令指定的資料庫鍵時,節點A會向用戶端返回一個ASK錯誤,指引用戶端到節點B繼續查詢指定的資料庫鍵。
6. MOVED錯誤表示槽的負責權已經從一個節點轉移到了另一個節點,而ASK錯誤只是兩個節點在遷移槽的過程中使用一種臨時措施。
7. 叢集裡的從節點用於複製主節點,並在主節點下線時,代替主節點繼續處理命令請求。
8. 叢集中的節點通過發送和接收訊息來進行通訊,常見的訊息包括MEET 、PING 、PONG 、PUBLISH 、FAIL五種。
9. Redis叢集是Redis提供的分散式資料庫方案,叢集通過分區來進行資料庫共用,並提供複製和容錯移轉功能。
10. 一個Redis叢集通常由多個節點群組成,串連各個節點的工作可以使用CLUSTER MEET命令來完成:CLUSTER MEET <port> <port> 。向一個節點node發送CLUSTER MEET命令,可以讓node
節點與ip和port所指定的節點進行握手,當握手成功時,node節點就會將ip和port所指定的節點添加到node節點當前所在的叢集中。
11. Redis 需要設定custer_enabled為yes來啟動叢集模式。
12. Redis叢集通過分區的方式來儲存資料庫中的索引值對:叢集的整個資料庫被分為16384個槽(slot),資料庫中的每個鍵都屬於整個16384個槽的其中一個,叢集中的每個節點可以處理0個到16384個槽。
當資料庫中的16384個槽都有節點在處理時,叢集處於上線狀態。如果有一個槽沒有得到處理,那麼叢集處於下線狀態(fail)。
13. 通過CLUSTER ADDSLOTS命令,我們可以將一個或多個槽指派給節點負責:CLUSTER ADDSLOTS <slot> [slot.....] 例如:CLUSTER ADDSLOTS 0 1 2 3 ... 5000
14. clusterNode結構的slots(標記節點是否負責槽,如果值為1,負責,值為0,不負責)屬性和numslot(槽的數量)屬性記錄了節點負責處理哪些槽。
15. 節點會將自己的slots數組通過訊息發送給進群中的其他節點。其他節點將資訊儲存到自己的clusterNode中
16. clusterState結構中的slots數組記錄了叢集中所有16384個槽指派資訊。
17. clusterState.slots數組記錄了叢集中的額所有槽的指派資訊,而clusterNode.slots數組只記錄clusterNode結構所代表的節點的槽指派資訊,這是兩個slots資料的關鍵區別。
18. 向一個節點發送:CLUSTER REPICATE <node_id> 可以讓接收命令的節點成為node_id所指定節點的從節點,並開始對主節點進行複製。
redis 筆記05