記一次Kafka伺服器當機的真實經歷!!

冰河發表於2021-10-09

大家好,我是冰河~~

估計節前前祭拜伺服器不靈了,年後伺服器總是或多或少的出現點問題。不知是人的問題,還是風水問題。昨天下班時,跟運維小夥伴交代了好幾遍:如果使用Docker安裝Kafka叢集的話,也需要把Kafka叢集的伺服器硬碟分配的大一些,公司業務量很大,很多服務的通訊、資料的流轉、日誌採集的傳輸等,都是通過Kafka訊息匯流排進行的。

沒想到今天早上一到公司,剛剛做到工位上,開啟我的電腦,郵件裡瞬間收到大量伺服器告警資訊,緊接著看到監控大屏上顯示,內網幾臺測試伺服器掛了。此時,我的表情是這樣的。

我靠,啥情況?剛一來就搞事情?哪些伺服器出問題了?再定睛一看大屏,我去,這不是昨天跟運維小夥伴說的那幾臺Kafka叢集伺服器嗎?

剛測試就掛了?不會這麼衰吧?

於是,我趕緊走到運維小夥伴旁邊,說:你昨天怎麼配置的伺服器啊?

他說:我沒配置啊?不是測試環境嗎?我就沒怎麼配置,我是每臺伺服器給了120G空間,按照預設設定安裝的Kafka叢集啊!

我:不是跟你說了讓你把伺服器磁碟空間設定的大一些嗎?。。。

心裡再怎麼無語,也要解決問題啊!於是我趕緊登入伺服器,在伺服器命令列執行命令,將當前伺服器終端所在的目錄切換到Docker映象預設的目錄下。

[root@localhost ~]# cd /var/lib/docker

結果卻報錯了,報錯資訊如下所示。

[root@localhost ~]# ls -bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間
-bash: 無法為立即文件建立臨時檔案: 裝置上沒有空間

無法切換目錄了。咋辦?我下意識的看下伺服器的磁碟情況,結果一看出事了。

[root@localhost ~]# df -lh
檔案系統                      容量  已用  可用 已用% 掛載點
devtmpfs                      3.8G     0  3.8G    0% /dev
tmpfs                         3.9G     0  3.9G    0% /dev/shm
tmpfs                         3.9G   82M  3.8G    3% /run
tmpfs                         3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/localhost-root   50G   50G   0G   100% /
/dev/sda1                     976M  144M  766M   16% /boot
/dev/mapper/localhost-home   53G   5G   48G   91% /home
tmpfs                         779M     0  779M    0% /run/user/0
overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/d51b7c0afcc29c49b8b322d1822a961e6a86401f0c6d1c29c42033efe8e9f070/merged
overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/0e52ccd3ee566cc16ce4568eda40d0364049e804c36328bcfb5fdb92339724d5/merged
overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/16fb25124e9b85c7c91f271887d9ae578bf8df058ecdfece24297967075cf829/merged

我去,根目錄磁碟空間佔用率100%,果然跟我想的一樣。 而且輸出的結果資訊中,顯示了幾個重要的資訊,如下所示。

overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/d51b7c0afcc29c49b8b322d1822a961e6a86401f0c6d1c29c42033efe8e9f070/merged
overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/0e52ccd3ee566cc16ce4568eda40d0364049e804c36328bcfb5fdb92339724d5/merged
overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/16fb25124e9b85c7c91f271887d9ae578bf8df058ecdfece24297967075cf829/merged

這不就是Docker的預設安裝映象嗎?

下一步怎麼辦呢?我們看到/home目錄還是比較空閒的,我們可以把Docker預設的映象目錄從 /var/lib/docker目錄移動到 /home/docker目下,來臨時緩解下伺服器的壓力,進行測試。其他的就等重新分配好伺服器再切換吧。

馬上開幹,於是我開始遷移Docker預設映象目錄。

遷移Docker預設映象目錄,有兩種方案,這裡跟小夥伴們說下,一種方案是:軟連結法;另一中方案是:修改配置法。 接下來,我們就分別看下這兩種方法。

1.軟連結法

(1)預設情況下Docker的存放位置為:/var/lib/docker,我們可以通過下面的命令來檢視Docker預設映象安裝目錄。

[root@localhost ~]# docker info | grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker

(2)接下來,我們執行如下命令停掉Docker伺服器。

systemctl stop docker

或者

service docker stop

(3)然後將 /var/lib/docker 目錄整體移動到 /home 目錄下。

mv /var/lib/docker /home

這個過程可能時間比較長。

(4)接下來,再建立軟連結,如下所示。

ln -s /home/docker /var/lib/docker

(5)最後,我們啟動Docker伺服器。

systemctl start docker

或者

service docker start

(6)再次檢視Docker映象的目錄,如下所示。

[root@localhost ~]# docker info | grep "Docker Root Dir"
Docker Root Dir: /home/docker

此時,Docker映象目錄遷移成功。

接下來,我們再說說修改配置法。

2.修改配置法

指定映象和容器存放路徑的引數是 –graph=/var/lib/docker ,我們只需要修改配置檔案指定啟動引數即可。

這裡,我使用的伺服器作業系統是CentOS。所以,可以通過如下方式方式修改了Docker的配置。

(1)停止Docker服務

systemctl stop docker

或者

service docker stop

(2)修改docker服務啟動檔案。

vim /etc/systemd/system/multi-user.target.wants/docker.service

在啟動檔案中增加如下一行程式碼。

ExecStart=/usr/bin/dockerd --graph=/home/docker

(3)重新載入配置並啟動

systemctl daemon-reload
systemctl start docker

(4)再次檢視Docker映象的目錄,如下所示。

[root@localhost ~]# docker info | grep "Docker Root Dir"
Docker Root Dir: /home/docker

此時,Docker映象目錄遷移成功。

Kafka叢集可以臨時使用了,先讓資料跑起來。於是我又重新分配了伺服器,搭建好Kafka叢集,中午把測試環境遷移到新的Kafka叢集上。目前還在測試中。。。

小夥伴們學會了嗎?

PS: 我使用的伺服器作業系統版本如下。

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core) 

使用的Docker版本如下。

[root@localhost ~]# docker info
Client:
 Debug Mode: false
Server:
 Containers: 4
  Running: 3
  Paused: 0
  Stopped: 1
 Images: 33
 Server Version: 19.03.8
############其他輸出資訊略############

最後,跟小夥伴們簡單說下,為啥開始我需要運維小夥伴給Kafka叢集的伺服器硬碟設定的大一些呢?

因為我們生產環境的流量是比較大的,平時基本都在5萬~8萬QPS,如果遇到高峰期,會遠比這些流量大的多。當時,我是在生產環境分了一部分流量到測試環境。如果Kafka叢集的磁碟不設定的大一些的話,當Kafka消費者效能下降或者由於其他原因,造成訊息在Kafka中堆積的話,會造成Kafka佔用大量的磁碟空間。如果磁碟空間滿了的話,那麼Kafka所在的伺服器就會崩潰,當機。

好了,今天就到這兒吧,我是冰河,大家有啥問題可以在下方留言,一起交流技術,一起進階,一起進大廠~~

相關文章