## 伸縮原理
集群伸縮就是槽位和數據在節點之間的移動;
## 擴容集群
1. 準備新節點;
1.集群模式;
2.配置和其他節點統一;
3.啟動后是孤兒節點;

2. 加入集群(meet);
3. 遷移槽和數據;
1. 槽遷移計劃;
2. 遷移數據;
3. 添加從節點;

* 圖中每個節點把一部分槽和數據遷移到新的節點6385,每個節點負責的槽和數據相比之前變少了從而達到了集群擴容的目的。這里我們故意忽略了槽和數據在節點之間遷移的細節,目的是想讓讀者重點關注在上層槽和節點分配上來,**理解集群的水平伸縮的上層原理:集群伸縮=槽和數據在節點之間的移動**
* 下面將介紹集群擴容和收縮的細節



## 加入集群作用
1. 為它遷移槽和數據實現擴容;
2. 作為從節點負責故障轉移;
3. 建議使用Redis-trib.rb 能夠避免新節點已經加入了其它集群,造成故障;
## 集群擴容
1. 開啟集群;
```
4c0dcdf4862435f9e0b7ab9573c5d88ebce69c9e 127.0.0.1:7005@17005 slave 26cdec411e03740e81741fd1af56c84a8995e1bf 0 1606130372000 2 connected
26cdec411e03740e81741fd1af56c84a8995e1bf 127.0.0.1:7001@17001 master - 0 1606130373000 2 connected 5461-10922 //槽位
f29d5a33719410d0d965f0cd04a1aaf62772113c 127.0.0.1:7004@17004 slave e4bba455615996a2419f5ea68fb483572da69a4e 0 1606130373441 8 connected
e4bba455615996a2419f5ea68fb483572da69a4e 127.0.0.1:7000@17000 myself,master - 0 1606130370000 8 connected 0-5460
6f0a7298bd81de901ebd4989504a4d914e5002e2 127.0.0.1:7003@17003 slave 86ebe5a560dc152174ae87b4555890486aa35051 0 1606130371000 3 connected
86ebe5a560dc152174ae87b4555890486aa35051 127.0.0.1:7002@17002 master - 0 1606130372422 3 connected 10923-16383
```
2. 準備新節點;
我們準備了7006和7007兩個新節點;可以看到此時它們是兩個孤兒節點;并沒有與集群中其他幾點進行通信;
```
? bin redis-cli -p 7006 cluster nodes
daac46e66a8936545668c78cbe7575e6cabac310 :7006@17006 myself,master - 0 0 0 connected
? bin redis-cli -p 7007 cluster nodes
287b5e49634a455052c9a1ef388bc40365881be6 :7007@17007 myself,master - 0 0 0 connected
```
3. 加入集群:
```
? bin redis-cli -p 7000 cluster meet 127.0.0.1 7006
OK
? bin redis-cli -p 7000 cluster meet 127.0.0.1 7007
OK
```
查看:* 集群內新舊節點**經過一段時間的ping/pong消息通信之后,所有節點會發現新節點并將它們的狀態保存到本地**。例如我們在7006節點上執行cluster nodes命令可以看到新節點信息,如下所示:
```
? bin redis-cli -p 7006 cluster nodes
f29d5a33719410d0d965f0cd04a1aaf62772113c 127.0.0.1:7004@17004 slave e4bba455615996a2419f5ea68fb483572da69a4e 0 1606130701061 8 connected
e4bba455615996a2419f5ea68fb483572da69a4e 127.0.0.1:7000@17000 master - 0 1606130704147 8 connected 0-5460
26cdec411e03740e81741fd1af56c84a8995e1bf 127.0.0.1:7001@17001 master - 0 1606130705178 2 connected 5461-10922
86ebe5a560dc152174ae87b4555890486aa35051 127.0.0.1:7002@17002 master - 0 1606130707231 3 connected 10923-16383
287b5e49634a455052c9a1ef388bc40365881be6 127.0.0.1:7007@17007 master - 0 1606130706202 9 connected
6f0a7298bd81de901ebd4989504a4d914e5002e2 127.0.0.1:7003@17003 slave 86ebe5a560dc152174ae87b4555890486aa35051 0 1606130704000 3 connected
4c0dcdf4862435f9e0b7ab9573c5d88ebce69c9e 127.0.0.1:7005@17005 slave 26cdec411e03740e81741fd1af56c84a8995e1bf 0 1606130702094 2 connected
daac46e66a8936545668c78cbe7575e6cabac310 127.0.0.1:7006@17006 myself,master - 0 1606130703000 0 connected
```
新節點剛開始都是主節點狀態,但是由于沒有負責的槽,所以不能接受任何讀寫操作。**對于新節點的后續操作我們一般有兩種選擇:**
* 為它遷移槽和數據實現擴容
* 作為其他主節點的從節點負責故障轉移
4. 分配主從
```
? bin redis-cli -p 7007 cluster replicate daac46e66a8936545668c78cbe7575e6cabac310
OK
```
```
? bin redis-cli -p 7000 cluster nodes
287b5e49634a455052c9a1ef388bc40365881be6 127.0.0.1:7007@17007 slave daac46e66a8936545668c78cbe7575e6cabac310 0 1606131900000 0 connected
4c0dcdf4862435f9e0b7ab9573c5d88ebce69c9e 127.0.0.1:7005@17005 slave 26cdec411e03740e81741fd1af56c84a8995e1bf 0 1606131902172 2 connected
26cdec411e03740e81741fd1af56c84a8995e1bf 127.0.0.1:7001@17001 master - 0 1606131902000 2 connected 5461-10922
f29d5a33719410d0d965f0cd04a1aaf62772113c 127.0.0.1:7004@17004 slave e4bba455615996a2419f5ea68fb483572da69a4e 0 1606131901152 8 connected
e4bba455615996a2419f5ea68fb483572da69a4e 127.0.0.1:7000@17000 myself,master - 0 1606131901000 8 connected 0-5460
6f0a7298bd81de901ebd4989504a4d914e5002e2 127.0.0.1:7003@17003 slave 86ebe5a560dc152174ae87b4555890486aa35051 0 1606131903198 3 connected
86ebe5a560dc152174ae87b4555890486aa35051 127.0.0.1:7002@17002 master - 0 1606131903000 3 connected 10923-16383
daac46e66a8936545668c78cbe7575e6cabac310 127.0.0.1:7006@17006 master - 0 1606131901000 0 connected //此刻沒有負責任何的槽位,不能讀寫的
```
5. 分配數據( redis-cli cluster)
```
? bin redis-cli --cluster reshard 127.0.01:7000
>>> Performing Cluster Check (using node 127.0.01:7000)
M: e4bba455615996a2419f5ea68fb483572da69a4e 127.0.01:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 287b5e49634a455052c9a1ef388bc40365881be6 127.0.0.1:7007
slots: (0 slots) slave
replicates daac46e66a8936545668c78cbe7575e6cabac310
S: 4c0dcdf4862435f9e0b7ab9573c5d88ebce69c9e 127.0.0.1:7005
slots: (0 slots) slave
replicates 26cdec411e03740e81741fd1af56c84a8995e1bf
M: 26cdec411e03740e81741fd1af56c84a8995e1bf 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: f29d5a33719410d0d965f0cd04a1aaf62772113c 127.0.0.1:7004
slots: (0 slots) slave
replicates e4bba455615996a2419f5ea68fb483572da69a4e
S: 6f0a7298bd81de901ebd4989504a4d914e5002e2 127.0.0.1:7003
slots: (0 slots) slave
replicates 86ebe5a560dc152174ae87b4555890486aa35051
M: 86ebe5a560dc152174ae87b4555890486aa35051 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: daac46e66a8936545668c78cbe7575e6cabac310 127.0.0.1:7006
slots: (0 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096 //詢問遷移多少個槽位
What is the receiving node ID? daac46e66a8936545668c78cbe7575e6cabac310 //目標節點的ID,就是新加入節點的runid(master)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all //從所有主庫中移出對應的槽值個數
Do you want to proceed with the proposed reshard plan (yes/no)? yes //是否繼續
```
查看
```
? bin redis-cli -p 7000 cluster nodes | grep master
26cdec411e03740e81741fd1af56c84a8995e1bf 127.0.0.1:7001@17001 master - 0 1606132876000 2 connected 6827-10922
e4bba455615996a2419f5ea68fb483572da69a4e 127.0.0.1:7000@17000 myself,master - 0 1606132877000 8 connected 1365-5460
86ebe5a560dc152174ae87b4555890486aa35051 127.0.0.1:7002@17002 master - 0 1606132876771 3 connected 12288-16383
daac46e66a8936545668c78cbe7575e6cabac310 127.0.0.1:7006@17006 master - 0 1606132874715 10 connected 0-1364 5461-6826 10923-12287 //可以看出,之前的每個節點都讓出了一部分槽位給新加入集群的master節點
```
由于槽用于hash運算本身順序沒有意義,因此無須強制要求節點負責槽的順序性。遷移之后建議使用下面的命令檢查節點之間槽的均衡性。命令如下:
```
? bin redis-cli --cluster rebalance 127.0.0.1:7000
```
結果
```
>>> Performing Cluster Check (using node 127.0.0.1:7000)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold. //2%
```
* 通過上圖可以看出遷移之后**所有主節點負責的槽數量差異在2%以內,因此集群節點數據相對均勻,無需調整**
- Redis簡介
- 簡介
- 典型應用場景
- Redis安裝
- 安裝
- redis可執行文件說明
- 三種啟動方法
- Redis常用配置
- API的使用和理解
- 通用命令
- 數據結構和內部編碼
- 單線程
- 數據類型
- 字符串
- 哈希
- 列表
- 集合
- 有序集合
- Redis常用功能
- 慢查詢
- Pipline
- 發布訂閱
- Bitmap
- Hyperloglog
- GEO
- 持久化機制
- 概述
- snapshotting快照方式持久化
- append only file追加方式持久化AOF
- RDB和AOF的抉擇
- 開發運維常見問題
- fork操作
- 子進程外開銷
- AOF追加阻塞
- 單機多實例部署
- Redis復制原理和優化
- 什么是主從復制
- 主從復制配置
- 全量復制和部分復制
- 故障處理
- 開發運維常見問題
- Sentinel
- 主從復制高可用
- 架構說明
- 安裝配置
- 客戶端連接
- 實現原理
- 常見開發運維問題
- 高可用讀寫分離
- 故障轉移client怎么知道新的master地址
- 總結
- Sluster
- 呼喚集群
- 數據分布
- 搭建集群
- 集群通信
- 集群擴容
- 集群縮容
- 客戶端路由
- 故障轉移
- 故障發現
- 故障恢復
- 開發運維常見問題
- 緩存設計與優化
- 緩存收益和成本
- 緩存更新策略
- 緩存粒度控制
- 緩存穿透優化
- 緩存雪崩優化
- 無底洞問題優化
- 熱點key重建優化
- 總結
- 布隆過濾器
- 引出布隆過濾器
- 布隆過濾器基本原理
- 布隆過濾器誤差率
- 本地布隆過濾器
- Redis布隆過濾器
- 分布式布隆過濾器
- 開發規范
- 內存管理
- 開發運維常見坑
- 實戰
- 對文章進行投票
- 數據庫的概念
- 啟動多實例