直播回顾|MatrixGate 高性能数据加载组件实战教程

2022-08-19 · 王志强 / MatrixGate 高性能组件设计与开发
#活动#活动回顾

MatrixDB 直播教程第二期,介绍了高性能数据加载工具 MatrixGate,给大家精剪了回放视频,可以在线回看直播啦!

这一期我们来聊聊 MatrixGate 数据加载的独特魅力

- 本条视频为直播回放节选 -

本文主要分享 4 个内容:

  1. MatrixDB 挑战和需求
  2. MatrixGate 相关原理
  3. 演示 MatrixGate 如何进行高性能数据加载
  4. 未来展望

01 MatrixDB 挑战和需求

MatrixDB 作为一款分布式、高性能,需要处理超大规模数据的数据库产品,在数据加载的过程中难免会遇到一些挑战和需求,对数据加载的速度吞吐量实时性要求都非常高。

在客户复杂的业务场景下,我们对数据加载的普遍需求是,将不同类型的数据源数据和不同格式的数据都要能够兼容,统一加载到 MatrixDB 里。

产品的易用性稳定性也非常重要,易用性做的不够好,就不是合格的产品,所以在易用性这块我们也是孜孜不倦的追求;稳定性测试也是非常严苛,每一次版本 release 都要保证以年为单位的稳定运行,并能支持客户关键的业务场景。

可以总结出,MatrixDB 在兼容、易用性、稳定性、性能和功能等诸多方面持续迭代增强与优化升级。

MatrixDB 数据加载全景图

从 MatrixDB 全景图可以看出,通过各种不同手段和方式将不同的数据源载入到 MatrixDB,比如 FDW ,将 MySQL / PostgreSQL / MongoDB 的数据载入到 MatrixDB 中,还可以使用 PXF 将来自 S3 / Hive / HBase 等不同的数据源载入。

大家经常使用到的 JDBC / ODBC / libpq,比如通用 Java / Python / Golang / C / C++ 方式编程,然后对数据库进行读写,且可以通过 MatrixGate 将 Kafka、文件、 Greenplum 等不同形式的数据导入到 MatrixDB 中。

02 MatrixGate 相关原理

MatrixGate 主要特点在于它是一个高并发加载组件,采用一个多节点并行的写入机制,加载性能远高于原生的 Insert 语句。在大规模的生产环境下,全速写入速度可以达到 1 亿点每秒,比 Insert 语域加载速度要快好几个数量级。

通过上图我们可以看到 MatrixGate 在整个数据加载环节中,扮演了一个后端数据库和前端数据采集系统的一个“中间人”角色。

在后端,MatrixGate 通过内部传输我们自定义的一个协议,和多个 Segment 之间直接建立多个并行的连接,数据就可以并行的写入到多个数据节点上;在前端,MatrixGate 的进程作为一个 HTTP Server 的服务,可以同时支持上万个 HTTP Client 并发的连接,每个 Client 可以实时将采集到的数据发送到 MatrixGate 中。

MatrixGate 内部,我们实现了一个非常精妙的微批流式控制,保证每一个 HTTP Client 发送的数据,在以秒级到毫秒级的延迟就可以写入到数据库并行落盘,数据一旦写入完成之后,就可以立即可查,并保证满足了 ACID 强一致性。数据在整个 MatrixGate 中是没有落盘操作的,所以说有着非常高的吞吐量和性能。

总结下来,MatrixGate 主要特点具有以下 4 个方面:

  1. MatrixGate 和所有的数据节点直接相连,不走 master ,就不会有单点瓶颈。在并行流式数据加载的情况下,可以保证高性能、实时性和稳定性。

  2. 支持多种不同的数据格式,如:CSV / Text / JSON。

  3. 支持多种不同格式数据源,通过 HTTP / Kafka / Stdin / Greenplum 或者 MatrixDB 等不同的数据源,直接通过 MatrixGate 把数据导入到 MatrixDB 中。

  4. MatrixGate 轻松简单易上手,在接下来的演示中,大家可以有一个更直观的体会。

03 MatrixGate 操作演示

这次演示,我在云上的虚拟机搭建一个集群,集群的配置非常一般。

MatrixDB 集群的配置如上,同时,我还搭建了一个 Kafka 单机节点,便于演示将 Kafka 数据导入到 MatrixDB 中。

为什么会使用这样非常低配置的集群呢?

目的是让大家能够更加直观的感受到,即使在如此低的配置集群上,MatrixGate 依然具有非常强悍的性能。如果说在生产环境下,随着集群规模的扩张,性能的提升,那么 MatrixGate 的加载性能还会数量级的提升。

这次我操作了 4 种数据源,依次分别是:HTTP,Kafka,Stdin,Transfer(大家可以依需求查看相应视频~~)

MatrixGate —— HTTP 载入数据

视频:MatrixGate —— HTTP 载入数据

MatrixGate 作为 HTTP Server,支持多个 HTTP Client 并发的数据写入。通过视频可以看出 2 分钟的时间,写入 1000 万数据,对方只是一个单台的服务器在向我们发数据;如果是多台服务器的话,MatrixGate 连接到一个更大的集群上,性能也会成倍的在扩展。

