## 说明
* 收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点。安全下线节点流程如下图所示
![](https://img.kancloud.cn/31/24/31249b6694c17de148584a41b0818daa_1224x1444.png)
**流程说明:**
* 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}命令实现该功能,如下图所示:**
![](https://img.kancloud.cn/a3/05/a305af5689f3a998218e3ec6ed0953b6_575x367.png)
* 当节点接收到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布隆过滤器
- 分布式布隆过滤器
- 开发规范
- 内存管理
- 开发运维常见坑
- 实战
- 对文章进行投票
- 数据库的概念
- 启动多实例