ClickHouse 配置优化与问题解决

ClickHouse 配置优化与问题解决

一、数据写入优化

使用 RowBinary 格式进行数据入库可显著提升性能,配合异步插入参数效果更佳:

复制代码
async_insert=1
wait_for_async_insert=0
  • async_insert=1:启用异步插入模式,客户端无需等待数据完全写入磁盘即可返回
  • wait_for_async_insert=0:不等待异步插入完成,进一步提高写入吞吐量

RowBinary 格式优势:

  • 二进制存储,体积更小,传输更快
  • 无需进行字符串解析,减少 CPU 消耗
  • 适合大批量数据持续写入场景

二、CPU 配置优化

根据服务器 CPU 情况合理配置线程参数:

xml 复制代码
<background_pool_size>16</background_pool_size>  <!-- 建议设为 CPU 逻辑核数 -->
<concurrent_threads_soft_limit_num>16</concurrent_threads_soft_limit_num>  <!-- 建议设为 CPU 逻辑核数 -->
  • background_pool_size:控制后台任务(如合并、复制)的线程池大小
  • concurrent_threads_soft_limit_num:查询执行的并发线程数软限制

优化原则:

  • 对于 CPU 密集型查询,避免线程数超过逻辑核数导致上下文切换开销
  • 对于 IO 密集型场景,可适当提高线程数利用空闲资源

三、内存使用配置

根据实际内存情况调整以下参数:

xml 复制代码
<max_memory_usage>16GB</max_memory_usage>  <!-- 单个查询的最大内存限制 -->
<max_server_memory_usage_to_ram_ratio>0.8</max_server_memory_usage_to_ram_ratio>  <!-- 总内存使用占系统内存的比例 -->
<max_bytes_before_external_group_by>10GB</max_bytes_before_external_group_by>  <!-- 分组操作溢出到磁盘的阈值 -->

配置建议:

  • max_memory_usage 一般设置为系统内存的 50%-70%
  • max_server_memory_usage_to_ram_ratio 建议不超过 0.8,预留部分内存给系统和其他进程
  • 当内存不足时,max_bytes_before_external_group_by 可触发外部排序,避免查询失败

四、Prometheus 监控配置

通过以下配置启用 Prometheus 监控:

xml 复制代码
<prometheus>
    <endpoint>/metrics</endpoint>
    <port>9363</port>  <!-- 自定义监控端口 -->
    <metrics>true</metrics>  <!-- 启用指标收集 -->
    <events>true</events>  <!-- 启用事件收集 -->
    <asynchronous_metrics>true</asynchronous_metrics>  <!-- 启用异步指标 -->
</prometheus>

监控指标类别:

  • 系统指标:CPU、内存、磁盘 IO 等
  • 数据库指标:连接数、查询速率、插入速率等
  • 表指标:分区数量、数据量、合并次数等

五、JSON 类型支持

如需使用 JSON 类型,需开启实验性特性:

xml 复制代码
<allow_experimental_object_type>1</allow_experimental_object_type>

使用注意事项:

  • 实验性特性可能存在不稳定性
  • JSON 类型查询性能不如结构化字段
  • 适合存储半结构化数据,避免频繁更新

六、密码认证配置

  1. 生成密码哈希:
bash 复制代码
PASSWORD=123456; 
echo "$PASSWORD"; 
echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
  1. 配置用户密码:
xml 复制代码
<users>
    <user_name>
        <password_sha256_hex>生成的哈希值</password_sha256_hex>
        <!-- 其他权限配置 -->
    </user_name>
</users>

安全建议:

  • 使用强密码,定期更换
  • 为不同用户分配最小必要权限
  • 结合网络访问控制限制连接来源

七、副本问题解决

  1. 多次查询结果不一致:
xml 复制代码
<load_balancing>first_or_random</load_balancing>
  1. 副本损坏处理:
xml 复制代码
<skip_unavailable_shards>1</skip_unavailable_shards>
  1. 副本表无法删除:
xml 复制代码
<database_atomic_delay_before_drop_table_sec>30</database_atomic_delay_before_drop_table_sec>

调整延迟时间,确保所有副本都完成元数据同步

八、基准测试

使用官方基准测试工具评估性能:

bash 复制代码
git clone https://github.com/ClickHouse/ch-bench.git
cd ch-bench
# 按照文档配置测试环境
./ch-bench.sh

基准测试可评估:

  • 不同数据量下的查询性能
  • 并发查询处理能力
  • 数据加载速度
  • 系统资源利用率

九、常见错误及解决方法

  1. Too many parts 错误

原因:小批量插入过于频繁,导致分区文件过多

解决:

xml 复制代码
<merge_tree>
    <parts_to_delay_insert>600</parts_to_delay_insert>
    <parts_to_throw_insert>600</parts_to_throw_insert>
    <max_delay_to_insert>2</max_delay_to_insert>
    <max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>

同时建议:

  • 提高单次插入数量,降低插入频次
  • 调整 background_pool_size 增加合并线程
  1. java.sql.SQLException: java.io.IOException: Reached end of input stream

原因:连接超时

解决:增加 JDBC 连接超时设置

复制代码
jdbc:clickhouse://xxxx:8123/mydb?socket_timeout=300000
  1. DB::NetException: Connection reset by peer

原因:查询占用内存过大被中断

解决:调整全局内存限制

xml 复制代码
<max_memory_usage_for_all_queries>32GB</max_memory_usage_for_all_queries>
  1. Memory limit (for query) exceeded

原因:单个查询超出内存限制

解决:

xml 复制代码
<max_memory_usage>16GB</max_memory_usage>

或优化 SQL,减少数据处理量

  1. string is too long: length can't exceed maximum length

原因:字符串长度超过限制

解决:调整最大字符串长度

xml 复制代码
<format_binary_max_string_size>104857600</format_binary_max_string_size>  <!-- 100MB -->
相关推荐
冒泡的肥皂9 分钟前
MVCC初学demo(二
数据库·后端·mysql
代码程序猿RIP11 分钟前
【Redis 】Redis 详解以及安装教程
数据库·etcd
小生凡一19 分钟前
redis 大key、热key优化技巧|空间存储优化|调优技巧(一)
数据库·redis·缓存
oe101919 分钟前
好文与笔记分享 A Survey of Context Engineering for Large Language Models(上)
数据库·笔记·语言模型·agent·上下文工程
小马哥编程22 分钟前
【软考架构】案例分析-对比MySQL查询缓存与Memcached
java·数据库·mysql·缓存·架构·memcached
一 乐24 分钟前
高校后勤报修系统|物业管理|基于SprinBoot+vue的高校后勤报修系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·毕设
折翼的恶魔1 小时前
SQL190 0级用户高难度试卷的平均用时和平均得分
java·数据库
煎蛋学姐1 小时前
SSM基于框架在线电影评论投票系统3gr0f(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·系统开发·ssm 框架·在线电影评论投票系统
꒰ঌ 安卓开发໒꒱1 小时前
Go高并发在企业级项目中的实战应用:数据库访问与GIN+GORM深度实践
数据库·golang·gin
半夏知半秋1 小时前
mongodb的复制集整理
服务器·开发语言·数据库·后端·学习·mongodb