ClickHouse进阶|如何自研一款企业级高性能网关组件?

news2024/12/25 8:52:37

使用原生ClickHouse集群进行节点数据查询和写入时,离不开第三方开源网关组件chproxy支持。但由于chproxy缺少TCP协议支持,导致性能、查询能力等受限。这也成为困扰众多ClickHouse开发者的一大难题。那么,究竟应该如何突破?本文将揭秘火山引擎ByteHouse企业版自研网关组件如何解决以上问题。

一、引言

ClickHouse是一款广受欢迎且应用广泛的分析型数据库。它通过列式存储和向量化处理等成熟的优化手段,配合高质量的工程化,实现了极高的性能表现。在许多业务场景下,

ClickHouse展现出了非常强悍的性能表现,因此吸引了大量实际生产使用用户。在使用原生ClickHouse集群时,用户往往通过直连节点进行数据查询或写入。然而,由于缺少中间层进行负载均衡,在某些情况下会导致分片节点上的数据写入不均衡。同时,由于客户端配置ClickHouse数据源时指定了连接的具体节点信息,查询请求也会集中于部分节点。这样一来,如果某个节点宕机,就会引发单点故障。

为了解决这些问题,ClickHouse官方文档推荐了一些第三方开源网关组件,如chproxy和KittenHouse等。其中,chproxy是应用最广泛的组件之一,具备丰富的功能。它支持灵活的用户和集群映射配置,代理HTTP类型的请求。然而,目前开源社区还没有提供在TCP协议基础上支持的网关组件。由于TCP协议是ClickHouse集群间默认的通信协议,也是ClickHouse客户端和许多高性能第三方驱动程序所默认选择的查询协议,缺少对TCP协议的支持使得使用上存在很大限制。

ByteHouse企业版是基于开源ClickHouse的企业级分析型数据库,支持用户交互式分析PB级别的数据,通过多种自研表引擎,灵活支持各类数据分析和应用。为解决原生ClickHouse集群存在的一些问题,ByteHouse企业版试图提供一个高性能的网关组件。同时,这也将进一步释放ByteHouse强大的查询引擎能力,为用户提供极致的使用体验。

本文将主要介绍火山引擎ByteHouse企业版网关组件的功能和特性、ClickHouse不同的查询协议对比、ByteHouse网关与开源chproxy的功能对比。

二、ByteHouse网关组件的功能

2.1 查询路由与负载均衡

ByteHouse企业版查询网关同时支持HTTP协议和TCP协议的查询请求,最大程度上兼容了各种社区语言的Driver,例如ClickHouse GO、ClickHouse JDBC等,同时也支持诸如DataGrip、DBeaver等数据库管理工具的使用。例:企业版查询网关架构
图片
监听层,同时支持HTTP和TCP两种Protocol,接收请求。流量控制层,记录并限制请求的频率和并发数。分发层,根据配置中的集群信息和状态,负载均衡算法以及用户等信息,将请求发送至对应clickhouse节点健康检查器,通过发送探针请求的方式,时刻关注每个节点的健康状态以及响应灵敏度,避免将请求转发至不健康节点

2.2 打通ByteHouse控制面元数据

企业版网关通过与控制面元数据的连接,使得网关用户可以直接在控制面进行创建和授权。同时,网关读取控制面集群元数据,获取ByteHouse集群节点的信息。ByteHouse控制面支持多集群下的管控,因此对于企业版网关来说也需要支持多集群模式。与chproxy不同的是,企业版网关可以直接读取控制面用户集群授权元数据。对于可自动推断对应集群的用户,网关可以实现自动代理请求到对应的集群,更加灵活和便捷。

2.3 监控告警

火山引擎ByteHouse企业版查询网关与控制面的深度集成也体现在监控告警方面。ByteHouse企业版控制面监控组件可以通过收集网关的查询指标 metrics,支持在控制面配置来自网关指标的告警规则。例:企业版网关监控告警配置界面
图片

2.4 其他功能

通过连接网关组件,ByteHouse为用户提供了更多的灵活性,基于代理层能够实现许多原来不便于实现的能力和管控。

因此,基于服务端代理模式的ByteHouse企业版查询网关还拓展实现了其他更多功能,诸如下发指定节点和全部节点。其中当用户使用社区ClickHouse Client连接ByteHouse企业版查询网关可支持直接通过SQL语句来切换连接的ClickHouse节点设置网关连接指定节点 示例:clickhouse client --host --user --password

