运用原生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等数据库管理工具的运用。例:企业版查询网关架构

ClickHouse进阶|如何自研一款企业级高性能网关组件?
监听层,一起支撑HTTP和TCP两种Protocol,接纳恳求。流量操控层,记录并束缚恳求的频率和并发数。分发层,根据装备中的集群信息和状况,负载均衡算法以及用户等信息,将恳求发送至对应clickhouse节点健康检查器,经过发送探针恳求的方法,时间重视每个节点的健康状况以及响应灵敏度,防止将恳求转发至不健康节点

2.2 打通ByteHouse操控面元数据

企业版网关经过与操控面元数据的衔接,使得网关用户能够直接在操控面进行创建和授权。一起,网关读取操控面集群元数据,获取ByteHouse集群节点的信息。ByteHouse操控面支撑多集群下的管控,因而关于企业版网关来说也需求支撑多集群模式。与chproxy不同的是,企业版网关能够直接读取操控面用户集群授权元数据。关于可主动揣度对应集群的用户,网关能够完成主动署理恳求到对应的集群,愈加灵敏和快捷。

2.3 监控告警

火山引擎ByteHouse企业版查询网关与操控面的深度集成也体现在监控告警方面。ByteHouse企业版操控面监控组件能够经过收集网关的查询目标 metrics,支撑在操控面装备来自网关目标的告警规矩。例:企业版网关监控告警装备界面

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

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数据库的查询操作。

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传输字节省通讯

ClickHouse进阶|如何自研一款企业级高性能网关组件?
当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进阶|如何自研一款企业级高性能网关组件?
许多语言ClickHouse Driver经过支撑TCP Native协议进步读写功用,例如社区 ClickHouse Native JDBCclickhouse-go官方JDBC Driver由于ClickHouse TCP协议天然具有session状况,不同于HTTP只能在查询完毕才干回来查询成果不同,TCP协议答应ClickHouse服务端将查询进度及时回来给Client。[图片]
ClickHouse进阶|如何自研一款企业级高性能网关组件?
例:TCP协议 ClickHouse服务端回来给Client的几种不同类型的数据块
ClickHouse进阶|如何自研一款企业级高性能网关组件?

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进程

ClickHouse进阶|如何自研一款企业级高性能网关组件?
例:TCP协议 Data数据块格局
ClickHouse进阶|如何自研一款企业级高性能网关组件?
例:TCP协议 Column结构体格局
ClickHouse进阶|如何自研一款企业级高性能网关组件?
就TCP协议而言,在进行batch insert时,刺进的数据以整列的方法进行传输。这种方法不只有利于数据在传输进程中得到更高效的紧缩,而且由于自定义了数据类型的序列化机制,所以在读写进程中不需求刺进分隔符,直接读取或写入定长的字节数组即可,然后大大进步了IO功率。

相比之下,HTTP协议下的batch insert需求经过FORMAT来切割行数据进行写入。一起,数据以整行传输不利于紧缩,这也是HTTP协议相较于TCP协议下的batch insert功率较低的一个原因。

四、与开源项目chproxy的差异

4.1 功用比较

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

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

4.2 功用的比较

在查询功用上,由于用户能够经过运用ClickHouse TCP协议衔接ByteHouse网关,因而拥有比chproxy更快的功用体现。特别是在应对批量数据写入batch insert的场景下,运用ByteHouse网关以TCP协议衔接有着更高的功率。参考ClickHouse Native JDBC驱动做了对HTTP、TCP协议功用测验基础测验github.com/housepower/…

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履行统计,并深度整合到操控面库表信息和健康度功用上。