Redis 集羣提供了靈活的節點擴容和收縮方案。在不影響集羣對外服務的狀況下,能夠爲集羣添加節點進行擴容也能夠下線部分節點進行縮容。node
當主節點分別維護本身負責的槽和對應的數據,若是但願加入1個節點實現集羣擴容時,須要經過相關命令把一部分槽和數據遷移給新節點。
![
](https://img-blog.csdnimg.cn/2...
上面圖裏的每一個節點把一部分槽和數據遷移到新的節點newredis,每一個節點負責的槽和數據相比以前變少了從而達到了集羣擴容的目的,集羣伸縮=槽和數據在節點之間的移動。redis
須要提早準備好新節點並運行在集羣模式下,新節點建議跟集羣內的節點配置保持一致,便於管理統一。安全
經過 redis-trib.rb add-node ip:6397 ip:6391
實現節點添加。工具
加入集羣后須要爲新節點遷移槽和相關數據,槽在遷移過程當中集羣能夠正常提供讀寫服務,遷移過程是集羣擴容最核心的環節,下面詳細講解。spa
槽是 Redis 集羣管理數據的基本單位,首先須要爲新節點制定槽的遷移計劃,肯定原有節點的哪些槽須要遷移到新節點。遷移計劃須要確保每一個節點負責類似數量的槽,從而保證各節點的數據均勻,好比以前是三個節點,如今是四個節點,把節點槽分佈在四個節點上。
槽遷移計劃肯定後開始逐個把槽內數據從源節點遷移到目標節點.
數據遷移過程是逐個槽進行的
流程說明:
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