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 后并响应请求。那么我们有以下关系:
完整表分区的数据 = 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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何解决由触发器导致 MySQL 内存溢出?
由触发器导致得 OOM 案例分析过程和解决方式。 作者:龚唐杰,爱可生 DBA 团队成员,主要负责 MySQL 技术支持,擅长 MySQL、PG、国产数据库。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文约 1500 字,预计阅读需要 5 分钟。 问题现象 一台从库服务器的内存使用率持续上升,最终导致 MySQL 服务被 kill 了。 内存监控视图如下: 从图中可以看出,在 00:00 左右触发了 kill,然后又被 mysqld_safe 进程拉起,然后内存又会持续上升。 排查过程 基本信息 数据库版本:MySQL 5.7.32 操作系统版本:Ubuntu 20.04 主机配置:8C64GB innodb_buffer_pool_size:8G 由于用户环境未打开内存相关的监控,所以在 my.cnf 配置文件中配置如下: performance-schema-instrument = 'memory/% = COUNTED' 打开内存监控等待运行一段时间后,相关视图查询如下: 从上述截图可以看到,MySQL 的 buffer pool 大小分配...
- 下一篇
【店滴云】增加关注公众号登录后台管理系统
【店滴云】增加关注公众号登录后台管理系统 店滴云,让经营场所,更智能。围绕茶室、酒店、健身房、公寓、出租房等经营性场所进行物联网改造。同时支持多种物联网通信协议,开放智能门锁,智能开关,智能手环的sdk供开发者使用。 1、增加微信公众号通过第三方平台生成二维码,包括临时和永久二维码 2、增加扫码绑定账号和扫码关注公众号登录系统功能 3、增加为微信公众号中直接通过网页授权登录系统的功能
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS6,CentOS7官方镜像安装Oracle11G