ByteHouse Gateway 😃 set custom_gw_force_ck_node='<node_ip>'设置网关在全部ClickHouse节点执行SQL 示例:clickhouse client --host .bytehouse-ce.volces.com --user --password

ByteHouse Gateway 😃 set custom_gw_force_all_nodes=true
ByteHouse Gateway 😃 CREATE TABLE default.test(id Int64,info String COMMENT ‘1’) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity = 8192

CREATE TABLE default.test
(
id Int64,
info String COMMENT ‘1’
)
ENGINE = MergeTree
ORDER BY id
SETTINGS index_granularity = 8192

ByteHouse企业版查询网关为了避免执行查询时客户端和服务端连接中断导致无法获取查询结果,实现了异步查询来增强ByteHouse的查询能力。

对于HTTP协议基础的查询,可以通过在Header中添加X-Async-Query即可使用示例:curl --location --request POST ‘http://:8123/?user=<user_name>&password=&query_id=’
–header ‘X-Async-Query: 1’
–data-raw ‘show tables FORMAT JSON;’

Query In Progress
HTTP Header: X-Async-Query: running

Query Finished
HTTP Header: X-Spend-Time: 100 (milliseconds)

三、解码ClickHouse查询协议

为了更好地了解ByteHouse企业版查询网关,首先需要深入探究ClickHouse所提供的查询协议和接口。了解ClickHouse服务端如何处理客户端请求,有助于我们理解如何构建高性能的查询网关。

在与ClickHouse服务端通信时,客户端使用的查询协议主要有两种。一种基于HTTP协议的查询协议,另一种基于TCP(Native)协议的查询协议。HTTP协议通用性较强,在任何平台或编程语言中使用HTTP Client都可以调用ClickHouse的HTTP API进行查询和数据写入。而TCP协议则具有更少的额外开销,通过在Socket连接上自定义查询协议和优化的数据类型序列化过程,避免了HTTP七层协议带来的不必要的网络IO开销,并且原生支持session。下面简要介绍这两种协议的不同特点。

3.1 ClickHouse HTTP协议的特点

ClickHouse服务端默认使用8123端口提供HTTP API供客户端进行查询和数据写入操作。在设计和实现上,ClickHouse为HTTP协议查询提供了很大的灵活性。例如,Query Settings可以放置在HTTP Query Parameters中,查询SQL可以放在GET请求的query参数中或者POST请求body里,甚至分割开放置在两部分中也是允许的。以下是一些例子:$ echo ‘SELECT 1’ | curl ‘http://localhost:8123/’ --data-binary @-
1

$ echo ‘SELECT 1’ | curl ‘http://localhost:8123/?query=’ --data-binary @-
1

$ echo ‘1’ | curl ‘http://localhost:8123/?query=SELECT’ --data-binary @-
1ClickHouse本身也提供了一个可交互的前端页面,通过浏览器访问,用户可以直接在Web页面上进行ClickHouse数据库的查询操作。
图片
HTTP协议是无状态的,因此在使用session时需要在参数中添加session_id。通过设置session id,ClickHouse服务端能够确定请求属于哪个session。对于带有session id参数的请求,同时只能有一条SQL语句正在执行,并且不能跨节点设置session。因此,对于查询网关来说,需要将带有session id参数的HTTP Query请求转发到同一台ClickHouse节点上,以确保session生效。

3.2 ClickHouse TCP协议的特点

ClickHouse TCP协议是ClickHouse Client和ClickHouse服务端之间默认的连接协议,也是用于ClickHouse节点间通信的协议格式。相较于HTTP协议,它具有更少的额外网络IO开销,因此效率更高。但是,由于它是基于TCP连接底层的二进制数据流编解码,因此实现上相对复杂,需要考虑各种数据类型如何编解码以更高效地进行传输。

例如,当Client需要发送查询请求时,它会将查询语句和查询参数转换为ClickHouse TCP协议格式的字节流,并将其通过Socket连接发送到ClickHouse服务端。服务端会解析字节流并执行查询操作,最终将结果以相同的协议格式返回给Client。在这个过程中,需要考虑如何对各种数据类型进行编解码,以确保传输效率和数据准确性。

