redis cluster原始碼研究--增刪節點
增刪節點是指節點加入或退出redis cluster。
redis cluster 提供了運維工具redis-trib.rb,使得增刪節點變得簡單和容易。
一、增節點
1、加入 步驟:
(1)以cluster模式啟動新節點(127.0.0.1:7000);
(2)用以下命令將新節點(空主節點)加入叢集:
./redis-trib.rb add-node 127.0.0.1:7000 27.0.0.1:7006
其中第一個引數是新節點地址,第二引數可以是叢集中任意一個節點地址。
就這樣,把新節點(127.0.0.1:7000)加入了叢集,但新節點沒有負責任何雜湊槽,可通過reshard給它分配雜湊槽,本節不討論如何reshard。
(3)如果要將新節點(空主節點)設為某主節點的從節點,可通過redis-cli連上新節點,然後用以下命令:
redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
其中3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e是新節點的主節點id。
2、實現原理
redis-trib.rb add-node命令實際傳送了cluster meet命令給叢集裡某一個節點,該節點會將新節點加入它的叢集配置,並與新節點進行握手,以確保可以連上新節點,最後通過定時發ping包給叢集其他節點以告之有新節點的存在,其他節點也因此將新節點加入它的叢集配置,並與新節點進行握手,以確保可以連上新節點。
設定新節點A為某主節點B的從節點是通過cluster replicate命令實現,分析該命令原始碼,可知其原理是首先將自已設為該主節點的從節點,建立主從同步關係,然後通過ping包告訴叢集其他節點,我是主節點B的從節點。
以上變動,EpochConfig不會發生變化。
二、刪除節點
1、從節點或空主節點刪除步驟:
(1)簡單通過以下命令:
./redis-trib del-node 127.0.0.1:7000 `<node-id>`
其中第一引數可以是叢集中任意一個節點地址,第二引數是要刪除節點id。
2、非空主節點刪除步驟:
(1)首先通過man failover使該節點變為從節點;
(2)然後按刪除從節點步驟刪除該節點。
3、實現原理
通過分析redis-trib del-node命令可知:(1)首先發送cluster forget命令給除了刪除節點外其他叢集節點,它會使收到該命令的節點將待刪除節點從叢集節點配置中刪除;
(2)如果待刪除節點是空的主節點,會通過cluster replicate命令將它的從節點設為目前從節點數最少的主節點的從節點;(3)最後傳送shutdown命令給待刪除節點,使其自動關閉程序。
以上變動,EpochConfig同樣不會發生變化。