Kafka-概念原理及工具

记录下和kafka相关的概念原理以及经常使用工具,文中不少理解参考文末博文、书籍还有前辈。html

kafka特性

kafka是由领英(LinkedIn)提供给Apache,是一个消息引擎,如今发展成为还能够进行流处理(kafka streams)的一个平台,如下是它的架构图。web

(1)用的是发布-订阅模式,多个消费者均可以消费Message。数据库

(2)单机kafka吞吐量大概是80~100M/s,性能高,其中写性能基于磁盘顺序写,读性能基于零拷贝,此外还有三层网络模型,这三个是保证其高性能的主要缘由。apache

(3)解耦生产者和消费者,只要消息队列不变化,二者没必要要关心对方是否有变化,一个发消息,一个消费消息进行处理就能够了。bootstrap

(4)削峰限流,在高并发场景下,能够在不须要升级硬件资源的状况下,关键组件可以使用kafka顶住峰值流量,正常对外提供服务,不会由于一时处理不了大量请求而奔溃。bash

(5)顺序性保证,加入消息队列的的消息能够在单个分区保持一致的顺序,对于消息处理顺序有要求的场景,它能保证。服务器

(6)当生产消息和消费消息的速度不一致时,kafka能够提供一个缓冲。网络

(7)容错性,即便消费消息的进程挂掉了,也能够在恢复后继续消费。就算某台部署了kafka的服务器宕机了,也不影响整个kafka集群继续提供服务,由于它有副本(replica)机制,能够实现高可用。架构

(8)kafka元数据,在0.8版本以前都交给zookeeper管理,1.0x后,每一个kafka节点上都会保存一份元数据。并发

核心概念

kafka的核心名词有不少,参考博文用一个图简单示意一下。

producer

消息的生产者,如flume sink到kafka。

consumer

消费消息的消费者,通常是spark streaming或flink。

consumer group

多个消费者能够放到一个消费组里,如上图,具体体现就是各个消费者部署在不一样的服务器上。kafka的消息对于消费组是组间共享的,好比电商网站中,积分组和订单组均可以消费数据,完成业务处理(没干过电商,网上看文章推测的)。可是消息被消费组获取后,只能被其中的一个组员处理,组内是竞争的。

broker

启动kafka server后,它就是一个broker,它有id号,在server.properties里指定的,每一个服务器节点上的broker id必须惟一。如上图启动了三个kafka节点,所以就有三个broker。

topic

发送消息时,须要分类管理,相似数据库中的一张表,一张表存一类型的数据,kafka中一个topic也对应一个类型的数据。如系统消息发送一个topic,业务消息发送一个topic。

partition

topic在kafka中是一个逻辑上的概念,真正体如今物理上就是对应一个个的目录,一个topic至少有一个partition,若是建立topic时指定了多个分区,则它们会均匀分布在不一样节点上,文件后缀名以数字区分不一样的分区。分区后能够总体提升kafka的吞吐量,由于每一个分区均可以存储数据,消费数据。

分区内,会有一个log文件,index文件,和timeindex文件。其中kafka中的message就是写入到log中保存的,底层是二进制数据,而index则是log文件的索引文件,经过它能够快速的定位一条日志,而不须要从头遍历log文件查看,细节后续文章总结。时间索引文件便于经过时间范围来查找消息,可是会存在时间错乱的可能,不经常使用。

[root@hadoop01 /home/software/kafka-2/kafka-logs/topicA-0]# ll
total 0
-rw-r--r--. 1 root root 10485760 Mar 20 20:29 00000000000000000000.index
-rw-r--r--. 1 root root        0 Mar 20 20:29 00000000000000000000.log
-rw-r--r--. 1 root root 10485756 Mar 20 20:29 00000000000000000000.timeindex

replica

上面partition保证了吞吐量,可是高可用HA尚未保证,这就须要副本机制了。kafka中默认指定一个副本,它是以topic为单位进行备份的,上图topicA除了有3个分区外,还有3个副本,而topicB则只有一个副本,从建立topic的命令也能够看出来。kafka中同一个分区的多个replica不会在同一个broker上,这就实现了HA,反之若是能存在一个broker上,那这个broker宕机了那这个分区上的消息也就不能提供服务了。

# topicA 3个replica
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 3 --partitions 3 --topic topicA
Created topic "topicA".
# topicB 1个replica
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-topics.sh --create --zookeeper hadoop01:2181 --replication-factor 1 --partitions 3 --topic topicB
Created topic "topicB".

leader和follower

