Region Migration 技术原理 — 共享存储架构下的高效数据迁移策略

背景

GreptimeDB 是一款采用共享存储架构的分布式时序数据库,其底层存储支持对象存储,可实现 50 倍成本节省。在 GreptimeDB 的分布式版本中,包含以下三种节点角色:MetaSrv ,Datanode 和 Frontend。

  • MetaSrv 管理着数据库和表的元信息,包括数据表分区在集群中的分布、请求的路由地址等信息。
  • Datanode 负责存储集群中的表分区(Region)数据,接收并执行从 Frontend 发来的读写请求。
  • Frontend 为无状态组件,可以根据需求进行伸缩扩容。其主要职责包括接收请求并进行鉴权,将多种协议转换为 GreptimeDB 集群的内部协议,并根据元数据将请求转发到相应的 Datanode 节点。

Region Migration

自 v0.6.0 起,GreptimeDB 分布式版本具备了将 Datanode 上的表分区(Region)数据迁移到另一个 Datanode 的能力。GreptimeDB 采用了共享存储(Shared Storage)架构,其中数据文件存储在对象存储上,并在多个 Datanode 之间共享。

因此,Region Migration 仅需迁移 Datanode 少量的本地数据(即 Datanode Memtable 中的数据)。与 Shared Nothing 架构的数据库相比,我们实际数据量迁移较小,整体迁移所需时间更短,同时上层负载均衡的体验也更加平滑。

技术细节

Internal

当写入请求到达 Datanode 时,Datanode 会以预写日志格式(WAL)将数据写入 Kafka 集群,随后更新 Memtable 后并响应请求。那么我们有以下关系:

sql 复制代码
完整表分区的数据 = Remote WAL 中的部分数据 + 对象存储上的数据文件

存储在对象存储上的数据在 Datanode 之间共享,因此进行 Region 迁移的目标节点(Datanode)只需要从指定位置开始回放表分区(Region)的 WAL 即可。

迁移流程

迁移命令如下,用户需要指定待迁移 Region ID,待迁移 Region ID 所属的 Datanode ID,和目标节点的 Datanode ID,并可指定回放数据的 Timeout 参数(可选)。

sql 复制代码
select migrate_region(
 region_id, 
 from_dn_id, 
 to_dn_id, 
 [replay_timeout(s)]);

你可以用以下 SQL 命令查询名为 'migration_target' 数据表中的 Region 分布

sql 复制代码
select b.peer_id as datanode_id,
       a.greptime_partition_id as region_id
from information_schema.partitions a left join information_schema.greptime_region_peers b
on a.greptime_partition_id = b.region_id where a.table_name='migration_target' order by datanode_id asc;

查询结果示例:数据表包含一个 Region ID 为 4398046511104 的 Region 在 Datanode 1 上。

sql 复制代码
+-------------+---------------+
| datanode_id | region_id     |
+-------------+---------------+
|           1 | 4398046511104 |
+-------------+---------------+
1 row in set (0.01 sec)

准备候选分区

当用户输入迁移分区命令后,集群的 MetaSrv 会启动分区迁移 Procedure(GreptimeDB 如何提高多步操作的容错能力)。Procedure 首先会检查迁移目标节点(Destination Datanode)上是否存在候选分区(Candidate Region) 。若不存在,则在目标节点上打开候选分区。

进行数据迁移

  1. 在数据迁移正式开始之前,MetaSrv 会将原分区标记为降级,以切断写入流量(对应图中的 Update Metadata 和 Downgrade Leader Region);
  2. 然后,MetaSrv 通知候选分区从 Remote WAL 开始回放数据(对应图中的 Replay WAL 和 Upgrade Candidate Region);
  3. 如果数据成功回放,候选节点将被升级为分区的 Leader(对应图中的 Switch to Candidate Region),并继续接受写入流量;
  4. 否则,如果在数据回放过程中发生任何不可重试的错误,Procedure 会将原分区的降级标记移除,允许上层流量继续写入。

未来展望

未来,我们将基于 Region Migration 的能力实现热点数据迁移,以及负载平衡的水平扩展。在不中断服务的情况下,根据实时监测的负载状况和业务需求,智能地分配表分区(Region),以优化资源利用。这将实现更加智能和高效的数据管理,为持续变化的业务环境提供可持续的支持。

本周,我们也将发布 Region Migration 相关的用户指南,敬请期待。

GreptimeDB 作为开源项目,欢迎对时序数据库、Rust 语言等内容感兴趣的同学们参与贡献和讨论。第一次参与项目的同学推荐先从带有 good first issue 标签的 issue 入手,期待在开源社群里遇见你! Star us on GitHub Now: github.com/GreptimeTea... 微信搜索 GreptimeDB,关注公众号不错过更多技术干货和福利~

关于 Greptime:

目前主要有以下三款产品:

  • GreptimeDB 是一款用 Rust 语言编写的时序数据库,具有分布式、开源、云原生和兼容性强等特点,帮助企业实时读写、处理和分析时序数据的同时降低长期存储成本。
  • GreptimeCloud 可以为用户提供全托管的 DBaaS 服务,能够与可观测性、物联网等领域高度结合。
  • GreptimeAI 是为 LLM 应用量身定制的可观测性解决方案。
  • 车云一体解决方案是一款深入车企实际业务场景的时序数据库解决方案,解决了企业车辆数据呈几何倍数增长后的实际业务痛点。

GreptimeCloud 和 GreptimeAI 已正式公测,欢迎关注公众号或官网了解最新动态!对企业版 GreptimDB 感兴趣也欢迎联系小助手(微信搜索 greptime 添加小助手)。

官网:greptime.cn/

GitHub: github.com/GreptimeTea...

文档:docs.greptime.cn/

Twitter: twitter.com/Greptime

Slack: www.greptime.com/slack

LinkedIn: www.linkedin.com/company/gre...

相关推荐
2401_832365522 分钟前
Chart.js 4 中基于数据实际范围的线性渐变填充方案
jvm·数据库·python
qq_342295825 分钟前
如何让 Bootstrap 图标在 Vue 3 中持续旋转动画
jvm·数据库·python
李兆龙的博客9 分钟前
从一到无穷大 #70 从 LR 图 PEC 到InfluxQL兼容性差分测试方法论与工程实践
数据库·功能测试·oracle
爱学习的小囧11 分钟前
ESXi 开启 Secure Boot 后驱动签名验证失败完整处置教程:合规修复与临时测试方案全解
服务器·数据库·esxi·虚拟化
weixin_5689960620 分钟前
如何用 IndexedDB 存储从 API 获取的超大列表并实现二级索引
jvm·数据库·python
APIshop22 分钟前
小红书笔记视频详情接口深度解析:smallredbook.item_get_video_pro
数据库·笔记·音视频
空中海24 分钟前
Redis 从零到精通:9大数据结构 × 11个高频工程实战场景完全手册
数据结构·数据库·redis
qiuyunoqy25 分钟前
MySQL - 2
数据库·mysql
2301_7751481528 分钟前
如何授权AWR报告生成_GRANT SELECT ANY DICTIONARY诊断权限
jvm·数据库·python
空中海40 分钟前
Redis 专家实战:生产架构设计 × 容量规划 × 安全治理 × 37道高频面试题全解
数据库·redis·安全