## 說明
* 收縮集群意味著縮減規模,需要從現有集群中安全下線部分節點。安全下線節點流程如下圖所示

**流程說明:**
* 1)首先需要確定下線節點是否有負責的槽,如果是,需要把槽遷移到 其他節點,保證節點下線后整個集群槽節點映射的完整性
* 2)當下線節點不再負責槽或者本身是從節點時,就可以通知集群內其 他節點忘記下線節點,當所有的節點忘記該節點后可以正常關閉
## 下線遷移槽
```
redis-cli --cluster reshard --cluster-from 下線節點ID --cluster-to 接受槽位節點ID --cluster-slots 遷移槽位數量(需要手動計算) --cluster-yes 127.0.0.1:7000
```
```
redis-cli --cluster reshard --cluster-from daac46e66a8936545668c78cbe7575e6cabac310 --cluster-to e4bba455615996a2419f5ea68fb483572da69a4e --cluster-slots 1365 --cluster-yes 127.0.0.1:7000
```
```
f29d5a33719410d0d965f0cd04a1aaf62772113c 127.0.0.1:7004@17004 slave e4bba455615996a2419f5ea68fb483572da69a4e 0 1606196417583 16 connected
e4bba455615996a2419f5ea68fb483572da69a4e 127.0.0.1:7000@17000 master - 0 1606196415000 16 connected 2406-5653 6180-7281 10923-12742 13523-13845
26cdec411e03740e81741fd1af56c84a8995e1bf 127.0.0.1:7001@17001 master - 0 1606196416000 15 connected 0-471 559-719 1235-1364 1407-2405 5904-6179 7282-10922 12743-13522
86ebe5a560dc152174ae87b4555890486aa35051 127.0.0.1:7002@17002 master - 0 1606196415528 14 connected 472-558 720-1234 1365-1406 5654-5903 13846-16383
287b5e49634a455052c9a1ef388bc40365881be6 127.0.0.1:7007@17007 slave e4bba455615996a2419f5ea68fb483572da69a4e 0 1606196416555 16 connected
6f0a7298bd81de901ebd4989504a4d914e5002e2 127.0.0.1:7003@17003 slave 86ebe5a560dc152174ae87b4555890486aa35051 0 1606196418613 14 connected
4c0dcdf4862435f9e0b7ab9573c5d88ebce69c9e 127.0.0.1:7005@17005 slave 26cdec411e03740e81741fd1af56c84a8995e1bf 0 1606196417000 15 connected
daac46e66a8936545668c78cbe7575e6cabac310 127.0.0.1:7006@17006 myself,master - 0 1606196413000 10 connected //槽位已清空
```
## 忘記節點
* 由于集群內的節點不停地通過Gossip消息彼此交換節點狀態,**因此需要通過一種健壯的機制讓集群內所有節點忘記下線的節點。**也就是說讓其他節點不再與要下線節點進行Gossip消息交換
* **Redis提供了clusteforget {downNodeId}命令實現該功能,如下圖所示:**

* 當節點接收到cluster forget {down NodeId}命令后,會把nodeId指定的?點加入到禁用列表中,在禁用列表內的節點不再發送Gossip消息。禁用列表有效期是60秒,超過60秒節點會再次參與消息交換。也就是說當第一次forget命令發出后,我們有60秒的時間讓集群內的所有節點忘記下線節點
* **線上操作不建議直接使用cluster forget命令下線節點,需要跟大量節點命令交互,**實際操作起來過于繁瑣并且容易遺漏forget節點
* **建議使用redis-cli --cluster del-node {host:port} {downNodeId}命令(內部使用forget消息實現)**
## 移除節點
```
? bin redis-cli --cluster del-node 127.0.0.1:7000 287b5e49634a455052c9a1ef388bc40365881be6
>>> Removing node 287b5e49634a455052c9a1ef388bc40365881be6 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
```
- 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布隆過濾器
- 分布式布隆過濾器
- 開發規范
- 內存管理
- 開發運維常見坑
- 實戰
- 對文章進行投票
- 數據庫的概念
- 啟動多實例