写点什么

记一次 Kafka 服务器宕机的真实经历!!

用户头像
冰河
关注
发布于: 刚刚
记一次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% /devtmpfs                         3.9G     0  3.9G    0% /dev/shmtmpfs                         3.9G   82M  3.8G    3% /runtmpfs                         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% /hometmpfs                         779M     0  779M    0% /run/user/0overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/d51b7c0afcc29c49b8b322d1822a961e6a86401f0c6d1c29c42033efe8e9f070/mergedoverlay                        50G   50G   0G   100% /var/lib/docker/overlay2/0e52ccd3ee566cc16ce4568eda40d0364049e804c36328bcfb5fdb92339724d5/mergedoverlay                        50G   50G   0G   100% /var/lib/docker/overlay2/16fb25124e9b85c7c91f271887d9ae578bf8df058ecdfece24297967075cf829/merged
复制代码


我去,根目录磁盘空间占用率 100%,果然跟我想的一样。 而且输出的结果信息中,显示了几个重要的信息,如下所示。


overlay                        50G   50G   0G   100% /var/lib/docker/overlay2/d51b7c0afcc29c49b8b322d1822a961e6a86401f0c6d1c29c42033efe8e9f070/mergedoverlay                        50G   50G   0G   100% /var/lib/docker/overlay2/0e52ccd3ee566cc16ce4568eda40d0364049e804c36328bcfb5fdb92339724d5/mergedoverlay                        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-reloadsystemctl 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-releaseCentOS Linux release 8.1.1911 (Core) 
复制代码


使用的 Docker 版本如下。


[root@localhost ~]# docker infoClient: Debug Mode: falseServer: Containers: 4  Running: 3  Paused: 0  Stopped: 1 Images: 33 Server Version: 19.03.8############其他输出信息略############
复制代码


最后,跟小伙伴们简单说下,为啥开始我需要运维小伙伴给 Kafka 集群的服务器硬盘设置的大一些呢?


因为我们生产环境的流量是比较大的,平时基本都在 5 万~8 万 QPS,如果遇到高峰期,会远比这些流量大的多。当时,我是在生产环境分了一部分流量到测试环境。如果 Kafka 集群的磁盘不设置的大一些的话,当 Kafka 消费者性能下降或者由于其他原因,造成消息在 Kafka 中堆积的话,会造成 Kafka 占用大量的磁盘空间。如果磁盘空间满了的话,那么 Kafka 所在的服务器就会崩溃,宕机。


好了,今天就到这儿吧,我是冰河,大家有啥问题可以在下方留言,一起交流技术,一起进阶,一起进大厂~~

发布于: 刚刚阅读数: 2
用户头像

冰河

关注

公众号:冰河技术 2020.05.29 加入

Mykit系列开源框架发起者、核心架构师和开发者,《海量数据处理与大数据技术实战》与《MySQL开发、优化与运维实战》作者。【冰河技术】微信公众号作者。

评论

发布
暂无评论
记一次Kafka服务器宕机的真实经历!!