Clickhouse写入问题汇总
Clickhouse写入问题汇总
Zookeeper相关
当clickhouse在建表时使用了Replicated引擎族时, 会对zookeeper有非常重的依赖, 这时候就要注意zookeeper集群的一些优化项.
clickhouse集群两分片两副本(4C8G),实测每分钟80W数据量的情况下, Zookeeper单机(4C8G)完全就能够满足要求了, 甚至还有很大的余地.
修改zookeeper的配置项
具体的参数说明可以看官网 Clickhouse Settings
clientPort=2181
dataDir=/data/zookeeper
dataLogDir=/data/logs/zookeeper
tickTime=2000
initLimit=30000
syncLimit=10
maxClientCnxns=2000
maxSessionTimeout=60000000
autopurge.snapRetainCount=10
autopurge.purgeInterval=1
preAllocSize=131072
snapCount=3000000
leaderServes=yes
standaloneEnabled=false
server.1=172.16.8.132:2888:3888
Zookeeper相关文件的存放
- zookeeper的snapshot文件存储盘不低于1T, 注意清理策略.
- 将dataLogDir存放目录应该与dataDir分开, 可单独采用一套存储设备来存放ZK日志, 最好用SSD.
多套Zookeeper集群配置一套Clickhouse集群.
1. Code 999
com.dtstack.jlogstash.outputs.core.common.ClickhouseException: ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 999, host: 172.16.8.84, port: 8123; Code: 999, e.displayText() = DB::Exception: Cannot allocate block number in ZooKeeper: Coordination::Exception: Connection loss (version 19.14.6.12)
ck与Zookeeper的连接丢失导致不能分配块号等问题.
在Clickhouse中, 表的元数据信息, 每个数据块的信息, 每次插入的时候, 数据同步的时候, 都需要和zookeeper进行交互. zookeerper 服务在同步日志过程中, 会导致ZK无法响应外部请求, 进而引发session过期等问题.
解决方法
参考上面zookeeper相关的优化.
在
zoo.cfg
中增加forceSync=no
默认是开启的, 为避免同步延迟问题, zk接收到数据后会立刻去将当前状态信息同步到磁盘日志文件中, 同步完成后才会应答. 将此项关闭后,客户端连接可以得到快速响应.
关闭forceSync选项后, 会存在潜在风险, 虽然依旧会刷磁盘(
log.flush()
首先被执行), 但因为操作系统为提高写磁盘效率, 会先写缓存. 当机器异常后, 可能导致一些zk状态信息没有同步到磁盘, 从而带来zkl前后信息不一样问题.clickhouse建表的时候添加
use_minimalistic_part_header_in_zookeeper
参数, 对元数据进行压缩存储, 但是修改完了以后无法再回滚的.
Code 225
com.dtstack.jlogstash.outputs.core.common.ClickhouseException: ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 225, host: 172.16.8.84, port: 8123; Code: 225, e.displayText() = DB::Exception: ZooKeeper session has been expired. (version 19.14.6.12)
zk会话超时, 一般都是由于zk单机/集群出问题(例如zk服务挂了, zk的压力太大)导致的.
解决方法
- 参考上面zookeeper相关的优化.
- zk client在与所有server断开连接后(有可能是各种原因), client 会收到 disconnted消息. 当zk server 恢复后, zk client会自动与server连接上, 但是此时会话已失效, client收到 session expired消息. 前一个会话的所有数据均丢失. 接下来你要怎么做, 得看你的程序用途:
- 如果只是读写, 没有主备机切换情况(就是当一台主机一台备机, 当主机挂机时, zk通知备机成为主机), 那么, 重新new一个会话, 将原来session的树状结构重新建立起来就行了.
- 如果是主备机切换情况, 那就不能简单的建立 树状结构, 因为这时我们是不知道到底主机是挂掉了, 还是session expired了. 就只能把它当作真的是主机挂机来处理.
- ZK所有集群均不可用情况是比较少见的, 但是session expired需要引起重视起来.
- 一般情况下, 集群中一两台机器的挂机和启动, 我们都不用关心, apache的zk client可以帮我们自动处理这些问题.
Code 242
com.dtstack.jlogstash.outputs.core.common.ClickhouseException: ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 242, host: 172.16.8.84, port: 8123; Code: 242, e.displayText() = DB::Exception: Table is in readonly mode (version 19.14.6.12)
zookeeper压力太大, 表处于“read only mode”模式, 导致插入失败.
解决方法
其实和上面两个问题Code 999/225
一样, 都是由于zk集群的配置导致的, 所以只要想办法增加zk集群的配置, 或者降低zk集群的压力即可.
- 参考上面zookeeper相关的优化.
Code 1002
com.dtstack.jlogstash.outputs.core.common.ClickhouseException: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: 172.16.8.84, port: 8123; 172.16.8.84:8123 failed to respond
导致的原因是官方jdbc的实现用了httpclient的库.
服务器的keep-alive时间已知为3s, 客户端与服务端进行通信, httpclient会复用已创建的连接, 若服务端已关闭连接, 客户端在沿用这个连接就会出现failed to respond
的错误.
解决方法
- 禁用HttpClient的连接复用.
- 重试方案: http请求使用重发机制, 捕获
NohttpResponseException的
异常, 重新发送请求,重发N次后还是失败才停止. - 根据keep Alive时间, 调整
validateAfterInactivity
小于keepAlive Time
, 但这种方法依旧不能避免同时关闭. - 系统主动检查每个连接的空闲时间, 并提前自动关闭连接. 避免服务端主动断开.
对于clickhouse的jdbc来说, 如果要提供方案, 就要在源码层面更改:
方案1: 修改为短连接, 当然这种方式看你接不接受了, ClickHousePreparedStatementImpl中设置:
post.setHeader("Connection", "close");
方案2: 引入重试机制, 当出现这种错误的时候, 莫急莫慌, 再试一次.
这里我们采用的是方案2, 使用重试机制, 具体的重试次数可以通过参数bulkRetries
来控制.
推荐Insert操作使用方案2, Select操作使用方案1. 不需要考虑多次Insert同一数据导致数据重复的问题, CH内部有机制来保证数据唯一性.
Code 371
问题描述
An error occured before execution: Code: 371, e.displayText() = DB::Exception: Table 'test01' isn't replicated, but shard #1 is replicated according to its cluster definition (version 19.14.6.12)
只有使用了replicated开头的engine的引擎的表, 才能够在拥有on cluster xxx
条件的ddl语句中进行集群更新
其他engine的表, 只能够每个node进行update.
distributed_table使用的是Distributed引擎, 所以也不支持on cluster xxx
这样条件的ddl语句.
但是在最近的版本中(v20.8 LTS)中, Distributed引擎也支持了 on cluster 操作了, 感觉在低版本中不支持集群DDL语句可能是一个BUG.
所以建议条件允许的话, 将CH集群升级到20.8及以上版本即可.
解决方法
如果是分布式表
- 每个节点执行语句
如果是local表
- 每个节点执行语句
- 换用replicated的表引擎
Code 48
ClickHouse exception, code: 48, host: 172.16.8.84, port: 8123; Code: 48, e.displayText() = DB::Exception: There was an error on [172.16.8.84:9000]: Cannot execute replicated DDL query on leader (version 19.14.6.12)
这个问题我自己也没有弄明白, 查了非常多的资料, 各执一词. 在20.4及以后版本的一个pr修复了相关的问题:
Fix DDL worker timeouts for long queries
推荐升级到v20.8LTS版本.
如果不支持升级CH版本, 我尝试在低版本上为每个分片加了一个副本也将这个问题解决了(原先的架构是无副本的).
Clickhouse写入问题汇总的更多相关文章
- clickhouse在风控-风险洞察领域的探索与实践
一.风险洞察平台介绍 以Clickhouse+Flink实时计算+智能算法为核心架构搭建的风险洞察平台, 建立了全面的.多层次的.立体的风险业务监控体系,已支撑欺诈风险.信用风险.企业风险.小微风险. ...
- 使用python解决烦人的每周邮件汇总!
最近开始接手BI工作,其中又一个繁琐又不得不做的事,就是每周五都得汇总上个财务周的数据给运营人员! 作为一个懒人,只能把这件事交由电脑去处理了. 初步的idea:周五11点前mac自动执行汇总程序-& ...
- ClickHouse与ES的优劣对比
优点: ClickHouse写入吞吐量大,单服务器日志写入量在50MB到200MB/s,每秒写入超过60w记录数,是ES的5倍以上. 查询速度快,官方宣称数据在pagecache中,单服务器查询速率大 ...
- JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
企业数据越存越多,存储容量与查询性能.以及存储成本之间的矛盾对于技术团队来说是个普遍难题.这个难题在 Elasticsearch 与 ClickHouse 这两个场景中尤为突出,为了应对不同热度数据对 ...
- Web安全学习
项目地址(参考):https://websec.readthedocs.io/zh/latest/basic/history.html 本文只能充当目录简介,具体还要自己深入学习. 序章 Web技术演 ...
- Web安全学习笔记 SQL注入下
Web安全学习笔记 SQL注入下 繁枝插云欣 --ICML8 SQL注入小技巧 CheatSheet 预编译 参考文章 一点心得 一.SQL注入小技巧 1. 宽字节注入 一般程序员用gbk编码做开发的 ...
- 列式数据库~clickhouse问题汇总
一 简介:常见的clickhouse 问题汇总 二 问题系列 1 内存问题 Code: 241. DB::Exception: Received from localhost:9000, : ...
- flink clickhouse-jdbc和flink-connector 写入数据到clickhouse因为jar包冲突导致的60 seconds.Please check if the requested resources are available in the YARN cluster和Could not resolve ResourceManager address akka报错血案
一.问题现象,使用flink on yarn 模式,写入数据到clickhouse,但是在yarn 集群充足的情况下一直报:Deployment took more than 60 seconds. ...
- Flink 实践教程:入门(6):读取 PG 数据写入 ClickHouse
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...
随机推荐
- 【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"
在项目中的go.mod文件中有这样一句: require ( github.com/xxx-devops/xx1/sdk/go v2.2.3 ) 项目的编译没有问题,但是goland中出现如下提示: ...
- CMake语法—缓存变量(Cache Variable)
目录 CMake语法-缓存变量(Cache Variable) 1 CMake缓存变量 2 定义缓存变量 2.1 定义格式 2.2 定义示例代码 2.3 运行结果 2.4 小结 3 CMakeCach ...
- 利用SelectPdf插件将网页生成PDF
简介 适用于.NET Framework和.NET Core的HTML至PDF转换器 SelectPdf提供的在线html到pdf转换器使用.NET的Select.Pdf库中的html到pdf转换器. ...
- linux磁盘管理(全面解析)
目录 一:磁盘管理 1.磁盘管理作用 2.磁盘挂载顺序 3.磁盘分区 4.Linux 磁盘管理常用命令 5.磁盘分区内容 二:linux中分区的意义 三:分区的步骤与顺序 1.添加磁盘 2.查看创建新 ...
- STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- python22day
内容回顾 递归练习 sys os logging shutil 函数结束啦 今日内容 面向对象 楔子:做一个人狗大战的游戏 技能要有归属感,人是人,狗是狗,技能的函数要写在对应函数内部,闭包. 复杂的 ...
- Vue.js之计算属性(computed)、属性监听(watch)与方法选项(methods)
vue.js官网:https://cn.vuejs.org/v2/guide/components-registration.html 一.计算属性-computed 1. 作用:能够避免数据冗余,通 ...
- PyTorch 介绍 | BUILD THE NEURAL NETWORK
神经网络由对数据进行操作的layers/modules组成.torch.nn 命名空间提供了所有你需要的构建块,用于构建你自己的神经网络.PyTorch的每一个module都继承自nn.Module. ...
- ApacheCN 捐赠名单 2019
这是 ApacheCN 的捐赠名单,不是龙哥盟博客的(关于 ApacheCN). 最新的名单请见 https://home.apachecn.org/donate/. 捐赠者 金额(元) 时间 收入类 ...
- AGC005 部分简要题解
E 首先注意到这个问题事实上非常复杂(两棵树上博弈),基础的转化无效,于是考虑简化情形. 手玩很多样例可以发现,似乎很容易出现无限循环的情况,进一步地,有观察: 若第一棵树上存在相邻点 \(u, v\ ...