总之,ClickHouse TCP协议虽然实现上相对复杂,但由于具有更高的效率和更少的网络IO开销,因此在高负载环境下使用它可以提高系统的性能和吞吐量。例:Client与Server基于Socket传输字节流通信
图片
当Client端与ClickHouse Server端建立tcp连接后,Client会发送一个Client Hello数据块给Server。这个数据块包含了Client的版本信息以及用于身份验证的信息等。Server在收到来自Client的Hello数据块后,会返回一个Server Hello数据块给Client,其中包含Server的版本信息以及一些其他的配置信息。这些信息可以用于确定Client和Server之间使用哪个协议版本以及哪些功能。一旦Client和Server之间成功建立了连接并且进行了协议交换,Client就可以开始发送查询请求到Server了。这些查询请求可以包括SELECT、INSERT、ALTER等语句,同时也可以包含一些参数和设置来控制查询的行为。Server会解析这些请求并且返回结果给Client。在整个过程中,Client和Server之间通过tcp连接来传输数据。例:TCP协议 Client Hello数据块格式
图片
许多语言ClickHouse Driver通过支持TCP Native协议提高读写性能,例如社区 ClickHouse Native JDBCclickhouse-go官方JDBC Driver由于ClickHouse TCP协议天然具有session状态,不同于HTTP只能在查询结束才能返回查询结果不同,TCP协议允许ClickHouse服务端将查询进度及时返回给Client。[图片]
图片
例:TCP协议 ClickHouse服务端返回给Client的几种不同类型的数据块
图片

3.3 探索ClickHouse批量写入

由于ClickHouse引擎底层依赖LSM数据结构进行数据存储,因此它具有独特的引擎特点。为了充分利用这些特点,ClickHouse推荐以批量的形式进行数据写入,以提高写入的效率并避免产生大量细碎的part文件。因此,在实现上,HTTP和TCP协议都支持批量插入,但在底层实现上存在一些区别。HTTP协议支持将批量写入的行数据以各种不同的格式放在HTTP Body中,并可以通过压缩来提高数据写入的效率。例:$ echo -ne ‘10\n11\n12\n’ | curl ‘http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20TabSeparated’ --data-binary @-而TCP协议支持发送多个数据块来避免重复提供写入效率,从图中可以看出Client发送给Server的data类型数据块可以很大(受max_block_size参数约束,默认值为65505)例:TCP协议发起batch insert过程
图片
例:TCP协议 Data数据块格式
图片
例:TCP协议 Column结构体格式
图片
就TCP协议而言,在进行batch insert时,插入的数据以整列的形式进行传输。这种方式不仅有利于数据在传输过程中得到更高效的压缩,而且由于自定义了数据类型的序列化机制,所以在读写过程中不需要插入分隔符,直接读取或写入定长的字节数组即可,从而大大提高了IO效率。

相比之下,HTTP协议下的batch insert需要通过FORMAT来分割行数据进行写入。同时,数据以整行传输不利于压缩,这也是HTTP协议相较于TCP协议下的batch insert效率较低的一个原因。

四、与开源项目chproxy的差异

4.1 功能比较

火山引擎ByteHouse企业版查询网关与 chproxy 差异对比:
图片

4.2 性能的比较

在查询性能上,由于用户可以通过使用ClickHouse TCP协议连接ByteHouse网关,因此拥有比chproxy更快的性能表现。特别是在应对批量数据写入batch insert的场景下,使用ByteHouse网关以TCP协议连接有着更高的效率。参考ClickHouse Native JDBC驱动做了对HTTP、TCP协议性能测试基础测试https://github.com/housepower/ClickHouse-Native-JDBC/blob/master/docs/dev/benchmark.md

4.3 使用体验的比较

  1. 开箱即用
    免二次配置对于用户使用体验来说,ByteHouse网关由于和ByteHouse企业版深度集成,做到了开箱即用。避免了chproxy需要手工在机器上维护yaml配置文件的繁琐。同时由于有了与控制面集群元数据的打通,因此集群运维操作例如节点替换、水平扩容操作,不需要更新网关配置。
  2. 用户模型对齐
    ClickHouse由于chproxy定义了自己的网关用户与实际ClickHouse用户不一致,因此无法复用ClickHouse的RBAC功能。而ByteHouse网关用户元数据与控制面一致,在控制面创建和授权的用户可以直接连接ByteHouse网关进行连接和查询。
  3. 切换成本低
    对比chproxy,对于原来使用ClickHouse Go、ClickHouse Native JDBC等组件连接ClickHouse的用户来说,可以直接连接ByteHouse网关来无缝切换到ByteHouse,避免了因为需要切换协议(TCP -> HTTP)而改变客户端Driver的问题。
  4. 监控告警集成
    集成ByteHouse网关与控制面集成了监控指标、告警规则,因此使用ByteHouse网关更易于监控,并配置相应告警。

