KAFKA介绍:
https://www.cnblogs.com/seaspring/p/6138080.html
KAFKA:Controller
http://blog.csdn.net/zhanglh046/article/details/72821995
http://blog.csdn.net/jewes/article/details/42970799
https://www.cnblogs.com/huxi2b/p/6050778.html
KAFKA
KAFKA简介
- Kafka由Linkedin开发的消息队列,使用Scala语言编写
- 分布式、多分区、多副本、基于发布/订阅的消息系统
- Kafka设计的初衷是希望作为一个统一的信息收集平台,能够实时的收集反馈信息,并能够支撑较大的数据量,且具备良好的容错能力
KAFKA特性
- 消息持久化:采用时间复杂度O(1)的磁盘结构顺序存储
- 高吞吐量:支持每秒百万级别的消息
- 易扩展:新增机器,集群无需停机,自动感知
- 高容错:通过多分区,多副本提供高容错性
- 多客户端支持:Java、PHP、Python等
- 实时性:进入到Kafka的消息能够立即被消费者消费
Kafka消息队列的作用
- 应用程序解耦并行处理
- 顺序保证
- 高吞吐率
- 高容错、高可用
- 可扩展
- 峰值处理
Kafka的原理
- 在Kafka中,发送消息者称为Producer,而消息拉取者称为Consumer ,通常consumer是被定义在Consumer Group里
-
Kafka通过Zookeeper管理集群
- Kafka集群由多个实例组成,每个节点称为Broker,对消息保存时根 据Topic进行归类
- 一个Topic可以被划分为多个Partition
-
每个Partition可以有多个副本
- Partition内顺序存储,写入新消息采用追加的方式,消费消息采用 FIFO的方式顺序拉取消息
-
一个Topic可以有多个分区,Kafka只保证同一个分区内有序,不保 证Topic整体(多个分区之间)有序
- Consumer Group(CG),为了加快读取速度,多个consumer可以划 分为一个组,并行消费一个Topic
-
一个Topic可以由多个CG订阅,多个CG之间是平等的,同一个CG 内可以有一个或多个consumer,同一个CG内的consumer之间是竞争 关系,一个消息在一个CG内的只能被一个consumer消费
Kafka核心概念
- Broker:启动kafka的一个实例就是一个broker,一个kafka集 群可以启动多个broker
- Topic:kafka中同一种类型数据集的名称,相当于数据库中 的表,productor将同一类型的数据写入的同一个topic下, consumer从一个topic消费同一类型的数据
- Partition:一个topic可以设置多个分区,相当于把一个数据 集分成多份分别放到不同的分区中存储,一个topic可以有一 个或者多个分区,分区内消息有序
- Replication:副本,一个partition可以设置一个或者多个副本 ,副本主要保证系统能够持续不丢失的对外提供服务,提高 系统的容错能力
- Producer:消息生产者,负责向kafka中发布消息
- Consumer Group:消费者所属组,一个Consumer Group可以包含一个或者多个consumer,当一个topic被一个Consumer Group消费的时候,Consumer Group内只能有一个consumer消费同一条消息,不会出现同一个Consumer Group多个consumer同时消费一条消息造成一个消息被一个Consumer Group消费多次的情况
- Consumer:消息消费者,consumer从kafka指定的主题中拉取消息
- Zookeeper:Zookeeper在kafka集群中主要用于协调管理,Kafka将
元数据信息保存在Zookeeper中,通过Zookeeper管理维护整个Kafka 集群的动态扩展、各个Broker负载均衡、Partition leader选举等
Kafka的存储
- 每个partition的副本是一个目录
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:07 topicnewtest1-0
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:07 topicnewtest1-2
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:08 topicnewtest1-3
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:08 topicnewtest1-4
[hadoop@hadoop4 kafka-logs]$ tree topicnewtest1-0
topicnewtest1-0
├── 00000000000000000000.index
├── 00000000000000000000.log
└── 00000000000000000000.timeindex
- Segment:段文件,kafka中最小数据存储单位,一个partition包含多 个segment文件,每个segment以message在partition中的起始偏移量 命名以log结尾的文件
-
Offset:消息在分区中的偏移量,用来在分区中唯一的标识这个消 息
图中的文件名是偏移量第一个文件记录了0--368768的数据,第二个记录了368769-737337的数据
查看topic的信息可以发现:
[hadoop@hadoop4 kafka_2.11-0.10.2.1]$ bin/kafka-topics.sh --describe --zookeeper hadoop0:2181 --topic topicnewtest1
Topic:topicnewtest1 PartitionCount:5 ReplicationFactor:2 Configs:
Topic: topicnewtest1 Partition: 0 Leader: 2 Replicas: 2,0 Isr: 2,0
Topic: topicnewtest1 Partition: 1 Leader: 0 Replicas: 0,1 Isr: 1,0
Topic: topicnewtest1 Partition: 2 Leader: 1 Replicas: 1,2 Isr: 2,1
Topic: topicnewtest1 Partition: 3 Leader: 2 Replicas: 2,1 Isr: 2,1
Topic: topicnewtest1 Partition: 4 Leader: 0 Replicas: 0,2 Isr: 2,0
topicnewtest1这个主题中,有五个partition,每个partition有2个replication,第0个partition的Leader是broker为2的节点,replication是在2,0,这两个节点 ISR 是2,和 0 节点.查看broker0 的节点log目录中,存在partition0 的副本:
[hadoop@hadoop2 kafka-logs]$ ll
total 28
-rw-rw-r--. 1 hadoop hadoop 4 Jan 31 10:07 cleaner-offset-checkpoint
-rw-rw-r--. 1 hadoop hadoop 54 Jan 31 09:32 meta.properties
-rw-rw-r--. 1 hadoop hadoop 58 Jan 31 11:44 recovery-point-offset-checkpoint
-rw-rw-r--. 1 hadoop hadoop 58 Jan 31 11:45 replication-offset-checkpoint
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:27 topicnewtest1-0
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:27 topicnewtest1-1
drwxrwxr-x. 2 hadoop hadoop 4096 Jan 31 10:27 topicnewtest1-4
[hadoop@hadoop2 kafka-logs]$ pwd
/home/hadoop/apps/kafka_2.11-0.10.2.1/kafka-logs
[hadoop@hadoop2 kafka-logs]$
Kafka存储-索引文件
-
Kafka为了提高写入、查询速度在partition文件夹下每一个segment log文件都有同名的索引文件,在kafka0.10以后的版本中会存在两个 索引文件,一个用offset做名字以index结尾的索引文件,我们称为 偏移量索引文件。一个是以消息写入的时间戳为做名字以timeinde 结尾的索引文件,我们称为时间戳索引文件。
偏移量索引文件
- 以偏移量作为名称,index为后缀
- 索引内容格式:offset,position
- 采用稀疏存储方式
-
通过log.index.interval.bytes设置索引跨度
kafka高可用实现
多分区副本
一个topic可以有多个分区,每个分区可以有多个副本
一个分区的多个副本选举一个leader,由leader负责读写,其他副
本作为follower从leader同步消息
同一个partition的不同副本分布到不同的brokerkafka controller 选举
从集群中的broker选举出一个Broker作为Controller控制节点
负责整个集群的管理,如Broker管理、Topic管理、Partition
Leader选举等
选举过程通过向Zookeeper创建临时znode实现,为被选中的
Broker监听Controller的znode,等待下次选举-
kafka partition Leader选举
- Controller负责分区Leader选举
- ISR列表
- Follower批量从Leader拖取数据
- Leader跟踪其 保持同步flower列表ISR( In Sync Replica),ISR作为下次选主的候选列表
- Follower心跳超时或者消息落后太多,将被移除出ISR
Leader失败后,从ISR列表中选择一个Follower作为新的Leader
总结:
一个broker对应多个topic,一个topic对应多个分区,一个topic可以被多个consumer group消费,但只能被同一个consumer group 中的一个consumer消费.
每个partition有多个replication,每个partition有一个Leader.
分区内有序,整体无序.