小白学习Kafka集群部署

223 阅读5分钟

一、前言

1、Kafka简介

Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台。Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消息功能添加了Kafka Connect、Kafka Streams以支持连接其他系统的数据(ElasticsearchHadoop等)

Kafka最核心的最成熟的还是他的消息引擎,所以Kafka大部分应用场景还是用来作为消息队列削峰平谷。另外,Kafka也是目前性能最好的消息中间件。

2、Kafka架构

image.png

在Kafka集群(Cluster)中,一个Kafka节点就是一个Broker,消息由Topic来承载,可以存储在1个或多个Partition中。发布消息的应用为Producer、消费消息的应用为Consumer,多个Consumer可以促成Consumer Group共同消费一个Topic中的消息。

概念/对象简单说明
BrokerKafka节点
Topic主题,用来承载消息
Partition分区,用于主题分片存储
Producer生产者,向主题发布消息的应用
Consumer消费者,从主题订阅消息的应用
Consumer Group消费者组,由多个消费者组成

3、准备工作

1、Kafka服务器

准备2台CentOS服务器

服务器名IP说明
kafka01192.168.174.131Kafka节点1
kafka02192.168.174.130Kafka节点2

软件版本说明

说明
Linux ServerCentOS 7
Kafkakafka_2.12-3.7.0
2、ZooKeeper集群

Kakfa集群需要依赖ZooKeeper存储Broker、Topic等信息,这里我们部署两台ZK

服务器名IP说明
zk01192.168.174.131ZooKeeper节点
zk02192.168.174.130ZooKeeper节点

部署过程参考:小白学习ZooKeeper集群部署

二、部署

1、应用&数据目录

#创建应用目录 
mkdir /usr/kafka 

#创建Kafka数据目录 
mkdir /usr/kafka/data
mkdir /usr/kafka/logs 

chmod 777 -R /usr/kafka

2、下载&解压

cd /tmp

#下载安装包 
wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.7.0/kafka_2.12-3.7.0.tgz

#解压到应用目录 
tar -zvxf kafka_2.12-3.7.0.tgz -C /usr/kafka

# 编辑/etc/profile,将添加kafka环境变量
vi /etc/profile

export KAFKA_HOME=/usr/kafka/kafka_2.12-3.7.0
export PATH=$PATH:$KAFKA_HOME/bin

# 使环境变量生效
source /etc/profile

# 查看环境变量
echo $KAFKA_HOME

kafka_2.12-3.7.0.tgz 其中2.12是Scala编译器的版本,3.7.0才是Kafka的版本

3、Kafka节点配置

#进入应用目录 
cd /usr/kafka/kafka_2.12-3.7.0

#修改配置文件 
vi config/server.properties
通用配置

配置日志目录、指定ZooKeeper服务器

# A comma separated list of directories under which to store log files
log.dirs=/usr/kafka/logs

# Zookeeper connection string (see zookeeper docs for details).
# This is a comma separated host:port pairs, each corresponding to a zk
# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
# You can also append an optional chroot string to the urls to specify the
# root directory for all kafka znodes.
zookeeper.connect=192.168.174.131:2181,192.168.174.130:2181
分节点配置
  • Kafka01

注意:

broker.id一定要记得配,且集群中的每个id都必须唯一,默认第一个节点的id为0,之后依次为1、2、3等等。若其他节点的id和该节点的id一样,会导致集群报该节点已启动的错误,从而导致topic的数量出现问题。

# The id of the broker. This must be set to a unique integer for each broker.
broker.id=0

# The address the socket server listens on. If not configured, the host name will be equal to the value of
# java.net.InetAddress.getCanonicalHostName(), with PLAINTEXT listener name, and port 9092.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092
listeners=PLAINTEXT://192.168.174.131:9092
  • Kafka02
# The id of the broker. This must be set to a unique integer for each broker.
broker.id=1

# The address the socket server listens on. If not configured, the host name will be equal to the value of
# java.net.InetAddress.getCanonicalHostName(), with PLAINTEXT listener name, and port 9092.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
#listeners=PLAINTEXT://:9092
listeners=PLAINTEXT://192.168.174.130:9092

4、防火墙配置

