ToB企服应用市场:ToB评测及商务社交产业平台

标题: 火山引擎 ByteHouse:只需 2 个方法,增强 ClickHouse 数据导入能力 [打印本页]

作者: 魏晓东    时间: 2023-11-25 12:53
标题: 火山引擎 ByteHouse:只需 2 个方法,增强 ClickHouse 数据导入能力
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群
 
作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础。
数据导入是衡量 OLAP 引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。作为一款 OLAP 引擎,火山引擎云原生数据仓库 ByteHouse 源于开源 ClickHouse,在字节跳动多年打磨下,提供更丰富的能力和更强性能,能为用户带来极速分析体验,支撑实时数据分析和海量离线数据分析,具备便捷的弹性扩缩容能力,极致的分析性能和丰富的企业级特性。
随着 ByteHouse 内外部用户规模不断扩大, 越来越多用户对数据导入提出更高的要求,这也为 ByteHouse 的数据导入能力带来了更大的挑战。
本篇文章来源于 ByteHouse 产品专家在火山引擎数智平台(VeDI)主办的“数智化转型背景下的火山引擎大数据技术揭秘”线下 Meeup 的演讲,将从 ByteHouse 数据库架构演进、增强 HaKafka 引擎实现方案、增强 Materialzed MySQL 实现方案、案例实践和未来展望四个部分展开分享。
ByteHouse 数据库的架构演进

作为一款分析型数据库,ByteHouse 已经应用在互联网、金融、汽车领域,帮助企业实现人群洞察、行为分析、 IOT 风控等场景的实时分析。
ByteHouse 的演进

ByteHouse 的架构

ByteHouse 架构分为分布式架构和云原生架构两种。分布式架构的主要特点就是单集群可以支持 2000 多个节点的“大兵团”;通过分布式的并行计算体现的高性能,能够充分利用每个节点的计算和存储资源;云原生实现了存算分离,计算资源通过容器化进行弹性和秒级的扩容,这对业务是无感知的。
从分布式架构来看,ByteHouse 具备 MPP 1.0 特点:
但 MPP 1.0 存在资源隔离、扩容等痛点,由此演进到云原生架构,即 MPP 2.0:其中存算分离通过结合 shared-everything 存储和 shared-nothing 计算层,避免了传统 MPP 架构中数据重新分配 (re-sharding) 的问题。
好处在于:
ByteHouse 技术优势

在增强型数据导入场景中,ByteHouse 核心优势体现在自研表引擎:
这里具体再介绍一下 ByteHouse 自研引擎的优势——与导入密切相关的表引擎。
首先,ByteHouse 提供的 HaMergeTree 方案能够降低 ZK 负载,提升可承载的数据量级。
 
其次,ByteHouse 提供的 HaMergeTree 方案能平衡读写性能。
 
增强 HaKafka 引擎实现方案

HaKafka 引擎架构介绍

社区版 Kafka 优势:由于社区版 ClickHouse 是一个分布式结构,其数据分布在多个 Shard 上,Kafka 引擎可以在多个 Shard 上去做并发的写入,而在同一个 Shard 内可以启动多线程做并发写入,并具备本地盘的极致的性能读写。
社区版 Kafka 不足:
 
HaKafka 引擎架构(分布式架构)

保持社区版本两级并发两大的优化点:
 
ByteHouse 增强 HaKafka 引擎核心功能实现

在备节点上起一个 stand by 的 consumer ,通过 ZK 来进行选组,选到的主节点进行消费,当主节点发生宕机或者无法进行服务时,在秒级之内切换到备节点上,让备节点继续消费。
假设现在 replica 1 因为故障宕机了,无法继续进行消费,那么 Z K 能在秒级内把 replica 2 选为 leader。 replica 2 随即会立即启动相同数量的消费者,启动之后会继续从 replica 1 的消费位置开始继续进行消费。

