1、Kafka简介
1.1、什么是Kafka
Apache Kafka是分布式发布-订阅消息系统(消息中间件)。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。
1.2 、Apache Kafka与传统消息系统相比,有以下不同:
1.它是分布式系统,易于向外扩展;
2.它同时为发布和订阅提供高吞吐量;
3.它支持多订阅者,当失败时能自动平衡消费者;
4.它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。
1.3、Kafka术语
术语 | 解释 |
Broker | Kafka集群包含一个或多个服务器,这种服务器被称为broker |
Topic
| 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处) |
Partition | Partition是物理上的概念,每个Topic包含一个或多个Partition. |
Producer | 负责发布消息到Kafka broker |
Consumer | 消息消费者,向Kafka broker读取消息的客户端 |
Consumer Group | 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group) |
replica | partition 的副本,保障 partition 的高可用 |
leader | replica 中的一个角色, producer 和 consumer 只跟 leader 交互 |
follower | replica 中的一个角色,从 leader 中复制数据 |
controller | Kafka 集群中的其中一个服务器,用来进行 leader election 以及各种 failover |
2、Kafka的安装
2.1 下载
下载官网 :http://kafka.apache.org/downloads.html
以0.10.2.1为例。Kafka是用Scala开发的,所以下载时下载自己电脑上安装的Scala的对应的版本。
2.2 上传到Linux并解压
scp -r /usr/local/kafka_2.11-0.10.2.1/ hadoop02:/usr/local/
2.3 修改配置文件
broker.id=0
listeners=PLAINTEXT://hadoop01:9092
log.dirs=/usr/local/kafka_2.11-0.10.2.1/data
num.partitions=3
zookeeper.connect=hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181
2.4 分发
scp -r kafka_2.11-0.10.2.1/ hadoop02:/usr/local/
scp -r kafka_2.11-0.10.2.1/ hadoop03:/opt/local/
scp -r kafka_2.11-0.10.2.1/ hadoop04:/opt/local
/
2.5 修改配置文件
详细配置文件说明参见文章()
修改hadoop02:
broker.id=1
listeners=PLAINTEXT://hadoop02:9092
修改hadoop03:
broker.id=2
listeners=PLAINTEXT://hadoop03:9092
修改hadoop04:
broker.id=3
listeners=PLAINTEXT://hadoop04:9092
2.6 启动Kafka
启动Kafka之前,必须保证zookeeper是启动的
kafka-server-start.sh -daemon /usr/local/kafka_2.11-0.10.2.1/config/server.properties
3、测试集群
3.1、进入kafka根目录,创建Topic名称为: test的主题
kafka-topics.sh --create --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 --replication-factor 3 --partitions 3 --topic test
3.2、列出已创建的topic列表
kafka-topics.sh --list --zookeeper hadoop01:2181
3.3、查看Topic的详细信息
kafka-topics.sh --describe --zookeeper hadoop01:2181 --topic test
第一行是对所有分区的一个描述,然后每个分区对应一行。
leader:负责处理消息的读和写,leader是从所有节点中随机选择的.
replicas:列出了所有的副本节点,不管节点是否在服务中.
isr:是正在服务中的节点.
isr: In-Sync Replicas 可以提供服务的副本
3.4、模拟客户端去发送消息(生产者)
kafka-console-producer.sh --broker-list hadoop01:9092,hadoop02:9092 --topic hellotopic
3.5、模拟客户端去接受消息 (消费者)
连接broker的地址 :kafka-console-consumer.sh --bootstrap-server hadoop03:9092 --from-beginning --topic hellotopic
3.6、测试一下容错能力.
首先查看Topic的详细信息,发现Partition0的Leader为2
这里的Leader为2代表的是hadoop03这台机器
在hadoop03机器上关掉kafka进程
再次查看Topic详细信息,发现Partition0的Leader由2变为3,3为hadoop04机器
Kill -9 pid[leader节点]
另外一个节点被选做了leader,node 1 不再出现在 in-sync 副本列表中:
kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
Topic: test Partition: 0 Leader: 2 Replicas: 2,3,0 Isr: 2,3,0
Topic: test Partition: 1 Leader: 3 Replicas: 3,0,1 Isr: 3,0,1
Topic: test Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,2,1
Topic: test Partition: 0 Leader: 3 Replicas: 2,3,0 Isr: 3,0
Topic: test Partition: 1 Leader: 3 Replicas: 3,0,1 Isr: 3,0,1
Topic: test Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,1
虽然最初负责续写消息的leader down掉了,但之前的消息还是可以消费的:
kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic test
3.7、注:如果再次启动hadoop03(即Leader2所在的机器)上的kafka服务,Leader还会变回去,不过需要一定的时间
重新启动hadoop03上的kafka服务
再次查看Topic的详细信息,会发现Leader变回了2,自动进行了均衡。Isr(正在服务中的节点)也增加了2
3.8、扩展:从头消费,指定分区消费
生产者在生产数据的时候,默认会平均写到不同的分区中去。
--from-beginning参数意为从头开始消费
生产数据的时候,是有序的,但是消费数据的时候,会发现是无需的,这是因为在生产数据的时候,默认会平均写到不同的分区中去的。消费数据的时候,分区内的数据是有序的,但是分区间的数据,是无序的。
可以通过-partition来指定消费某一个分区的数据。
kafka-console-consumer.sh --bootstrap-server hadoop03:9092 --from-beginning --topic hellotopic --partition 0