阿里云ClickHouse企业版技术原理大揭秘

bashendan
发布于 2023-10-26 14:54
浏览
0收藏

01ClickHouse介绍

ClickHouse是一个全球流行的开源高性能、可扩展列式数据库技术,核心应用于在线分析处理(OLAP)业务,在DB-Engine全球数据库流行度排榜排名前列,逐年关注度增长迅猛。ClickHouse分析性能优异,在典型分析场景下,支持数十亿级数据行规模,90%查询在1秒内完成。这使得ClickHouse成为企业处理大规模数据,构建实时数仓的理想选择。微软、ebay、Uber等国内外大厂都在使用ClickHouse构建数据分析平台。

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区




02ClickHouse企业版介绍

阿里云在2020年发布了基于开源社区版本的云数据库ClickHouse社区兼容版,是全球领先的大规模提供全托管ClickHouse服务的云厂商,成熟稳定服务了包含互联网、游戏、电商、金融保险、汽车制造、媒体广告在内的数千家客户。2021年9月20日, ClickHouse项目创始人 Alexey 在 GitHub 宣布他们正式从 Yandex 独立,并成立一个公司:ClickHouse, Inc。2023年阿里云与ClickHouse, Inc达成独家的商业合作,联合研发阿里云数据库ClickHouse企业版(以下简称ClickHouse企业版),并于2023年8月末开启邀测。

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区

ClickHouse企业版对比社区版是里程碑的升级,从传统存算一体的架构全面升级为云原生架构,支持云原生按需弹性 Serverless能力,解决了长期困扰用户的集群扩展效率和平滑性问题。同时升级支持lightweight update&delete, 数据更新实时可见,且执行成本更低,效率更高。本文将详细揭秘ClickHouse企业版的技术实现原理。

03ClickHouse企业版云原生架构

ClickHouse企业版采用完全不同与开源社区版本的云原生新架构,针对云环境做了全面适配。新架构基于存储和计算分离的架构基础,采用对象存储数据实现Share Storage共享存储,所有ClickHouse Server节点都可以访问相同的全局物理数据, 单个Server节点实际上是单个没有限制分片的Replica节点,节点之间访问同一份数据副本。

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区


04ClickHouse企业版引擎升级

MergeTree系列的表引擎是ClickHouse中的主要表引擎。它们负责存储插入的数据,在后台进行数据合并,根据特定的引擎进行数据转换等操作。企业版新推出 SharedMergeTree 引擎加入到MergeTree引擎大家庭,而企业版能够支持云原生架构,也核心依赖SharedMergeTree引擎。SharedMergeTree引擎是商业化引擎,仅在企业版提供,在开源社区版不支持。企业版内核相较于开源社区版的核心能力差异如下所示:

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区


开源ReplicatedMergeTree引擎


大多数MergeTree家族中的表都支持自动的数据复制,并通过ReplicatedMergeTree 表引擎的复制机制实现。在社区版Share-nothing架构的ClickHouse集群中,通过ReplicatedMergeTree进行复制以实现数据高可用,并通过分片实现集群横向扩展。阿里云ClickHouse社区兼容版也正是基于这一内核特性实现的高可用和扩展。而 ClickHouse企业版采用了一种新方法,基于SharedMergeTree构建了云原生数据库服务。


云原生SharedMergeTree引擎


SharedMergeTree表引擎是ClickHouse内核ReplicatedMergeTree表引擎的更高效的替代品,专为云原生数据处理而设计和优化。我们将深入了解这个新表引擎,解释其优势,并通过基准测试展示其效率。同时当前正在引入轻量级更新Lightweight Update,与SharedMergeTree形成协同效应。


▶︎ 对象存储上的数据可用性


ClickHouse企业版将所有数据存储在对象存储中,所以不需要在不同服务器上显式地创建数据的物理副本。对象存储本身实现确保存储具有高可用性和容错性。需要注意的是,尽管访问对象存储较慢,但ClickHouse企业版服务具有多层读写缓存,它专为在对象存储上读写而设计,以提供快速的查询结果。对象存储虽然访问延迟比磁盘较大,但具有高并发吞吐量和大的聚合带宽。ClickHouse企业版通过利用多I/O线程来访问对象存储,并通过异步预读取数据来改善这一点。


▶︎ 自动集群扩展


与开源版本使用分片来扩展集群不同,ClickHouse企业版让用户通过简单地增加计算节点的规格和数量来增加 INSERT和SELECT的并行处理能力。请注意,ClickHouse企业版计算节点实际上是单分片的多个副本。这些节点不是包含相同数据的本地副本节点,而是可以访问存储在对象存储中全量相同的数据的无状态差异节点。计算节点规格和数量可以适应工作负载,进行对应的升降配和水平扩缩容,具体步骤描述如下图所示:

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区

通过①垂直升配操作和②垂直缩容操作,我们可以更改节点的规格(CPU和内存)。而通过③水平扩展,我们可以增加计算节点的数量。而无需进行任何物理Resharding或数据的Rebalancing,我们可以自由地添加或删除节点。这种无数据移动和搬迁支持水平集群扩展方法,就需要ClickHouse企业版能够提供支持节点访问相同共享数据的表引擎。

