Kafka-概念原理及工具

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

kafka特性

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

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

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

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

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

(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安装

posted @ 2020-03-20 23:25  斐波那切  阅读(408)  评论(0编辑  收藏  举报