Redis 集羣提供了靈活的節點擴容和收縮方案。在不影響集羣對外服務的狀況下,能夠爲集羣添加節點進行擴容也能夠下線部分節點進行縮容。node
當主節點分別維護本身負責的槽和對應的數據,若是但願加入1個節點實現集羣擴容時,須要經過相關命令把一部分槽和數據遷移給新節點。
對目標節點發送導入命令,讓目標節點準備導入槽的數據。
2)對源節點發送導出命令,讓源節點準備遷出槽的數據。
3)源節點循環執行遷移命令,將槽跟數據遷移到目標節點。redis-trib
提供了槽重分片功能,命令以下:3d
redis-trib.rb reshard host:port --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg>
參數說明:·host:port:
必傳參數,集羣內任意節點地址,用來獲取整個集羣信息。·--from:
制定源節點的 id,若是有多個源節點,使用逗號分隔,若是是all源節點變爲集羣內全部主節點,在遷移過程當中提示用戶輸入。·--to:
須要遷移的目標節點的id,目標節點只能填寫一個,在遷移過程當中提示用戶輸入。·--slots:
須要遷移槽的總數量,在遷移過程當中提示用戶輸入。·--yes:
當打印出 reshard 執行計劃時,是否須要用戶輸入yes確認後再執行 reshard。·--timeout:
控制每次 migrate 操做的超時時間,默認爲60000毫秒。·--pipeline:
控制每次批量遷移鍵的數量,默認爲10。
遷移操做code
redis-trib.rb reshard ip:6379
打印出集羣每一個節點信息後,reshard 命令須要確認遷移的槽數量,這裏咱們根據節點個數輸入對應的值:
輸入某個節點的節點 ID 做爲目標節點,目標節點只能指定一個:
What is the receiving node ID xxxx
以後輸入源節點的 ID,這裏分別輸入相應的節點 ID 最後用 done 表示結束:
數據遷移以前會打印出全部的槽從源節點到目標節點的計劃,確認計劃無誤後輸入 yes 執行遷移工做
redis-trib 工具會打印出每一個槽遷移的進度:
查看節點的信息cluster-node
輸入 redis-trib.rb rebalance ip:port
主從節點設置
擴容之初咱們把639七、6398節點加入到集羣,節點6397遷移了部分槽和數據做爲主節點,但相比其餘主節點目前尚未從節點,所以該節點不具有故障轉移的能力。blog
這時須要把節點6398做爲6397的從節點,從而保證整個集羣的高可用。使用 cluster replicate{masterNodeId}
命令爲主節點添加對應從節點。圖片
收縮集羣意味着縮減規模,須要從現有集羣中安全下線部分節點,下線節點過程以下ip