五、总结

本文介绍了ByteHouse企业版查询网关组件的功能和特性。并探究了ClickHouse查询协议,通过解析ClickHouse查询协议和数据类型,我们构建了能够同时代理ClickHouse两种不同查询协议的网关proxy组件,以进一步提升整个ByteHouse的使用体验和可用性。并对比了ByteHouse企业版查询网关与社区chproxy网关的差别。

六、未来展望

ByteHouse企业版查询网关将持续迭代,不断完善功能,提升查询体验。在安全性方面,网关将支持数据加密来提高客户端在公网连接时的数据安全性,避免在引擎节点上进行TLS卸载,同时提升查询性能。查询网关将配合ByteHouse企业版的水平和垂直扩缩容能力,在网关层进一步优化,实现对Client无感知的运维动作。当控制面进行运维动作时,网关可以分流请求避免请求落到指定节点上。网关像sidecar一样工作,使控制面的运维操作更加智能。在监控方面,网关将通过接入ByteHouse Parser在网关层解析SQL语句,实现对集群、库、表,甚至字段的SQL执行统计,并深度整合到控制面库表信息和健康度功能上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中撤销的快捷键

Python中撤销的快捷键 在编程中&#xff0c;我们经常需要进行调试&#xff0c;不可避免地会出现一些错误&#xff0c;这时候撤销 (Undo) 功能就显得尤为重要。在 Python 中&#xff0c;我们可以使用一些快捷键来快速撤销&#xff0c;本文将会介绍这些快捷键的使用以及使用它们…

chatgpt赋能python:Python中的字符提取:从基础到高级

Python中的字符提取&#xff1a;从基础到高级 在使用Python进行文本处理和数据挖掘时&#xff0c;我们经常需要从字符串中提取特定的字符或子串。本文将介绍Python中的常用字符串提取方法&#xff0c;包括基础的字符串操作、正则表达式和第三方库等高级方法。 基础字符串操作…

二叉树中堆的实现

完全二叉树 满二叉树&#xff1a;二叉树每个节点的度都达到最大值&#xff08;2&#xff09;&#xff0c;由此可有等比求和计算出节点总数&#xff1a;2^k-1 完全二叉树&#xff1a;除了最后一层。前面节点的度都满了&#xff0c;最后一层可以不满&#xff0c;但是必须从左至右…

用时序数据库 DolphinDB 实现地震波形的分析预警

1. 绪论 波形数据的存储与实时流处理是地震预警、地震速报、地震烈度速报、震源机制解等数字地震台网综合处理系统的前提&#xff0c;合理的存储方案与高效的实时流处理架构能极大地节约存储成本、降低响应延时、方便震源分析。 本篇教程会为有该方面需求的客户提供一个基于 …

如何在不丢失格式的情况下将 Excel 转换为 PDF?

Microsoft Excel 因其专业的数据或信息显示能力而被广泛采用。但是&#xff0c;它在兼容性上有一个恼人的缺点。 首先&#xff0c;Excel只能在Windows和MacOS上使用&#xff0c;Linux或其他操作系统的用户将无法使用&#xff1b;其次&#xff0c;即使您有一个可以打开和阅读 E…

PERMA幸福模型

PERMA幸福模型 由“积极心理学之父”马丁塞利格曼&#xff08;Martin Seligman&#xff09;在《持续的幸福 》一书中提出。 模型介绍 PERMA指的是创造充实、快乐和有意义的生活所必需的五大要素&#xff0c;它们是: 正向情绪Positive emotions 积极情绪是快乐人生的一个重要…

三种不同的存储芯片性能比较

为了进行性能比较&#xff0c;使用了三种不同的存储芯片&#xff0c;即Everspin EM064LX 64Mib STT‐MRAM、Micron MT25Q 128Mib NOR闪存和Micron MT29F 1Gib SLC NAND闪存。 该基准测试在STM32H755ZI上运行&#xff0c;Cortex‐M7内核的时钟频率为240MHz。Quad SPI总线用于1‐…

