Kafka 官网
1. Kafka 介绍
推荐一个可以监控 Kafka Topic 的工具:kafka-eagle
1.1 什么是Kafka
Kafka是一个分布式消息队列。 Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是consumer都依赖于Zookeeper集群保存一些meta信息,来保证系统可用性。
1.2 Kafka 优点
解耦 :在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。冗余(副本) :有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。扩展性 :因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。灵活性&峰值处理能力 :在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。可恢复性 :系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。顺序保证 :在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。缓冲 :在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。异步通信 :很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
1.3 Kafka 架构
broker:Kafka 集群包含一个或多个服务器,服务器节点称为broker。broker存储topic的数据。
如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。 Topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处),类似于数据库的表名。 Partition:topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。其实就是一个文件夹,文件夹的命名规则为topic名称-序号。 Producer:生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。 Consumer:消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。 Consumer Group:简称(CG),每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制-给consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。 Leader:每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。 Follower:Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。 Offset:某个或某组consumer读取某个partition的偏移量。 同一个partition不同的consumer有不同的offset。同时consumer有个组的概念,使用同一个group id,也就是同属于某个组的consumer,共用offset。
2. Kafka 集群部署
本次部署是以CDH5.16.2为基准。 本次部署是在一个机器上面不是三个broker的Kafka。
2.1 部署前提
需要部署Zookeeper,之前文章已经完成Zookeeper集群部署了。
2.2 部署Kfaka
下载
2.2.1 开启Zookeeper 集群
[root@bigdatatest01 ~]# cd app/
[root@bigdatatest01 app]# cd zk1/
[root@bigdatatest01 zk1]# bin/zkServer.sh start
JMX enabled by default
Using config: /root/app/zk1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@bigdatatest01 zk1]# cd ../zk2/
[root@bigdatatest01 zk2]# bin/zkServer.sh start
JMX enabled by default
Using config: /root/app/zk2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@bigdatatest01 app]# zk3/bin/zkServer.sh start
JMX enabled by default
Using config: /root/app/zk3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@bigdatatest01 app]# zk1/bin/zkServer.sh status
JMX enabled by default
Using config: /root/app/zk1/bin/../conf/zoo.cfg
Mode: follower
[root@bigdatatest01 app]# zk2/bin/zkServer.sh status
JMX enabled by default
Using config: /root/app/zk2/bin/../conf/zoo.cfg
Mode: leader
[root@bigdatatest01 app]# zk3/bin/zkServer.sh status
JMX enabled by default
Using config: /root/app/zk3/bin/../conf/zoo.cfg
Mode: follower
2.2.2 下载文件并解压
[root@bigdatatest01 app]# cd ~/software/
[root@bigdatatest01 software]# wget http://archive.cloudera.com/kafka/kafka/4/kafka-2.2.1-kafka4.1.0.tar.gz
[root@bigdatatest01 software]# tar -xzvf kafka-2.2.1-kafka4.1.0.tar.gz -C ~/app/
[root@bigdatatest01 software]# cd ~/app/
[root@bigdatatest01 app]# cp -r kafka_2.11-2.2.1-kafka-4.1.0 kafka01
[root@bigdatatest01 app]# cp -r kafka_2.11-2.2.1-kafka-4.1.0 kafka02
[root@bigdatatest01 app]# cp -r kafka_2.11-2.2.1-kafka-4.1.0 kafka03
2.2.3 修改配置文件
[root@bigdatatest01 ~]# cd tmp/
[root@bigdatatest01 tmp]# mkdir kafka01
[root@bigdatatest01 tmp]# mkdir kafka02
[root@bigdatatest01 tmp]# mkdir kafka03
[root@bigdatatest01 tmp]# cd kafka01
[root@bigdatatest01 kafka01]# pwd
/root/tmp/kafka01
[root@bigdatatest01 app]# vim kafka01/config/server.properties
broker.id=0
host.name=localhost
port=9092
log.dirs=/root/tmp/kafka01
zookeeper.connect=bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
[root@bigdatatest01 app]# vim kafka02/config/server.properties
broker.id=1
host.name=localhost
port=9093
log.dirs=/root/tmp/kafka02
zookeeper.connect=bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
[root@bigdatatest01 app]# vim kafka03/config/server.properties
broker.id=2
host.name=localhost
port=9094
log.dirs=/root/tmp/kafka03
zookeeper.connect=bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
2.2.4 启动Kafka
[root@bigdatatest01 app]# cd kafka01
[root@bigdatatest01 kafka01]# nohup bin/kafka-server-start.sh config/server.properties &
[root@bigdatatest01 kafka01]# cd ../kafka02
[root@bigdatatest01 kafka02]# nohup bin/kafka-server-start.sh config/server.properties &
[root@bigdatatest01 kafka02]# cd ../kafka03/
[root@bigdatatest01 kafka03]# nohup bin/kafka-server-start.sh config/server.properties &
Zookeeper 中的 Kafka 数据是否存储
[root@bigdatatest01 bin]# cd ~
[root@bigdatatest01 ~]# cd app/zk1/bin/
[root@bigdatatest01 bin]# ./zkCli.sh
[zk: localhost:2181(CONNECTED) 1] ls /kafka
[cluster, controller_epoch, controller, brokers, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
3. Kafka 常用命令
3.1 创建 Topic
partitions :分区数据量和 broker 节点数没有关系 replication-factor:副本数必须小于等于 broker 节点数
[root@bigdatatest01 ~]# cd ~
[root@bigdatatest01 ~]# cd app/kafka01/bin
[root@bigdatatest01 bin]# ./kafka-topics.sh --create \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183 \
> --partitions 3 \
> --replication-factor 1 \
> --topic bigdata
Error while executing topic command : Replication factor: 1 larger than available brokers: 0.
[2021-01-27 15:46:33,919] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0.
(kafka.admin.TopicCommand$)
问题出错原因:配置文件名一样,改下配置文件名并启动
[root@bigdatatest01 bin]# cd ~
[root@bigdatatest01 ~]# cd app/kafka01/config/
[root@bigdatatest01 config]# cp server.properties server-0.properties
[root@bigdatatest01 kafka01]# nohup bin/kafka-server-start.sh config/server-0.properties &
[root@bigdatatest01 kafka01]# cd ../kafka02/config/
[root@bigdatatest01 config]# cp server.properties server-1.properties
[root@bigdatatest01 config]# cd ../
[root@bigdatatest01 kafka02]# nohup bin/kafka-server-start.sh config/server-1.properties &
[root@bigdatatest01 kafka02]# cd ../kafka03/config/
[root@bigdatatest01 config]# cp server.properties server-2.properties
[root@bigdatatest01 config]# cd ../
[root@bigdatatest01 kafka03]# nohup bin/kafka-server-start.sh config/server-2.properties &
发现继续报错 命令有问题,修改命令。 问题原因是因为 Kafka 保存在 ZK上面元数据目录是:/kafka,所以在 --zookeeper 这个参数后面需要添加 /kafka
./kafka-topics.sh --create \
--zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
--partitions 3 \
--replication-factor 3 \
--topic bigdata
[root@bigdatatest01 kafka03]# cd bin
[root@bigdatatest01 bin]# ./kafka-topics.sh --create \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
> --partitions 3 \
> --replication-factor 3 \
> --topic bigdata
Created topic bigdata.
3.2 查看创建的 Topic
./kafka-topics.sh --list \
--zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
[root@bigdatatest01 bin]# ./kafka-topics.sh --list \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
bigdata
3.3 查看 Topic 具体描述
./kafka-topics.sh --describe \
--zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
--topic bigdata
[root@bigdatatest01 bin]# ./kafka-topics.sh --describe \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
> --topic bigdata
Topic:bigdata PartitionCount:3 ReplicationFactor:3 Configs:
Topic: bigdata Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: bigdata Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: bigdata Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
描述信息详解:
第一行 :topic的名称 分区数量 副本数量 第二行开始 : 每一行列出每一个分区的信息,是第几个分区,leader是在哪个broker上,副本是位于哪些broker上,有哪些副本处理同步状态的。 Leader: 负责该分区的读写节点 另外两个同步数据的。 Isr:以第一条详细信息为例(Topic: bigdata Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0),此条信息中 Leader 为 1,Isr 代表几个 broker 的优先级,如果 1 挂了,则 Leader 由 2 顶上,如果 2 也挂了,才可以排到 0 作为 Leader。
3.4 删除 Topic
./kafka-topics.sh --delete \
--zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
--topic bigdata
[root@bigdatatest01 bin]# ./kafka-topics.sh --delete \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
> --topic bigdata
Topic bigdata is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
[root@bigdatatest01 bin]# ./kafka-topics.sh --list \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka
生产上尽量不要删除 Topic,如果逼不得已需要删除,则需要删除: Linux 磁盘文件夹 (log.dirs 这个参数配置),把对应的 Topic 文件夹给删除
[root@bigdatatest01 kafka01]# pwd
/root/tmp/kafka01
[root@bigdatatest01 kafka01]# ll
total 20
drwxr-xr-x 2 root root 141 Jan 27 17:31 bigdata-0
drwxr-xr-x 2 root root 141 Jan 27 17:31 bigdata-1
drwxr-xr-x 2 root root 141 Jan 27 17:31 bigdata-2
-rw-r--r-- 1 root root 4 Jan 27 17:28 cleaner-offset-checkpoint
-rw-r--r-- 1 root root 4 Jan 27 17:32 log-start-offset-checkpoint
-rw-r--r-- 1 root root 54 Jan 27 16:35 meta.properties
-rw-r--r-- 1 root root 40 Jan 27 17:32 recovery-point-offset-checkpoint
-rw-r--r-- 1 root root 40 Jan 27 17:32 replication-offset-checkpoint
ZK的元数据中对应的 Topic 数据也需要删除
/kafka/brokers/topics /kafka/config/topics
[zk: localhost:2181(CONNECTED) 0] ls /kafka/brokers/topics
[bigdata]
[zk: localhost:2181(CONNECTED) 1] ls /kafka/config/topics
[bigdata]
3.5 修改 Topic 信息
./kafka-topics.sh --alter \
--zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
--partitions 4 \
--topic bigdata
[root@bigdatatest01 bin]# ./kafka-topics.sh --alter \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
> --partitions 4 \
> --topic bigdata
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Adding partitions succeeded!
[root@bigdatatest01 bin]# ./kafka-topics.sh --describe \
> --zookeeper bigdatatest01:2181,bigdatatest01:2182,bigdatatest01:2183/kafka \
> --topic bigdata
Topic:bigdata PartitionCount:4 ReplicationFactor:3 Configs:
Topic: bigdata Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: bigdata Partition: 1 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: bigdata Partition: 2 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: bigdata Partition: 3 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1
3.6 自动迁移数据到新的节点
自动迁移数据到新的节点(官方提供)
3.7 启动一个生产者
./kafka-console-producer.sh \
--broker-list bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:9094 \
--topic bigdata
[root@bigdatatest01 bin]# ./kafka-console-producer.sh \
> --broker-list bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:9094 \
> --topic bigdata
>1
>2
>3
3.8 启动一个消费者
./kafka-console-consumer.sh \
--bootstrap-server bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:9094 \
--topic bigdata \
--from-beginning
[root@bigdatatest01 bin]# ./kafka-console-consumer.sh \
> --bootstrap-server bigdatatest01:9092,bigdatatest01:9093,bigdatatest01:9094 \
> --topic bigdata \
> --from-beginning
1
2
3