一、简介
Apache Kafka是linkedin使用Scala编写具有高水平扩展和高吞吐量的分布式消息系统。Kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker无论是Kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性(kafka在3.0版本以后取消了zookeeper依赖),为集群保存一些meta信息。
Kafka是一个分布式流处理平台,与传统MQ有着本质区别,Producer与Consumer建立一次连接就可以源源不断发送消息和消费消息,在一些大数据,直播弹幕等等,实时性要求强的情况下适用。流处理平台特性有以下几点:
- 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
- 可以储存流式的记录,并且有较好的容错性。
- 可以在流式记录产生时就进行处理。
- 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。(相当于消息队列)
- 构建实时流式应用程序,对这些流数据进行转换或者影响。(类使用SpringAOP)
二、Kafka的重要概念
- Kafka作为一个集群运行在一个或多个服务器上。
- Kafka通过Topic对存储的流数据进行分类,Topic就是数据主题,是数据记录发布的地方(每条记录中包含一个key,一个value和一个timestamp时间戳),可以用来区分业务系统。Topic总是多订阅模式,一个Topic可以拥有一个或多个消费者来订阅它的数据。
- Partition分区,可理解我一个有序的消息队列,每条记录都会分配一个唯一序号,称为Offset偏移量,并存放在zookeeper中。
- Distribution,Log的分区被分布到集群中的多个服务器上,每个服务器处理它分到的分区,根据配置每个分区,还可以复制到其它服务器作为备份容错。每个分区有一个leader,零或多个follower。Leader处理此分区的所有的读写请求,而follower被动的复制数据。如果leader宕机,其它的一个follower会被推举为新的leader。一台服务器可能同时是一个分区的leader,另一个分区的follower。这样可以平衡负载,避免所有的请求都只让一台或者某几台服务器处理。
- Producers,生产者往某个Topic上发布消息,生产者也负责选择发布到Topic上的哪一个分区。最简单的方式从分区列表中轮流选择,也可以根据某种算法依照权重选择分区。
- Consumers,消费者使用一个消费组名称来进行标识,发布到topc中的每条记录被分配给订阅消费组中的一个消费者实例。消费者实例可以分布在多个进程中或者多个机器上。
· 如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例。
· 如果所有的消费者实例在不同的消费组中每条消息记录会广播到所有的消费者进程。 -
Consumer group:消费者组,由多个消费者consumer组成。消费者组内每个消费者负责消费不同的分区,一个分区只能由同一个消费者组内的一个消费者消费;消费者组之间相互独立,互不影响。所有的消费者都属于某个消费者组,即消费者组是一个逻辑上的订阅者。
三、Kafka核心Api
Producer API:允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
Consumer APl:允许一个应用程序订阅一个或多个topc,并且对发布给他们的流式数据进行处理。
Streams APl:允许一个应用程序作为一个流处理器,消费一个或者多个topc产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
Connector API:允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。
Admin API:管理 API 支持管理和检查主题、代理、坐标和其他 Kafka 对象。
四、Linux集群部署
下载kafka的安装包,并进行解压:
[root@bigdata01 kraft]$ cd /opt/soft/
[root@bigdata01 soft]$ wget http://archive.apache.org/dist/kafka/3.3.1/kafka_2.13-3.3.1.tgz
[root@bigdata01 soft]$ tar -zxf kafka_2.13-3.3.1.tgz -C /opt/install/
修改kafka的配置文件broker.properties:
[root@bigdata01 kafka_2.13-3.3.1]$ cd /opt/install/kafka_2.13-3.3.1/config/kraft/
[root@bigdata01 kraft]$ vim broker.properties
修改编辑内容如下:
[root@bigdata01 kafka_2.13-3.3.1]$ mkdir -p /opt/install/kafka_2.13-3.3.1/kraftlogs
[root@bigdata01 kafka_2.13-3.3.1]$ mkdir -p /opt/install/kafka_2.13-3.3.1/topiclogs
修改完成复制其他包到拷贝虚拟机上。
启动kafka服务:
[root@bigdata01 kafka_2.13-3.3.1]$ ./bin/kafka-storage.sh random-uuid
CJtDsFwx24e5SGb-gD2smb
[root@bigdata01 kafka_2.13-3.3.1]$ ./bin/kafka-storage.sh format -t CJtDsFwx24e5SGb-gD2smb -c ./config/kraft/server.properties
Formatting /opt/install/kafka_2.13-3.3.1/topiclogs
[root@bigdata01 kafka_2.13-3.3.1]$ ./bin/kafka-server-start.sh ./config/kraft/server.properties
集群启动成功之后,使用以下命令来创建kafka的topic:
[root@bigdata01 kafka_2.13-3.3.1]$ ./bin/kafka-topics.sh --create --topic kafka_test --partitions 3 --replication-factor 2 --bootstrap-server bigdata01:9092,bigdata02:9092,bigdata03:9092
组成集群之后,任意一台机器就可以通过以下命令来查看到刚才创建的topic了:
[root@bigdata03 ~]$ cd /opt/install/kafka_2.13-3.3.1/
[root@bigdata03 kafka_2.13-3.3.1]$ bin/kafka-topics.sh --list --bootstrap-server bigdata01:9092,bigdata02:9092,bigdata03:9092
使用命令行来生产以及消费kafka当中的消息:
[root@bigdata01 kafka_2.12-3.1.0]$ bin/kafka-console-producer.sh --bootstrap-server bigdata01:9092,bigdata02:9092,bigdata03:9092 --topic kafka_test
[root@bigdata02 kafka_2.12-3.1.0]$ bin/kafka-console-consumer.sh --bootstrap-server bigdata01:9092,bigdata02:9092,bigdata03:9092 --topic kafka_test --from-beginning