ClickHouse数据库应用开发
在ClickHouse的使用过程中,由于使用不规范的方式访问和查询,导致业务失败的情况时有发生。此外,偶尔也会发生因为网络闪断等导致连接和查询失败的情况。
MRS提供了ClickHouse的样例代码工程,旨在提供连接重试机制和规范化用户连接和查询的方法,从而减少业务失败的风险,提升系统的稳定性和可靠性。
本样例代码工程包含了连接、查询和插入相关规则和建议,以及相关的代码示例,可以帮助客户更好地理解和实践这些方法。通过使用本代码样例,客户可以有效地降低业务失败的概率,提升用户体验和业务质量。
操作步骤
- 先获取clickhouse-example样例代码工程。
代码获取地址:https://github.com/huaweicloud/huaweicloud-mrs-example/blob/mrs-3.1.2/src/clickhouse-examples/。
- 在样例工程“conf”目录下有一个“clickhouse-example.properties”配置文件,其中各项的配置的作用如下所示:
#连接节点或Balancer的ip列表,ip之间用逗号隔开 loadBalancerIPList= #是否需要开启ssl,如果取值为true,则loadBalancerHttpsPort必填 sslUsed=true #端口号 loadBalancerHttpPort= loadBalancerHttpsPort= #ClickHouse安全模式开关,安全模式集群时该参数固定为true。 CLICKHOUSE_SECURITY_ENABLED=true #连接的用户名 user= #连接的用户的密码 password= #集群名称 clusterName= #数据库名称 databaseName= #表名称 tableName= #一个批次写入的条数 batchRows=10000 #写入数据的总批次 batchNum=10 #ip:port。安全模式下https端口,普通模式下http端口 clickhouse_dataSource_ip_list= #ip:tcp port native_dataSource_ip_list=ip:port,ip:port,ip:port
- 在Demo.java有三种连接JDBC的样例:节点的JDBC连接、banlancer的JDBC连接和tcp端口的banlancer的JDBC连接。
- Demo提供了createDatabase、createTable、insertData和queryData的样例。
规则
- 大批量少频次的插入。
内容要求:ClickHouse的每次数据插入都会生成一到多个part文件,如果data part过多则会导致merge压力变大,甚至出现服务异常影响数据插入。建议一次插入10万行,每秒不超过1次插入。
- 一次只插入一个分区内的数据。
内容要求:如果数据属于不同的分区,则每次插入,不同分区的数据会独立生成part文件,导致part总数量膨胀。甚至写入报错“Merges are processing significantly slower than inserts”。一批次写入的数据,对应的分区数太多。ClickHouse建表之后insert batch时,会对不同的分区创建一个目录。如果一个batch里面的数据对应了过多的分区,那么一次insert就会生成较多的分区目录,后台merge线程处理速度跟不上分区增加的速度,社区规格是每秒不超过一个数据目录。
具体的操作:确认一个batch的数据对应了多少个分区,insert的时候,尽量保证一个batch包含的分区数是1。
- 慎用delete、update操作。
内容要求:建议使用CollapsingMergeTree、VersionedCollapsingMergeTree引擎或根据分区批量清理。
- ClickHouse需要写本地表。
内容要求:连接balancer写入报错Request Entity Too Large。这是由于Nginx对http请求体大小有限制,而一次写入的数据量超过了这个限制。
规避:修改Nginx配置项client_max_body_size为一个较大的值。
解决:写本地表,不要通过balancer写入数据。
建议
- 每个应用配置的loadBalancerIPList顺序不要一致,以免对balancer ip产生访问热点
例如应用一配置loadBalancerIPList=ip1,ip2,ip3,应用二配置loadBalancerIPList=ip3,ip1,ip2。
- 根据连接方式选择端口
普通集群默认开启8123端口,安全集群默认开启8443端口。
端口号查看方式:在集群的Manager界面选择“集群 > 服务 > ClickHouse > 配置”。
- 用于通过HTTP连接到ClickHouse server的端口默认为8123。
- 用于通过HTTPS连接到ClickHouse server的端口默认为8443。
- 用户客户端通过TCP连接到ClickHouse server的端口默认为9000。
- 用户客户端通过TCP ssl连接到ClickHouse server的端口默认为9440。
- ClickHouseBalancer的HTTP端口默认为21425。
- ClickHouseBalancer的HTTPS端口默认为21426。