项目实践,Redis集群技术学习(十七)

2022-04-07 20:05:16 浏览数 (1)

Redis.7.7 数据迁移

应用 Redis 集群时,常需要把单机 Redis 数据迁移到集群环境。redis-trib.rb 工具提供

了导入功能,用于数据从单机向集群环境迁移的场景,命令如下

redis-trib.rb import host:port --from <arg> --copy –replace

redis-trib.rb import 命令内部采用批量 scan 和 migrate 的方式迁移数据。这种迁移方

式存在以下缺点:

1)迁移只能从单机节点向集群环境导入数据。

2)不支持在线迁移数据,迁移数据时应用方必须停写,无法平滑迁移数据。

3)迁移过程中途如果出现超时等错误,不支持断点续传只能重新全量导入。

4)使用单线程进行数据迁移,大数据量迁移速度过慢。

正因为这些问题,社区开源了很多迁移工具,这里推荐一款唯品会开发的 redismigrate-tool,该工具可满足大多数 Redis 迁移需求,特点如下:

·支持单机、Twemproxy、Redis Cluster、RDB/AOF 等多种类型的数据迁移。

·工具模拟成从节点基于复制流迁移数据,从而支持在线迁移数据,业务方不需要停

写。

·采用多线程加速数据迁移过程且提供数据校验和查看迁移状态等功能。

更多细节见 GitHub:https://github.com/vipshop/redis-migrate-tool。

Redis.8 重点回顾

1)Redis 集群数据分区规则采用虚拟槽方式,所有的键映射到 16384 个槽中,每个节

点负责一部分槽和相关数据,实现数据和请求的负载均衡。

2)搭建集群划分三个步骤:准备节点,节点握手,分配槽。可以使用 redis-trib.rb

create 命令快速搭建集群。

3)集群内部节点通信采用 Gossip 协议彼此发送消息,消息类型分为:ping 消息、

pong 消息、meet 消息、fail 消息等。节点定期不断发送和接受 ping/pong 消息来维护

更新集群的状态。消息内容包括节点自身数据和部分其他节点的状态数据。

4)集群伸缩通过在节点之间移动槽和相关数据实现。扩容时根据槽迁移计划把槽从源

节点迁移到目标节点,源节点负责的槽相比之前变少从而达到集群扩容的目的,收缩

时如果下线的节点有负责的槽需要迁移到其他节点,再通过 cluster forget 命令让集群

内其他节点忘记被下线节点。

5)使用 Smart 客户端操作集群达到通信效率最大化,客户端内部负责计算维护键→槽

→节点的映射,用于快速定位键命令到目标节点。集群协议通过 Smart 客户端全面高

效的支持需要一个过程,用户在选择 Smart 客户端时建议 review 下集群交互代码如:

异常判定和重试逻辑,更新槽的并发控制等。节点接收到键命令时会判断相关的槽是

否由自身节点负责,如果不是则返回重定向信息。重定向分为 MOVED 和 ASK,ASK

说明集群正在进行槽数据迁移,客户端只在本次请求中做临时重定向,不会更新本地

槽缓存。MOVED 重定向说明槽已经明确分派到另一个节点,客户端需要更新槽节点缓

存。

6)集群自动故障转移过程分为故障发现和故障恢复。节点下线分为主观下线和客观下

线,当超过半数主节点认为故障节点为主观下线时标记它为客观下线状态。从节点负

责对客观下线的主节点触发故障恢复流程,保证集群的可用性。

7)开发和运维集群过程中常见问题包括:超大规模集群带宽消耗,pub/sub 广播问

题,集群节点倾斜问题,手动故障转移,在线迁移数据等。

0 人点赞