安泰功率放大器ATA-8202在EMC电磁兼容测试中的具体应用

作为电子及电器产品质量衡量指标之一的电磁兼容性&#xff08;EMC&#xff09;测试&#xff0c;它的测试正确与否直接关系到产品自身使用的可靠性及安全性&#xff0c;并且它还有可能对于同系统中的其他部分造成影响&#xff0c;不良的电磁兼容性会直接导致系统无法正常运转&am…

GIS数据转换器坐标生成功能

​很多时候我们会拿到一些没有坐标的图片或栅格数据&#xff0c;我们如何给它赋予坐标呢&#xff1f;下面介绍一种为这些数据生成坐标的方法。使用工具是GIS数据转换器-栅格-V4.0。 GIS数据转换器坐标生成功能 使用图片是这样的&#xff0c;网上找的不知道哪位大神画的三国时期…

【毕业季征文】追光人,终将光芒万丈!

追光人&#xff0c;终将光芒万丈&#xff01; 写在最前面最后从0到1 我的二进制探索之路一、从0到1&#xff0c;破茧成蝶二、从0到2n&#xff0c;全面发展三、从0到∞&#xff0c;逐光而行 参考 写在最前面 参与活动#毕业季征文|未来可期# 岁月不居&#xff0c;时节如流。转眼…

朋友轻松拿下字节27K的offer,羡慕了....

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

C++ 范围for循环

1. 在C98中&#xff0c;不同的容器和数组&#xff0c;遍历的方法不尽相同&#xff0c;写法不统一&#xff0c;也不够简洁&#xff0c;而C11基于范围的 for循环以统一、简洁的方式来遍历容器和数组&#xff0c;用起来更方便了。 C 容器都有哪些 简单介绍&#xff1a; //STL C标…

7分钟的面试,我太难了.....

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

leetcode-最大二叉树(java)

leetcode654题--最大二叉树 leetcode654 - 最大二叉树解题思路代码演示二叉树专题 leetcode654 - 最大二叉树 leetcode654 - 最大二叉树 原题链接 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中…

幻读与不可重复读的区分

幻读 VS 不可重复读 幻读重点在于数据是否存在。原本不存在的数据却真实的存在了&#xff0c;这便是幻读。 在同一个事务中&#xff0c;第一次读取到结果集和第二次读取到的结果集不同。引起幻读的原因在于另一个事务进行了INSERT操作。 不可重复读重点在于数…

中国人民大学与加拿大女王大学金融硕士——跟5月说再见,期待新的精彩

岁月清浅&#xff0c;时光无言。5月的风即将吹来6月的的绚烂&#xff0c;在这个美好的季节&#xff0c;你有新的期盼了吗&#xff1f;在职的你&#xff0c;是否需要再学习呢&#xff0c;中国人民大学与加拿大女王大学金融硕士项目为你提供在职读研的平台&#xff0c;在这里开启…

CMU 15-445 Project #0 - C++ Primer

Project #0 - C Primer 一、题目链接二、准备工作1.项目构建2.代码测试3.代码格式化4.压缩与提交 三、部分实现 一、题目链接 二、准备工作 以下操作在题目文档中均有提及&#xff0c;这里进行简要整理。 1.项目构建 首先需要从远程仓库克隆项目文件&#xff0c;由于该仓库会…

GB28181——实时视频显示

一、主要实现功能 1、支持四路设备接入 2、实时视频分屏显示 3、接入设备信息存储 二、待完善功能&#xff08;现阶段&#xff09; 1、设备的删除 &#xff08;已更新&#xff09; 2、语音对讲 &#xff08;暂时不处理&#xff09; 3、视频输出通道的实时修改 &#xff08;已更…

Nginx详细解说

1 什么是Nginx Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务器&#xff0c;邮件服务器。支…

科技云报道:大模型的中场战事,深入垂直行业腹地

科技云报道原创。 自从OpenAI于2022年11月推出ChatGPT后&#xff0c;一场波及全球科技界的“AI海啸”就此爆发。 自今年以来&#xff0c;国内已有超过30家企业入局大模型赛道。从百度“文心一言”、阿里“通义千问”的发布&#xff0c;到网易“玉言”、科大讯飞“星火”、昆仑…