記一次Kafka服務器宕機的真實經歷!!


大家好,我是冰河~~

估計節前前祭拜服務器不靈了,年后服務器總是或多或少的出現點問題。不知是人的問題,還是風水問題。昨天下班時,跟運維小伙伴交代了好幾遍:如果使用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所在的服務器就會崩潰,宕機。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM