【部署有格调】【消息中间件】Kafka单机/集群篇

1,141 阅读4分钟
作者 日期 天气
元公子 2019-12-19(周四) 阴天、小雨

你知道的越少,你不知道的就越少

没有朋友的点赞,就没法升级打怪

一、闲话

话说本周拖了几天没写完,昨晚发现发布了新版本。。。

Kafka 她是一个咖啡的品牌,额。。不对。最初是由领英开发,是一个分布式消息传递和流平台。(这个也必须要登记到阅读源码的延迟队列中.。。。)

另外,她的部署与RocketMQ来对比的话,比较简单,少了定义谁是老大的理解,只需要关心在哪启动几个节点就可以了,剩下的我们内部自己投票搞定。

额。。。对了,Kafka还需要一个男闺蜜伙伴才能使用,他叫ZooKeeper。官方配套送了一个ZooKeeper,你可以选择套餐,或者是单点选择自己安装。

二、下载安装包

​ 官方地址:kafka.apache.org/downloads

​ 下载最新版软件: kafka_2.13-2.4.0.tgz(使用高版本的Scala)

三、系统环境检查/准备

  • Java jdk1.8以上环境
  • 示例使用Centos7操作系统
  • ZooKeeper中间件

四、安装Zookeeper

如客官选择官方的套餐,请参考官方文档,第二步描述如下:

bin/zookeeper-server-start.sh config/zookeeper.properties

如客官您很有个性,想自己单点的话,请参考Zookeeper部署这份菜单。

又如果,您已吃饱了,请忽略上面的废话。。。

五、单机

此章节主要讲述Kafka的单机单节点部署。

1.创建专属用户(可省略此步,直接使用root用户或者您愿意)

创建Linux用户的参考文章

2.选择安装目录(在/soft文件夹放置工具软件,或者按您意思来)

解压缩

[root@hadoop-master /soft]# tar -xvzf kafka_2.13-2.4.0.tgz
[root@hadoop-master /soft]# chown -R hadoop:hadoop kafka_2.13-2.4.0

创建软连接,便于后续的软件升级或多版本切换

[root@hadoop-master /soft]# ln -s kafka_2.13-2.4.0 kafka

3.设置环境变量

文件最底部追加以下内容

[root@hadoop-master /soft]# vi /etc/profile
export KAFKA_HOME=/soft/kafka
export PATH=$PATH:$KAFKA_HOME/bin
执行保存: Esc :wq
[root@hadoop-master /soft]# source /etc/profile

4.改改配置-初段位

  1. 配置文件 config/server.properties。在文件中找到以下内容,浏览并修改。
# 高能提醒使用hadoop用户
[root@hadoop-master /soft]# su - hadoop
[hadoop@hadoop-master ~]$ mkdir -p ~/kafka/config
[hadoop@hadoop-master ~]$ cp /soft/kafka/config/server.properties ~/kafka/config/server.properties
[hadoop@hadoop-master ~]$ vi ~/kafka/config/server.properties
# broker的唯一标识,自然数
broker.id=0
# 监听信息,默认端口9092。PLAINTEXT://本机IP地址或域名:9092
listeners=PLAINTEXT://hadoop-master:9092
# 消息日志路径
log.dirs=/home/hadoop/kafka/data
# zookeeper连接信息。多个zookeeper用英文逗号分隔,可以用hostname或者ip地址+端口号方式填写。
zookeeper.connect=hadoop-master:2181,hadoop-master2:2181,hadoop-dn1:2181
# 是否自动创建topic,默认为true
# auto.create.topics.enable=false
执行保存: Esc :wq
  1. JVM参数

    在bin/kafka-server-start.sh,默认为1G,按需进行调整。

[hadoop@hadoop-master ~]$ cp /soft/kafka/bin/kafka-server-start.sh /soft/kafka/bin/kafka-server-start.sh.bak
[hadoop@hadoop-master ~]$ vi /soft/kafka/bin/kafka-server-start.sh
# 找到此行修改:export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
export KAFKA_HEAP_OPTS="-Xmx256m -Xms256m"
执行保存: Esc :wq
  1. 日志路径

    在bin/kafka-run-class.sh,定义LOG_DIR环境变量。