MatrixGate —— 加载 Kafka 数据

视频:MatrixGate —— 加载 Kafka 数据

Kafka 是一个普遍使用的消息队列,应用非常广泛,如何把 Kafka 的数据直接写入到 MatrixDB 中?

在 MatrixGate 中,具体的逻辑就是 MatrixGate 内部会针对每一个 Topic 下的每一个 Partition,我们都会实现一个对应的协程。

这个协程就相当于扮演了当前 Partition 的一个消费者的角色,源源不断的从 Partition 手中拉取对应的消息,然后并行的写入到数据节点中。

当前支持2种数据类型:CSV,JSON。CSV 结构化数据,我们从 Kafka 中获取后,可以直接写入到 MatrixDB 中,JSON 这种非结构化数据,还需要做一个转换。

这种转换通常情况下由客户的业务开发来完成,但这样就相当于客户要做更多的工作。为了减轻用户的工作量,MatrixGate 内部也支持从 JSON 到 CSV 的转换,通过简单的界面的配置就可以实现,轻松的就可以把数据直接导入到数据库中。

接下来我们演示如何通过 MatrixGate 来消费 Kafka 中 CSV 数据,可以看到在 27 秒左右的时间,340 行数据就已经写入到数据库中。

MatrixGate —— Stdin 载入数据

视频:MatrixGate —— Stdin 载入数据

通过加载文件的方式,比如,我要将一个很大的 CSV 文件直接加载到数据库中,不需要编写程序来处理这个文件。这个时候有没有更轻松简单的方式?

MatrixGate 来告诉你,是有的,而且非常的简单!

mxgated \
--source stdin \
--db-database demo \
--db-master-host 127.0.0.1 \
--db-master-port 5432 \
--db-user mxadmin \
--time-format unix-nano \
--delimiter "|" \
--target csvtable \
--parallel 2 < data.csv

通过这条命令,将文件打开之后,通过管道的方式传给 MatrixGate,告诉 Gate 我要通过标准输入的方式,传到 Gate 然后导入到数据库中。同时,我们要提供我们的目标数据库,还有对应的表名。

更多 MatriGate 命令,可以查看:官方技术文档

1.8GB 数据大概在 500 万行左右,也是在几秒钟的时间内可以写入完成。通过日志可以简单的看到一个统计,1.8GB 的数据花了 45 秒的时间,平均每秒钟大概写入 10 万行数据。

文件大小没有限制,多大的文件都可以写进去。一行简单的命令,就可以将一个大文件数据全部加载到 MatrixDB 中。

MatrixGate —— Transfer 模式

视频:MatrixGate —— Stdin 载入数据

经常有用户问到,已经有一个 Greenplum 集群,希望可以把数据库中的数据导入到 MatrixDB 中。如果是通过 MatrixGate,也是一条简单的指令就可以轻松的做到。

mxgate --source transfer \
         --src-host 172.31.41.7 \
         --src-port 5432 \
         --src-db postgres \
         --src-user ec2-user \
         --src-password abc \
         --src-schema public \
         --src-table trans_ao \
         --compress "gzip" \
         --port-base 9129 \
         --local-ip 172.31.33.128 \
         --db-database ttt \
         --target public.trans_ao \
         --format text \
         --time-format raw \
         --use-auto-increment=false

演示总共传送了 13 GB 的数据,大概是 15 万每秒的效果,因为 Greenplum 集群也是一个分布式集群,所以说性能马上就上来了。

MatrixGate —— JSON Transform

视频:MatrixGate —— JSON Transform

最后一个来演示如何通过 MatrixGate 向消费 Kafka 中的 JSON 数据,JSON 数据长什么样?

实现这个功能,我们不需要去写那么多复杂的配置文件,甚至可以更简单一些,不需要技术,使用我们潜心研发的一个提升易用性的产品 —— Matrix UI,就可以轻松连接到 Kafka 上,大家可以参考视频上的操作步骤!

技术演示分享就到这里,接下来给大家讲一讲 MatrixGate 的下一步方向。

04 未来展望

很多小伙伴提到,在数据处理方面的工作量是非常大的事情,上面演示的操作中也看到,不管是通过 HTTP 或是 Kafka 写入到数据库中,写入性能实际上是有差异的。过程中,用户如果亲自来控制每一批写多少数据,大概多长时间提交一批,会导致不同的用户写出来的生产程序性能是不一样的。

为了将更简单、更实用的工具交给用户,把更多复杂度留给我们自己,用户只需要 focus 在业务上。

随着接下来即将发布的 MatrixDB 5.0,我们会提供一个 SDK,优先支持 Java,基于 Java 我们将非业务相关的数据处理代码都封装在 SDK 中,用户只需要调用一个简单的 API 就可以把数据轻松的、高性能的写入到 MatrixDB 中。

Java 版本发布之后,后续我们还会提供 Go、Python 等更多不同语言的支持,大家敬请期待。