随着集群规模的增大,节点数越来越多的情况下,不可避免地遇到节点故障,这个时候就需要替换节点。
对于分布式架构,替换节点一个重要的操作就是拷贝数据,在拷贝数据的时候意味着新的节点的数据是不全的,如图示,示意图 replica 1 为新替换的节点,还处于数据拷贝的状态,即数据是不全,如果此时实施消费的 leader 起在了 replica 1,就意味着 最新的消费数据会写进 replica 1,但是它缺失一部分旧的数据。
而 replica 2 有旧的数据,它的最新数据还需要从 replica 1 进行拷贝,那这个时候下载之内没有一个副本上面的数据是完整的,所有的节点就不可能对外提供服务。
这时 HaKafka 会做强制限制,如果 replica 1 是一个新节点,且还在拷贝数据的状态,那么就会强制把 leader 切换成 replica 2,由 replica 2 继续去消费最新的数据,replica 1 保持继续拷贝数据,这样可以保证在节点替换的过程中至少有一个副本是能够正常提供服务。

不同于社区的 Memory Table 和底层存储绑定,ByteHouse 的 Memory Table 是和 Hakafka 绑定的,主要使用在有百列或者千列的大宽表的场景。
对于 ClickHouse 来说,每一次导入的写的文件的数量和列数是成正比的。如果列很多,但是每批次写入的数据量不大,这时每一次写入就会造成很多的碎片,这对于 IO 的消耗会比较高,写入的性能其实也会比较差。
针对这种情况,考虑使用 Memory Table,让写不直接落盘,每一次写先写到 Memory Table 中,攒到一定的批次或者到达一定的时间之后再一次性刷盘。
当数据写入 Memory Table 之后,就可以对外提供查询服务了,因为 memory table 是跟 Kafka 绑定的,在同一个下的内是唯一的。当查询来了之后,只需要路由到对应的消费节点下 the Memory Table,就能保证了数据查询的一致性。

分布式架构的痛点在于:
1.节点故障:字节的集群规模较大,每周/每天会遇到节点故障的问题,需要进行节点替换,是一个比较大的负担。
2.读写冲突问题:随着集群的接入的业务越来越多,数据量越来越大的情况下,每一个节点同时承担着查询和写入的操作,之间会有冲突。
3.扩容成本:唯一键的场景对数据分布要求非常严格,扩容在这种场景下很难支持,因为扩容之后 partition 的映射关系发生了变化。
云原生架构优点在于,存算分离、自动扩容、自动容错轻量级的扩缩容等,因为云原生支持事物,让我们可以将消费语义增强到 exactly once。
在云原生架构下的 Kafka 引擎是如何通过事务来实现 exactly once:

增强 Materialzed MySQL 实现方案

社区版 Materialzed MySQL 介绍

物化 MySQL 将 MySQL 的表映射到 ClickHouse 中, ClickHouse 服务会读取 binlog,并执行 DDL 和 DML 的请求,实现了这种基于实现了基于 MySQL binlog 的实时 CDC 同步。它的架构很简单,不依赖于数据同步工具,使用自身的资源就能将整个 MySQL 的数据库同步到 ClickHouse 中,并且时效性很好,因为实时同步的延时一般在秒级、毫秒级到秒级之间。
社区版本的这种物化 MySQL 在很大程度上去解决了 MySQL 数据库到 ClickHouse 之间的这种实时同步。在实际业务、实际场景中,遇到不少问题:
1.社区版本的物化 MySQL,它是不支持同步到分布式表,也不支持跳过 DDL,缺乏这些功能就很难将数据库的引擎应用到实际生产中。
2.社区版本的物化 MySQL 不支持在数据同步发生异常时进行辅助,发生异常的时候发起重新同步的命令,它没有同步的日志信息和没有同步的状态信息,缺少了这些信息会导致同步发生异常的时候,很难在短期内把这些任务重新启动。
基于这些问题和痛点, ByteHouse 在社区版本的物化 MySQL 的基础之上做了一些功能增强易用性,降低了运维成本,让数据的同步更加稳定。
ByteHouse 的物化 MySQL 结合了 HaUniqueMergeTree 表引擎:结合这样的表引擎之后,它就能够实现数据的实时去重能力,同时它能够支持分布式的能力,我们通过底层的中间的参数优化,比如 include tables、 exclude tables、 SKIP DDL 等等能够允许用户自定义同步的表的同步范围。
通过下 model 这样的一个参数,能够支持分布式表的同步,然后通过 Rethink 参数的设置支持将额外增加的表启动独立的数据同步任务去进行 CDC 同步,在出现异常的时候,我们也支持跳过这种不支持的 DDL 语句。另外,可以通过系统日志的抓取和展示进行可视化的运维。
ByteHouse 增强 Materialzed MySQL 核心功能实现