上图能够看出来,生产者和消费者都只和红色分区通讯,生产和消费数据,这个红色分区就是leader分区,而绿色分区就是follower分区,它只从leader分区fetch数据,并返回ack信号。对于topicA来讲,每一个分区有三个replica,其中一个是leader,另外两个是follower,对于topicB来讲,它没有follower。

controller

当启动了kafka集群,zookeeper会在某个节点启动一个controller进程,它是kafka集群的总控组件,如上图所示在broker2上,在zookeeper中会建立对应临时节点/controller。它的做用不少,简单列举一下:

(1)当某个broker宕机,它上面的leader副本就不能继续提供服务,须要从follower里选举有资格(处于isr列表中的replica)的副本顶上去,这就须要controller完成。

(2)上图中每一个broker上都有meta元数据(如kafka集群中broker、partition、leader等信息),在kafka1.0.x后,它再也不是存储在zookeeper上了,而是会每一个broker上都有一份,这也是controller获取后分发下去的。0.8版本以前,须要链接zookeeper,1.0.x后,能够连任意一个broker就能够获取元数据,以下的例子也能够看出端倪。

# 1.0.x 之消费消息
kafka-console-consumer.sh --bootstrap-server hadoop01:9092 --topic football --from-beginning
# 0.8.x 之消费消息
kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic football --from-beginning

# 均可以消费到
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-console-consumer.sh --bootstrap-server hadoop01:9092 --topic football --from-beginning
hello i am clyang
hello
i am sorry
i am not enter into bigdata
[root@hadoop01 /home/software/kafka-2/bin]# sh kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic footballUsing the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
hello i am clyang
hello
i am sorry
i am not enter into bigdata

Zookeeper

(1)zookeeper管理kafka元数据,可是zookeeper并非为高并发设计的,后面元数据会保存到各个broker一份。

(2)controller的选举,以及controller不少工做,都是在zookeeper的基础上才能完成。如broker的上下线,controller能监听到随后能够rebalance。此外leader分区宕机后,新的leader分区的选举工做,也是controller完成。

KafkaManager

kafkaManager是一款web可视化管理kafka节点的软件,由雅虎开源,能够方便管理整个集群的kafka,须要自行安装。参考文末博文,直接使用博主编译好的kafkaManager,无需安装sbt(也能够安装sbt后本身编译,能够参考网上博文),只需完成如下步骤就可使用。

(1)修改安装目录/conf下的application.conf,将里面zookeeper的地址,修改成本身的主机地址。

[root@hadoop01 /home/software/kafka-manager-1.3.3.7/conf]# ll
total 24
-rw-r--r--. 1 root root 1381 Jun 18  2017 application.conf
-rw-r--r--. 1 root root   27 Jun  5  2017 consumer.properties
-rw-r--r--. 1 root root 2108 Jun  5  2017 logback.xml
-rw-r--r--. 1 root root 1367 Jun  5  2017 logger.xml
-rw-r--r--. 1 root root 7423 Jun  5  2017 routes

修改地址。

# 配置成本身的zookeeper的值
# kafka-manager.zkhosts="localhost:2181"
kafka-manager.zkhosts="hadoop01:2181,hadoop02:2181,hadoop03:2181"
kafka-manager.zkhosts=${?ZK_HOSTS}
pinned-dispatcher.type="PinnedDispatcher"
pinned-dispatcher.executor="thread-pool-executor"

(2)启动。

若是发现后台有ProdServerStart进程,表明已启动成功。

# -Dconfig.file 指定配置文件
# -Dhttp.port=9000 指定应用的端口号
# nohup和&表明后台运行,1和2表明标准输出和错误输出结果,都输出到"黑洞"
[root@hadoop01 /home/software/kafka-manager-1.3.3.7]#  nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=9000 1>/dev/null 2>/dev/null &

# 启动
[root@hadoop01 /home/software/kafka-manager-1.3.3.7]# jps
2358 Jps
2220 ProdServerStart

(3)启动zookeeper和kafka后,能够登陆web查看,在哪台启动kafkamanager,就连哪台服务器的地址。刚开始须要添加一个集群,配置好zookeeper链接的地址和kafka版本就可使用。

经过web,能够看到整个kafka节点上的topic,其余还有很多界面供查看,总体使用方便,具体略。

以上,理解不必定正确,但学习就是一个不断了解和纠错的过程,记录令人逐渐准确。

参考博文:

(1)《Apache Kafka实战》

(2)https://www.cnblogs.com/youngchaolin/p/12121812.html

(3)http://kafka.apache.org/10/documentation.html

(4)[https://www.cnblogs.com/dadonggg/p/8205302.html kafkaManager安装

相关文章
相关标签/搜索