ClickHouse常見問題排查與解決(一)
1、Table is in readonly mode (zookeeper path: /clickhouse/tables/iov/t_fault/2)
?異常說明
表示Zookeeper壓力過大,表處于只讀狀態(tài),導致插入失敗
?????分析問題
??? Zookeeper壓力過大原因分析:
?寫入數(shù)據(jù)以及頻率過高?集群中出現(xiàn)Zookeeper節(jié)點掛掉,導致壓力過大
?????解決方案:
?在zookeeper中將dataLogDir存放目錄應該與dataDir分開,可單獨采用一套存儲設備來存放ZK日志。?做好zookeeper集群和clickhouse集群的規(guī)劃,可以多套zookeeper集群服務一套clickhouse集群。保證Zookeeper集群高可用
2、Replica /clickhouse/tables/s1/dwd/xxxx/replicas/dt_fault already exists
?異常說明
????刪除表 ZK replicas未同步
?????分析問題
????表的元信息會保存到Zookeeper節(jié)點上,刪除副本以及本地表后,客戶端未顯示表,但是Zookeeper中的元信息未同步刪除,即會出現(xiàn)異常。
?????解決方案
?????刪除本地表后等待若干時間(根據(jù)經(jīng)驗得大概5分鐘),再刪除副本(分布式表)?????可以登錄ClickHouse服務器進行刪除
3、數(shù)據(jù)寫入成功,但是數(shù)據(jù)庫并不存在數(shù)據(jù)
?? 問題說明
????表引擎是MergeTree或者ReplicateMergeTree,所以不存在數(shù)據(jù)被合并掉。
order by字段包括四個,并且時間在中間,比如:id,name,time,type
?????分析問題
????根據(jù)Arthas(是一個Java診斷工具,由阿里巴巴中間件團隊開源。它在開發(fā)人員中被廣泛采用和流行。)一些手段查詢到方法的入?yún)⒁约胺椒5膱?zhí)行情況得知,數(shù)據(jù)確實入庫。
比如同一時刻入?yún)⒂腥龡l數(shù)據(jù)進行入庫,查詢表只有兩條數(shù)據(jù)。
? 第一種猜測
????數(shù)據(jù)重復導致ClickHouse對重復數(shù)據(jù)進行冪等性操作,進而把重復數(shù)據(jù)刪除。或者會被ClickH忽略掉此次insert

????大概意思是說已經(jīng)有一個一模一樣的數(shù)據(jù)塊了。另外ck沒有事務概念,但是為了保證重復插入的insert的冪等性,會檢測重復,如果重復則跳過。
????本地測驗重復數(shù)據(jù)會部分保留在數(shù)據(jù)庫,部分被刪除。
??????第二種猜測
?????懷疑order by排序字段位置不合理
?解決方案
1.如果想保存重復數(shù)據(jù),兩種解決辦法
????關閉冪等性校驗。SET insert_deduplicate=0????增加一個或者多個冗余字段,保證每條數(shù)據(jù)不相同?2.?創(chuàng)建表時,order by字段是必須的,但是合理安排order by字段,時間放在所有字段的后邊。比如:name,code,type,time等。
4、查詢時(非MergeTree表引擎),查出多條重復數(shù)據(jù)
? 問題說明
????表引擎為:ReplicatedReplacingMergeTree
????select * from A join B A.id=B.id
? 分析問題
????表引擎ReplacingMergeTree一個特性就是:去重;但是不保證過程的數(shù)據(jù)一致性,只能保證數(shù)據(jù)最終的一致性。如果數(shù)據(jù)出現(xiàn)更新的話,查詢的時候可能會查詢出來多條重復數(shù)據(jù)。
?? 解決方案
????查詢數(shù)據(jù)時,在表名后邊加上關鍵字 final?,保證數(shù)據(jù)唯一性。