05ReplicatedMergeTree的挑战

ReplicatedMergeTree表引擎并不适用于ClickHouse企业版的预期架构,因为其复制机制旨在在少量的节点上创建数据的物理副本。而ClickHouse企业版需要一个支持在对象存储之上运行大量计算服务节点的表引擎。


显式的数据复制


首先我们解释一下ReplicatedMergeTree表引擎的复制机制。该引擎使用ClickHouse Keeper(也称为“Keeper”)作为协调系统,通过复制日志方式进行数据复制。Keeper充当复制过程特定元数据和表结构的集中式存储,以及分布式操作的一致性协调系统。Keeper确保为Part顺序地分配连续的块编号,将merge和mutation操作分配给特定的replica。

下图概述了一个具有3个replica节点的shared-nothing架构的ClickHouse集群,并显示了ReplicatedMergeTree表引擎的数据复制机制:

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区

当①Server-1接收到插入查询时,②Server-1在其本地磁盘上创建一个包含插入数据的新Part。③通过复制日志,其他节点(Server-2、Server-3)被告知Server-1上存在一个新Part。在④处,其他server独立地从server-1下载(“获取”)该Part到自己的本地文件系统。创建或接收Part后,三个节点还会在Keeper中更新元数据,元数据用以描述Part文件信息。

请注意,我们仅展示了如何复制新创建的Part。Part合并(和mutation)也以类似的方式复制。如果一个节点决定合并一组Parts,那么其他节点将在其本地Parts副本上自动执行相同的合并操作。

在本地存储完全丢失或添加新副本时,ReplicatedMergeTree从已有的副本克隆数据。

ClickHouse企业版使用持久性更好的对象存储来实现数据可用性,所以不需要ReplicatedMergeTree的显式数据复制功能。


依赖sharding进行集群扩展


shared-nothing架构下的ClickHouse集群用户可以将replication与sharding相结合,来实现高可用和水平扩展。表中数据以分片的形式分布在多个节点上,每个分片通常有2个或3个副本,以确保存储和数据可用性。通过添加更多分片,可以增加数据写入和查询处理的并行能力。而ClickHouse企业版不需要使用分片进行集群扩展,因为所有数据都存储在共享的对象存储中,只需通过添加额外的节点来增加并行数据处理能力。

06SharedMergeTree升级


独立SharedMergeTree优点


ClickHouse企业版实现了一个名为SharedMergeTree的表引擎——专为在共享存储上工作而设计。SharedMergeTree是云原生方式,具有如下优点:

1. MergeTree 代码更加简单易维护;

2. 支持垂直和水平自动扩展;

3. 为我们的云用户提供未来的功能和改进。如更高的一致性保证、更好的耐用性、基于时间点数据恢复等。


SharedMergeTree引擎下的集群扩展原理


在这里,我们简要介绍SharedMergeTree如何支持ClickHouse企业版自动进行集群扩展。提醒一下:ClickHouse企业版计算节点是具有访问共享存储的计算单元,其规格和数量可以更改。基于此机制,SharedMergeTree完全将业务数据和元数据的存储与计算节点分离,并使用Keeper的接口去读取、写入和修改共享元数据。每个计算节点都有一个存储元数据的本地缓存,并通过订阅机制自动获取数据更改的通知。下图描述了如何使用SharedMergeTree将新服务器添加到集群中:

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区

1. 当Server-3添加到集群时,这个新Server ①订阅Keeper中的元数据更改信息并将当前Parts的元数据获取到其本地缓存中。这不需要任何锁机制;

2. ②新Server基本上只需说:“我在这里。请随时通知我所有数据更改”。

3. ③新添加的Server-3几乎可以立即参与数据处理,因为它通过从Keeper中只获取必要的元数据信息,找到有哪些数据以及在共享存储中的什么位置。


SharedMergeTree引擎下的数据一致性原理


下图描述所有Server节点如何知道新插入的数据,来保证查询数据一致性:

阿里云ClickHouse企业版技术原理大揭秘-鸿蒙开发者社区

① Server-1接收到插入查询

② Server-1将写入的数据以Part的形式写入共享存储。

③ Server-1还将关于该部分的信息存储在其本地缓存和Keeper中(例如,哪些文件属于该Part,以及与文件对应的块位于共享存储中的位置)

④ ClickHouse向查询的发送者确认插入成功。其他节点(Server-2、Server-3)通过 Keeper 的订阅机制⑤自动得到存储层中存在新数据的通知,并将更新的元数据提取到其本地缓存中。

请注意,在步骤④之后,插入的数据是持久的。即使Server-1或其他任何节点崩溃,Part都存储在高可用的存储中,元数据存储在Keeper中(Keeper具有至少3个Keeper节点的高可用设置)

从集群中移除节点也是一个简单且快速的操作。为了优雅地移除,相关节点只需从 Keeper中注销,以便处理进行中的分布式查询时不会出现缺少服务器的警告。


文章转载自公众号:阿里云瑶池数据库

分类
标签
已于2023-10-26 14:57:41修改
收藏
回复
举报
回复
    相关推荐