社区版的物化 MySQL 使用的是 ReplacingMergeTree,每一个同步任务都会将源端的 MySQL 数据库同步到 ClickHouse 的某一个节点上面,它不支持按照分片逻辑将数据分布到所有的节点,也无法利用 ClickHouse 整个集群的分布式计算和存储能力,所 ByteHouse 的物化 MySQL 支持分布式地同步利用。我们利用 HaUniqueMergeTree 表引擎,将每张表同步到对应的分布式节点上,充分利用集群的这种分布式计算能力,同时通过表引擎的实时 upsert 能力来实现快速地去重。

这里有三个对象, SYNC manager 是用来管理主 SYNC 线程和 Resync 线程,然后 SYNC task 和 resync task 各自管理各自的任务。比如说一个 MySQL 的库有 100 张表,我们选了 50 张表进行同步,所以在同步进行过程中,当 think task 同步到 binlog 的 position 位置,比如到 1000 的时候,用户修改了配置之后,它增加了 30 张表。增加 30 张表的时候, SYNC manager 就会启动 Resync task 去同步另外 30 张表,那这个时候 SYNC task 是继续执行的;RESYNC task 会从 position 0 开始,它先做全量的同步,然后再做增量的同步。所以当到达某一个阶段,比如说 sync task 跑到了 position 1500 的时候, resync task 跑到了 position 1490 的时候,这时 SYNC manager 就会去判断两者的误差,这个 position 的误差在一定的阈值之内,在一定阈值之内之后,它会将 SYNC task 停止 1 秒钟,将 RESYNC task 合并到 SYNC task 中。合并成功之后,这 80 张表就都会通过 SYNC task 继续同步,而 RESYNC task 这个任务就会被停止掉。这就是现在 RESYNC task 做了一个能力实现。

通过可视化的任务监控和任务启停异常的重启任务告警这些方式实现了物化 MySQL 的可视化易用性的极大提升。
案例实践与未来展望

案例一:短视频直播

该场景下的数据是批流一体写入,为了维护和管理抖音创作者的数据,并且面向这种业务运营和达人经营提供数据查询服务,需要将短视频和直播的实时数据和离线数据做融合,来构建 B 端的数据分析。
案例二:营销实时数据的监控

营销实时监控是对业务营销活动效果的实时查询和实时回收,希望通过这种实时回收来动态调整奖品的实时发放策略来做到最终的 IOR、ROI 的提升。这就要求数据实时写入、落盘延时要非常低,对数据处理的性能也有很高的要求。在数据传送上面需要保证数据传输的唯一性,以保证奖品不会重复发放,也不会丢失。
案例三:游戏广告的数据分析

游戏广告数据分析是在广告业务中会做一些人群圈选、广告投放、效果反馈等投放策略,用户行为预测这些全流程的统计和监控来实现广告营销过程的数字化,提升整个广告游戏投放的 ROI 。
未来战略:全链路和一体化

 
点击跳转 云原生数据仓库ByteHouse 了解更多

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4