背景
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 后并响应请求。那么我们有以下关系:
完整表分区的数据 = Remote WAL 中的部分数据 + 对象存储上的数据文件
存储在对象存储上的数据在 Datanode 之间共享,因此进行 Region 迁移的目标节点(Datanode)只需要从指定位置开始回放表分区(Region)的 WAL 即可。
迁移流程
迁移命令如下,用户需要指定待迁移 Region ID,待迁移 Region ID 所属的 Datanode ID,和目标节点的 Datanode ID,并可指定回放数据的 Timeout 参数(可选)。
select migrate_region(
region_id,
from_dn_id,
to_dn_id,
[replay_timeout(s)]);
你可以用以下 SQL 命令查询名为 'migration_target' 数据表中的 Region 分布
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 上。
+-------------+---------------+
| datanode_id | region_id |
+-------------+---------------+
| 1 | 4398046511104 |
+-------------+---------------+
1 row in set (0.01 sec)
准备候选分区
当用户输入迁移分区命令后,集群的 MetaSrv 会启动分区迁移 Procedure(GreptimeDB 如何提高多步操作的容错能力)。Procedure 首先会检查迁移目标节点(Destination Datanode)上是否存在候选分区(Candidate Region) 。若不存在,则在目标节点上打开候选分区。
进行数据迁移
- 在数据迁移正式开始之前,MetaSrv 会将原分区标记为降级,以切断写入流量(对应图中的 Update Metadata 和 Downgrade Leader Region);
- 然后,MetaSrv 通知候选分区从 Remote WAL 开始回放数据(对应图中的 Replay WAL 和 Upgrade Candidate Region);
- 如果数据成功回放,候选节点将被升级为分区的 Leader(对应图中的 Switch to Candidate Region),并继续接受写入流量;
- 否则,如果在数据回放过程中发生任何不可重试的错误,Procedure 会将原分区的降级标记移除,允许上层流量继续写入。
未来展望
未来,我们将基于 Region Migration 的能力实现热点数据迁移,以及负载平衡的水平扩展。在不中断服务的情况下,根据实时监测的负载状况和业务需求,智能地分配表分区(Region),以优化资源利用。这将实现更加智能和高效的数据管理,为持续变化的业务环境提供可持续的支持。
本周,我们也将发布 Region Migration 相关的用户指南,敬请期待。
GreptimeDB 作为开源项目,欢迎对时序数据库、Rust 语言等内容感兴趣的同学们参与贡献和讨论。第一次参与项目的同学推荐先从带有 good first issue 标签的 issue 入手,期待在开源社群里遇见你!
Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
微信搜索 GreptimeDB,关注公众号不错过更多技术干货和福利~
关于 Greptime:
目前主要有以下三款产品:
- GreptimeDB 是一款用 Rust 语言编写的时序数据库,具有分布式、开源、云原生和兼容性强等特点,帮助企业实时读写、处理和分析时序数据的同时降低长期存储成本。
- GreptimeCloud 可以为用户提供全托管的 DBaaS 服务,能够与可观测性、物联网等领域高度结合。
- GreptimeAI 是为 LLM 应用量身定制的可观测性解决方案。
- 车云一体解决方案是一款深入车企实际业务场景的时序数据库解决方案,解决了企业车辆数据呈几何倍数增长后的实际业务痛点。
GreptimeCloud 和 GreptimeAI 已正式公测,欢迎关注公众号或官网了解最新动态!对企业版 GreptimDB 感兴趣也欢迎联系小助手(微信搜索 greptime 添加小助手)。
GitHub: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。