記一次Clickhouse服務不可用

2021-10-21 14:33:17 字數 2771 閱讀 7267

問題描述:

集群沒有做高可用,每個分片只有乙個副本。查詢時無法返回結果且並沒有超時錯誤。

排查:

首先看下伺服器負載。磁碟使用不到50%,記憶體使用不到20%,cpu空閒率超過80%,各項指標都正常。

第二步看下clickhouse server日誌。err log中先後出現兩種錯誤資訊:1.connection reset by peer;2.socket write buffer寫入失敗。

嘗試在伺服器啟用clickhouse client進行查詢,發現:

上圖可以看到查詢一直停留在98%。

原因分析:

錯誤1產生有以下幾個原因:

1)伺服器的併發連線數超過了其承載量,伺服器會將其中一些連線關閉;

如果知道實際連線伺服器的併發客戶數沒有超過伺服器的承載量,則有可能是中了病毒或者木馬,引起網路流量異常。可以使用netstat -an檢視網路連線情況。

2)客戶關掉了瀏覽器,而伺服器還在給客戶端傳送資料;

3)瀏覽器端按了stop;

這兩種情況一般不會影響伺服器。但是如果對異常資訊沒有特別處理,有可能在伺服器的日誌檔案中,重複出現該異常,造成伺服器日誌檔案過大,影響伺服器的執行。可以對引起異常的部分,使用try…catch捕獲該異常,然後不輸出或者只輸出一句提示資訊,避免使用e.printstacktrace();輸出全部異常資訊。

4)防火牆的問題;

如果網路連線通過防火牆,而防火牆一般都會有超時的機制,在網路連線長時間不傳輸資料時,會關閉這個tcp的會話,關閉後在讀寫,就會導致異常。 如果關閉防火牆,解決了問題,需要重新配置防火牆,或者自己編寫程式實現tcp的長連線。實現tcp的長連線,需要自己定義心跳協議,每隔一段時間,傳送一次心跳協議,雙方維持連線。

5)jsp的buffer問題。

jsp頁面預設快取為8k,當jsp頁面資料比較大的時候,有可能jsp沒有完全傳遞給瀏覽器。這時可以適當調整buffer的大小。

錯誤2產生的原因是:

傳送socket請求時需要將資料先寫入傳送緩衝。當緩衝區滿後寫入失敗。那麼結合查詢進度達98%但無法成功獲取資料可以基本確定這就是當前查詢失敗的原因。

那麼是什麼導致socket寫入緩衝滿的?

我們在使用clickhouse進行查詢有三種連線方式,一是系統通過http請求在後台服務進行查詢;一是通過tabix在網頁端查詢;一是直接在伺服器通過tcp client查詢。後台服務和tcp client並沒有出現問題,那問題是處在tabix查詢的過程中?

回憶一下操作路徑發現,在tabix上查詢時出現過幾次由於查詢時間過長,直接將tabix查詢tab關閉的情況。觀察日誌中connection reset by peer的報錯sql資訊發現確實是這幾個被關閉tab的查詢。同時在err log中我們發現,相同的connection reset by peer錯誤資訊一直出現,這說明clickhouse伺服器一直在重試對應的連線,並未釋放。看來是由於有大量請求將資料寫入緩衝區無法傳送,但是又無法關閉請求,導致緩衝區資料無法清空。既然如此,為什麼伺服器一側沒有報超時呢?

clickhouse中存在三個超時時間設定:

1. distributed_ddl_task_timeout:分布式ddl查詢的執行等待時間。由於分布式ddl是基於zookeeper構建任務佇列非同步執行,執行等待超時並不代表查詢失敗,只表示之前傳送還在排隊等待執行,使用者不需要重**送任務。

2. max_execution_time:普通查詢的執行時間。

3. socket_timeout:http協議在監聽socket返回結果時的等待時間。

tcp連線中只需要關注前兩個,http連線中三個都需要關注。

經過分析我們已經定位到問題是出在socket傳送中,因此tcp client就不需要再去排查。

首先來看下系統中的http請求:

requestconfig requestconfig = requestconfig.custom()

.setconnecttimeout(50000).setconnectionrequesttimeout(10000)

.setsockettimeout(50000).build();

系統中已經設定了socket超時時間,因此不會出現這個問題。

接下來看下tabix查詢的請求:

可見,請求中是未設定socket timeout的。

問題解決:

通過上述分析我們發現問題是:使用tabix進行查詢時,並未設定socket timeout。由於tabix中不支援該設定,因此只能通過主動kill query結束查詢。

這次算是tabix使用導致的乙個問題。在系統clickhouse client的開發中要注意幾個超時時間的設定,同時可以記錄正在執行的查詢,並在hook中主動將執行中查詢關閉,以免因為客戶端失聯導致服務不可用。

記一次mysql服務不能啟動

之前開啟後台專案的機器,發現登陸後台系統時,輸入使用者名稱 密碼後,提示使用者名稱或密碼錯誤。1.連線mysql資料庫,發現鏈結不上,但是ps ef grep mysql 發現有mysql服務 2.輸入mysql u root p 提示說找不到sock檔案 3.service mysqld rest...

記一次伺服器事故

mysql資料庫報錯 can t create write to file tmp sql 6ccc 0.myi 在開始刪除之後,所有服務就已經恢復正常執行了,接下來就是優化那個session了,哎又是埋坑.最後附上inode擴容的方法 但是需要注意,手動擴inode,一般是新建分割槽時設定的,該操...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...