clickhouse最佳实践(一):clickhouse千亿级日志系统单机到集群架构演进历程


最佳实践系列文章持续完善中, 记录了业务系统从碰到瓶颈到迭代的过程

1. 初始阶段:单机部署

针对ClickHouse(以下简称CK)单机的优化过程,通常包括以下几个方面,以确保在非分布式环境中达到最佳性能:

1). 硬件优化

  • 内存:尽可能多的内存对CK有帮助,因为它能缓存查询的数据块。确保有足够的内存,尤其是当数据量较大时。

  • 磁盘:优先选择SSD,以提高数据读取和写入速度。此外,CK对文件系统的选择敏感,通常推荐选择xfs或ext4。

  • CPU:CK对CPU多核的支持良好,多核CPU能显著提高并发查询的处理能力。

2). 配置优化 【clickhouse最佳实践(二):clickhouse单机性能优化】

  • max_threads:根据实际CPU核数,调整max_threads,建议设置成与CPU核心数相同或稍高的值。

  • max_block_size:增大max_block_size的值以提高查询的吞吐量,但如果内存有限则需适量调整。

  • max_memory_usage:针对内存进行限制,防止因数据量过大导致内存溢出。可以通过设置max_memory_usage控制单次查询的最大内存使用。

  • max_partitions_to_read:在分区读取时,控制最大可读分区数,从而避免数据量大的查询引起卡顿或过载。

3). 数据表结构优化 【clickhouse最佳实践(二):clickhouse单机性能优化】

  • 列式存储:确保使用列式存储(CK默认),这种存储方式在数据量大的查询中能显著提高性能。

  • 分区设计:合理设计分区键(如按时间或业务逻辑),可以有效减少扫描的数据量,提高查询效率。

  • 主键和排序键:选择合适的主键和排序键,避免全表扫描。排序键能够帮助CK加快特定字段的查询速度。

  • 物化视图(Materialized Views):对于频繁查询的聚合结果,可以使用物化视图,减少查询时间。

4). 数据管理和清理

  • 分区管理:定期清理旧分区(如按时间分区),以减少表数据量,避免无关数据对性能的影响。

  • 数据压缩:CK支持多种压缩算法,可以使用zstd或lz4提高数据存取效率。压缩可以显著减少磁盘占用和I/O负载。

5). 查询优化【clickhouse最佳实践(二):clickhouse单机性能优化- - -持续完善中】

  • 查询方式优化:尽量使用预聚合数据,避免复杂的实时计算,利用条件过滤减少数据读取量。

  • 设置查询超时:避免长时间运行的查询拖垮性能,比如可以限制查询的max_execution_time。

  • 避免低效函数和操作:避免对列数据频繁使用LIKE等低效操作,可以使用匹配表达式或正则替代。

6). 监控与调试【clickhouse最佳实践(二):clickhouse单机性能优化- - -持续完善中】

  • 系统监控:使用ClickHouse自带的系统表如system.metrics,system.events,监控查询的资源占用情况。

  • Profile分析:通过分析查询的Profile日志,找到瓶颈点,改进查询语句和表结构设计。

CK单机优化需要结合具体的硬件资源和业务需求,定期监控和调整系统配置以达到最佳性能。

2. 使用代理层

  • 搭建代理层:在原有单机的基础上添加一个代理层(如: Nginx 或 CkProxy【官方的ck代理】),用于后续的负载均衡。nginx负载均衡策略
  • 配置代理:在代理层上配置后端节点的负载均衡策略,以便未来的集群扩展。

3. 集群设计

集群规划方法论
【clickhouse最佳实践(三):Clickhouse集群模式读写方案- - -持续完善中】

  • 节点配置:设计多个 ClickHouse 实例,每个实例运行在独立的机器上。
  • Shard 和 Replica:根据业务需求设计合适的分片(Shard)和复制(Replica)策略,确保数据高可用。例如,可以设置 3 个 shard,每个 shard 3 个 replica。
  • 数据分配:考虑使用 Repartition 或者 Distributed 表引擎将数据均匀分配到不同的节点。

4. 数据迁移

【clickhouse最佳实践(四):Clickhouse单机到集群模式数据迁移- - -持续完善中】

社区的一些迁移工具:clickhouse-copier 、clickhouse-mysql-data-reader

  • 迁移工具:使用 ClickHouse 的复制功能(如 CREATE TABLE ... AS SELECT)进行数据迁移。
  • 双写策略:在过渡期间实现双写策略,确保新数据可以在新集群中被写入。

5. 监控和维护

[运维维度优化、1中的监控主要是业务维度优化]

  • 监控提升:逐步升级监控系统,使用 Grafana 和 Prometheus 等工具监控集群状态和性能指标。
  • 调节参数:根据监控数据对 ClickHouse 的配置参数进行调整,优化查询性能。

6.集群横向扩展

【clickhouse最佳实践(四):Clickhouse单机到集群模式数据迁移- - -持续完善中】

  • 弹性扩展:根据业务负载和数据量的变化,灵活添加或移除节点,实现弹性扩展。
  • 高可用设计:实现故障转移(Failover)机制,以增强集群的稳定性。

文章作者: biturd
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 biturd !
  目录