最佳实践系列文章持续完善中, 记录了业务系统从碰到瓶颈到迭代的过程
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)机制,以增强集群的稳定性。