[hadoop@hadoop-master ~]$ cp /soft/kafka/bin/kafka-run-class.sh /soft/kafka/bin/kafka-run-class.sh.bak
[hadoop@hadoop-master ~]$ vi /soft/kafka/bin/kafka-run-class.sh
# 参考行limitations under the License.
# 下面增加变量,后面可以在自启动服务中定义环境变量来替换。
LOG_DIR="/home/hadoop/kafka/logs"
执行保存: Esc :wq

5.启动测试

使用hadoop用户。因指令已加入到环境变量,可在随意目录下执行。

[hadoop@hadoop-master /soft/kafka]$ kafka-server-start.sh /home/hadoop/kafka/config/server.properties
# 后台启动:kafka-server-start.sh -daemon /home/hadoop/kafka/config/server.properties

[hadoop@hadoop-master /soft/kafka]$ jps
58301 Kafka

其它关联指令:

​ 停止服务:kafka-server-stop.sh

六、集群

Kafka集群,主要还是注意两个方面。一个是每个节点的配置文件(server.properties),另外一个是日志文件存储的路径。但如果您对日志不关心的话,这方面可以忽略。这次我们还是增加难度,在一台机器部署3个服务节点。来吧,骚年。。。

为啥老弄单台,一来在练习时,多台太麻烦。二来,因为这类资料网上还是比较少。如果客官您就想要多台,看完这篇后,多台您就发挥聪明才智,自己搞定。那就与我没关系了,您是不是好厉害啊~

  1. 新增三个server.properties文件,并放置到集群文件夹,具体如下所示:
# 高能提醒使用hadoop用户
[hadoop@hadoop-master /soft/kafka]$ mkdir -p ~/kafka/cluster
[hadoop@hadoop-master /soft/kafka]$ cp /soft/kafka/config/server.properties ~/kafka/cluster/server-1.properties
[hadoop@hadoop-master /soft/kafka]$ cp /soft/kafka/config/server.properties ~/kafka/cluster/server-2.properties
[hadoop@hadoop-master /soft/kafka]$ cp /soft/kafka/config/server.properties ~/kafka/cluster/server-3.properties
  1. 编辑三个配置文件,主要修改内容broker.id、listeners、log.dirs

    server-1.properties

[hadoop@hadoop-master /soft/kafka]$ vi ~/kafka/cluster/server-1.properties
broker.id=1
listeners=PLAINTEXT://hadoop-master:9093
log.dirs=/home/hadoop/kafka/cluster/server-1/data
zookeeper.connect=hadoop-master:2181,hadoop-master2:2181,hadoop-dn1:2181
执行保存: Esc :wq

​ server-2.properties

[hadoop@hadoop-master /soft/kafka]$ vi ~/kafka/cluster/server-2.properties
broker.id=2
listeners=PLAINTEXT://hadoop-master:9094
log.dirs=/home/hadoop/kafka/cluster/server-2/data
zookeeper.connect=hadoop-master:2181,hadoop-master2:2181,hadoop-dn1:2181
执行保存: Esc :wq

​ server-3.properties

[hadoop@hadoop-master /soft/kafka]$ vi ~/kafka/cluster/server-3.properties
broker.id=3
listeners=PLAINTEXT://hadoop-master:9095
log.dirs=/home/hadoop/kafka/cluster/server-3/data
zookeeper.connect=hadoop-master:2181,hadoop-master2:2181,hadoop-dn1:2181
执行保存: Esc :wq
  1. 新增kafka-server-stop-single.sh 脚本,以支持停止单个服务。关键是grep java 替换为$1.properties
[hadoop@hadoop-master /soft/kafka]$ cp /soft/kafka/bin/kafka-server-stop.sh ~/kafka/kafka-server-stop-single.sh
[hadoop@hadoop-master /soft/kafka]$ vi ~/kafka/kafka-server-stop-single.sh
# 覆盖原命令
PIDS=$(ps ax | grep -i 'kafka\.Kafka' | grep $1.properties | grep -v grep | awk '{print $1}')
执行保存: Esc :wq
  1. 新增三个启动服务,主要留意日志环境变量和相应的server.properties文件

​ kafka-1.service

# 高能提醒使用root用户
[root@hadoop-master /soft/kafka]# vi /etc/systemd/system/kafka-1.service
[Unit]
Description=kafka  
After=syslog.target network.target

[Service]
Type=forking
User=hadoop
Group=hadoop

