KAFKA

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的不同副本分布到不同的broker

  • kafka 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.
分区内有序,整体无序.

推荐阅读更多精彩内容