文章目录
简介
1.什么是kafka?
Apache Kafka是分布式发布订阅消息系统,最初由LinkedIn公司开发,之后称为apache项目的一部分。Kafka使用Scala编写,是一种快速的、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与kafka集成。据了解kafka每秒可生产约25万(50MB)的消息,每秒处理55万(110MB)消息。
其设计主要目标为:
1、以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上的数据也能保证常数时间复杂度的访问性能。
2、高吞吐率。即使在非常廉价的机器上也能做到单机支持每秒100K条以上的传输性能。
3、支持Kafka Server的消息分区,及分布式消费,同时保证每个Partition内的消息传输。
4、同时支持离线数据处理和实时数据处理。
5、Scale out:支持水平扩展。
2.Kafka的概念
1、Producer:消息生产者,就是向kafka broker发消息的客户端。
2、Consumer:消息消费者,向kafka broker取消息的客户端。
3、Topic:特定类型的消息流,可以理解为一个队列。
4、Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个CG只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
5、Broker:已发布的消息保存在一组服务器中,称之为Kafka集群。一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
6、Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。
7、Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。
3.Kafka架构
Kafka集群的业务处理示意如上图所示。生产者发布消息到集群中,消费者订阅某topic,创建消息流。生产者发布到该话题的消息被均衡地分发到这些流中。
kafka整体架构图
Kafka的整体架构如上图所示,展示了生产者、消费者、Topic、Partition之间的关系和数据传递。因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理。为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区。多个生产者和消费者能够同时生产和获取消息。
提示:以下是本篇文章正文内容,下面案例可供参考
使用步骤(以下步骤三台服务器都要操作一遍)
1.准备工作
1、一般情况下,Kafka至少需要准备三台已经搭建好zookeeper集群环境的服务器,具体安装步骤见https://blog.csdn.net/dashen110/article/details/112650230
2、下载Kafka安装包
https://www.apache.org/dyn/closer.cgi?path=/kafka/1.1.1/kafka_2.12-1.1.1.tgz
2.开始搭建集群
1、把下载的安装包上传至/usr/local目录下,输入tar -zxvf kafka_2.12-1.1.1.tgz
命令解压并把文件名称改为kafka
2、配置环境变量
输入vi /root/.bashrc
回车,然后配置kafka的路径,多个配置用:隔开
3、修改配置文件
输入cd /usr/local/kafka/config
命令进入配置文件夹
输入vi server.properties
编辑配置文件
(1) 修改broker.id,确保每台机器的broker.id不一致,本文3台服务器的broker.id分别设置为1、2、3;
(2) port默认为9092,可以根据需要进行修改,一般情况下保持3台服务器一致;
(3) 修改host.name为本机真实IP;
(4) 修改zookeeper.connect,其值为所有服务器上zookeeper的IP端口串,如下所示:
zookeeper.connect=192.168.201.129:2181,192.168.201.131:2181,192.168.201.132:2181
(5) log.dirs=/usr/local/apps/kafka/kafka-logs 配置kafka日志目录
2.启动Kafka集群
启动顺序为启动Zookeeper—>启动Kafka。
启动Zookeeper详见https://blog.csdn.net/dashen110/article/details/112650230
后台启动Kafka:
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
3.操作Kafka命令
(1)创建一个名称为test1的Topic,7个分区,并且复制因子为3
/usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.201.129:2181,192.168.201.131:2181,192.168.201.132:2181 --replication-factor 3 --partitions 7 --topic test1
(2)查看创建的topic信息,需要进入kafka的bin目录下
/usr/local/kafka/bin/kafka-topics.sh --describe --zookeeper 192.168.201.129:2181,192.168.201.131:2181,192.168.201.132:2181 --topic test1
(3)在其中一台服务器启动生产者(producer)
/usr/local/kafka/bin/kafka-console-producer.sh --broker-list 192.168.201.129:9092,192.168.201.131:9092,192.168.201.132:9092 --topic test1
(4)在任意议一台服务器启动消费者(consumer),接受消息
/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.201.129:9092,192.168.201.131:9092,192.168.201.132:9092 --topic test1 --from-beginning