每个节点都要开放9092端口

#开放端口 
firewall-cmd --add-port=9092/tcp --permanent

#重新加载防火墙配置 
firewall-cmd --reload

5、启动Kafka

启动所有节点的Kafka

#进入kafka根目录 
cd /usr/kafka/kafka_2.12-3.7.0

#启动 
bin/kafka-server-start.sh config/server.properties &

#启动成功输出示例(最后几行) 
[2019-06-26 21:48:57,183] INFO Kafka commitId: fc1aaa116b661c8a (org.apache.kafka.common.utils.AppInfoParser)
[2019-06-26 21:48:57,183] INFO Kafka startTimeMs: 1561531737175 (org.apache.kafka.common.utils.AppInfoParser) 
[2019-06-26 21:48:57,185] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)

三、开机自启动

1、在/etc/systemd/system/文件夹下创建一个启动脚本kafka.service

vi /etc/systemd/system/kafka.service

内容如下:

[Unit]
Description=Apache Kafka
After=network.target zookeeper.service
Wants=zookeeper.service

[Service]
# 不使用forking
Type=simple
User=root
Group=root
Environment=JAVA_HOME=/opt/jdk-11
ExecStart=/opt/kafka_2.12-3.7.0/bin/kafka-server-start.sh /opt/kafka_2.12-3.7.0/config/server.properties
ExecStop=/opt/kafka_2.12-3.7.0/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=10
TimeoutSec=360
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

2、启动kafka

systemctl daemon-reload
systemctl start kafka

3、开机自启动

systemctl enable kafka

4、检查是否已经开机启动

systemctl is-enabled kafka

三、Kafka测试

1、创建Topic

在kafka01(Broker)上创建测试Tpoic:test-ken-io,这里我们指定了2个副本、1个分区

bin/kafka-topics.sh --create --bootstrap-server 192.168.174.131:9092 --replication-factor 2 --partitions 1 --topic test-ken-io

Topic在kafka01上创建后也会同步到集群中另外一个Broker:kafka02

2、查看Topic

我们可以通过命令列出指定Broker

bin/kafka-topics.sh --list --bootstrap-server 192.168.174.130:9092

3、发送消息

bin/kafka-console-producer.sh --broker-list 192.168.174.131:9092 --topic test-ken-io 
#消息内容 
> test by ken.io

4、消费消息

在Kafka02上消费Broker01的消息

bin/kafka-console-consumer.sh --bootstrap-server 192.168.174.131:9092 --topic test-ken-io --from-beginning

在Kafka02上消费Broker01的消息

bin/kafka-console-consumer.sh --bootstrap-server 192.168.174.130:9092 --topic test-ken-io --from-beginning

然后均能收到消息

test by ken.io

这是因为这两个消费消息的命令是建立了两个不同的Consumer,如果我们启动Consumer指定Consumer Group Id就可以作为一个消费组协同工,1个消息同时只会被一个Consumer消费到

bin/kafka-console-consumer.sh --bootstrap-server 192.168.174.131:9092 --topic test-ken-io --from-beginning --group testgroup_ken 

bin/kafka-console-consumer.sh --bootstrap-server 192.168.174.130:9092 --topic test-ken-io --from-beginning --group testgroup_ken

四、备注

1、Kafka常用配置项说明

Kafka常用Broker配置说明:

配置项默认值/示例值说明
broker.id0Broker唯一标识
listenersPLAINTEXT://192.168.174.131:9092监听信息,PLAINTEXT表示明文传输
log.dirskafka/logskafka数据存放地址,可以填写多个。用","间隔
message.max.bytesmessage.max.bytes单个消息长度限制,单位是字节
num.partitions1默认分区数
log.flush.interval.messagesLong.MaxValue在数据被写入到硬盘和消费者可用前最大累积的消息的数量
log.flush.interval.msLong.MaxValue在数据被写入到硬盘前的最大时间
log.flush.scheduler.interval.msLong.MaxValue检查数据是否要写入到硬盘的时间间隔。
log.retention.hours24控制一个log保留时间,单位:小时
zookeeper.connect192.168.174.131:2181ZooKeeper服务器地址,多台用","间隔

参考