一、需求介绍

有个很常见的需求:
线下环境中,我想在云主机(或者物理机)上安装 Zookeeper 和 Kafka,两个进程在因为某种异常退出后,能够自动尝试重启。要实现该需求有很多种方案:

  • 搞个脚本定时获取进程,若发现进程不在了,就自动重启
  • 使用Docker 或者 K8 的管理能力【最为推荐】
  • 使用systemd的管理能力

本文讲述的是在centos上使用systemd管理zookeeper 和 kafka.

二、首先安装ZK 服务

1、定义[Unit]文件(service文件)


vim /etc/systemd/system/zookeeper.service

[Unit]
Description=zookeeper.service
After=network.target

[Service]
Type=forking

# 第一行设置日志目录,如果没有设置,默认是当前目录,对有的用户来说,可能没有权限。
Environment=ZOO_LOG_DIR=/apps/svr/apache-zookeeper-3.5.9-bin/
# 第二行是配置环境变量,systemd用户实例不会继承类似.bashrc中定义的环境变量,所以是找不到jdk目录的,而zookeeper又必须有。
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/apps/svr/jdk1.8.0_102/bin:/root/bin
ExecStart=/apps/svr/apache-zookeeper-3.5.9-bin/bin/zkServer.sh start 
#ExecStop=/apps/svr/apache-zookeeper-3.5.9-bin/bin/zkServer.sh stop
#ExecReload=/apps/svr/apache-zookeeper-3.5.9-bin/bin/zkServer.sh restart
PIDFile=/data/zookeeper/zookeeper_server.pid
# 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
Restart=always
# 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
RestartSec=10
# StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
StartLimitInterval=0
[Install]
WantedBy=multi-user.target

2、处理已有ZK进程
如果当前主机上已有ZK 进程了,zookeeper.service会启动不成功,所以手动干掉 ZK 进程
jps |grep 'Quo' | awk '{print $1}' |xargs kill

3、执行命令

systemctl daemon-reload
systemctl enable zookeeper
systemctl start zookeeper

4、可以利用systemd自带命令来查看服务状态以及错误日志

systemctl status kafka-zookeeper -l 

5、还可测试下 systemd是否真如预期那样能在Zk进程挂了之后自动将其拉起:
将ZK 进程 kill ,ZK进程退出,等待片刻,看 ZK 进程是否重新出现

三、安装Kafka服务

1、定义service文件

-- ------------------------------
vim /etc/systemd/system/kafka.service

[Unit]
Description=Apache Kafka server (broker)
After=network.target zookeeper.service

[Service]
Type=forking
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/apps/svr/jdk1.8.0_102/bin:/root/bin
ExecStart=/apps/svr/kafka_vms-2.7.0/bin/kafka-server-start.sh -daemon /apps/svr/kafka_vms-2.7.0/config/server.properties 
# 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
Restart=always
# 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
RestartSec=10
# StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
StartLimitInterval=0
LimitNOFILE=265535

[Install]
WantedBy=multi-user.target

2、若当前已经kafka进程,则可能启动kafka服务失败

jps |grep -i Kafka | awk '{print $1}' |xargs kill

3、更新 systemd,启动kafka服务

systemctl daemon-reload
systemctl enable kafka
systemctl start kafka

4、查看状态

systemctl status kafka -l

这里要说下 配置 LimitNOFILE=265535, 如果将一个 kafka做成了一个 systemd service,那么修改 /etc/sysctl.conf /etc/security/conf的配置未必能够生效。想要验证的话,查看/proc/<kafka pid>/limits中的Max Open Files即可,为啥呢?怀疑kafka service启动时,使用了父进程的 NOFILE配置。

四、参考

  • systemd 使用 https://zhuanlan.zhihu.com/p/56889721
  • Kafka Zookeeper systemd :https://gist.github.com/dyoung522/6f7aab567f70f67030ae4ee0191933c0
  • http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