Environment=JAVA_HOME=/soft/jdk
Environment=LOG_DIR=/home/hadoop/kafka/cluster/server-1/logs
ExecStart=/soft/kafka/bin/kafka-server-start.sh -daemon /home/hadoop/kafka/cluster/server-1.properties
ExecStop=/home/hadoop/kafka/kafka-server-stop-single.sh server-1

[Install]
WantedBy=multi-user.target
执行保存: Esc :wq
[root@hadoop-master /soft/kafka]# chmod 755 /etc/systemd/system/kafka-1.service
[root@hadoop-master /soft/kafka]# systemctl enable kafka-1
kafka-2.service
# 只摘取不一样的配置
Environment=JAVA_HOME=/soft/jdk
Environment=LOG_DIR=/home/hadoop/kafka/cluster/server-2/logs
ExecStart=/soft/kafka/bin/kafka-server-start.sh -daemon /home/hadoop/kafka/cluster/server-2.properties
ExecStop=/home/hadoop/kafka/kafka-server-stop-single.sh server-2
执行保存: Esc :wq
[root@hadoop-master /soft/kafka]# chmod 755 /etc/systemd/system/kafka-2.service
[root@hadoop-master /soft/kafka]# systemctl enable kafka-2
kafka-3.service
Environment=JAVA_HOME=/soft/jdk
Environment=LOG_DIR=/home/hadoop/kafka/cluster/server-3/logs
ExecStart=/soft/kafka/bin/kafka-server-start.sh -daemon /home/hadoop/kafka/cluster/server-3.properties
ExecStop=/home/hadoop/kafka/kafka-server-stop-single.sh server-3
执行保存: Esc :wq
[root@hadoop-master /soft/kafka]# chmod 755 /etc/systemd/system/kafka-3.service
[root@hadoop-master /soft/kafka]# systemctl enable kafka-3
  1. 启动、停止这三个服务试试吧。如果不想玩了,再试试禁用服务。
  2. 睡觉。。。

七、服务自启动

使用root用户

[root@hadoop-master /soft/kafka]# vi /etc/systemd/system/kafka.service
# 或者 vi /lib/systemd/system/kafka.service
# 文件开始
[Unit]
Description=kafka  
After=syslog.target network.target

[Service]
Type=forking
User=hadoop
Group=hadoop
# 增加环境变量,或者在bin/kafka-run-class.sh中添加。不加的话,实验证明会报错
Environment=JAVA_HOME=/soft/jdk
Environment=LOG_DIR=/home/hadoop/kafka/logs
ExecStart=/soft/kafka/bin/kafka-server-start.sh -daemon /home/hadoop/kafka/config/server.properties
ExecStop=/soft/kafka/bin/kafka-server-stop.sh
# 此项会导致停止进程后,又自动启动服务,很霸道
#Restart=on-failure

[Install]
WantedBy=multi-user.target
执行保存: Esc :wq
[root@hadoop-master /soft/kafka]# chmod 755 /etc/systemd/system/kafka.service
[root@hadoop-master /soft/kafka]# systemctl enable kafka
[root@hadoop-master /soft/kafka]# service kafka start

其它关联指令:

  • 停止:service kafka stop
  • 查看服务状态:service kafka status
  • 修改服务的配置内容后,重新加载生效:systemctl daemon-reload
  • 禁用开机服务(禁止后是否删除服务文件,您随意):systemctl disable kafka
  • 查看服务是否开机启动:systemctl is-enabled kafka
  • 查看已启动的服务列表:systemctl list-unit-files --type=service | grep enabled

八、偶遇的坑

1. 停止不了Kafka进程

​ 我在部署时没遇到此问题,这里备案下网上大佬们的解决办法,以防有伙伴们遇到。

​ 编辑bin/kafka-server-stop.sh脚本,解决思路:从jps中找到Kafka的进程ID

# 参考行PIDS=$(ps ax | grep -i 'kafka\.Kafka' | grep java | grep -v grep | awk '{print $1}')
# 注释掉参考行,并增加以下内容代替,'kafka.Kafka'过滤字符可根据实际情况进行调整
PIDS=$(jps -lm | grep -i 'kafka.Kafka' | awk '{print $1}')
# 或者下面的命令
#PIDS=$(ps ax | grep -i 'Kafka' | grep java | grep -v grep | awk '{print $1}') 
执行保存: Esc :wq

附录: