【Kafka】1-理论知识

参考:https://www.cnblogs.com/rickiyang/p/11074194.html    http://kafka.apache.org/quickstart    http://kafka.apache.org/documentation

----------------------------------------------------------------------------------

一、基础知识

适用场景:来自官网

  1. payment transactions // 金融交易

  2. geolocation updates from mobile phones // 地址位置更新

  3. shipping orders

  4. sensor measurements from IoT devices // IOT传感器测量数据

  5. medical equipment, and much more.

与其他消息队列比较

  • 分布式系统,集群方式运行,可自由伸缩;  // 采用zookeeper作为集群选举

  • 可复制、持久化、保留多长时间都可以;  // 有配置文件可配置消息持久化规则

  • 提供流式处理能力,极少代码动态处理派生流和数据集。

Kafka消息特征

  • 数据分布在整个系统中,具备数据故障保护和性能伸缩能力。

  • 按照一定顺序持久化保存,可按需读取。

  • 消息:键(一致性Hash值),对主题分区数取模选择分区,保证相同键的消息总写到相同批次上。

  • 为提升效率:消息被分批写入Kafka,这些消息属于同一主题和分区。

Kafa消息序列化

  对kafka来说,消息是难懂的字节数组,建议使用额外结构定义消息内容。

  消息模式:JSON和XML虽然易用,但缺乏强类型处理能力。

  推荐使用Apache Avro(为Hadoop开发的序列化框架),紧凑序列化模式。  // 详细可参考 https://avro.apache.org/

    • 模式和消息体分开,模式变化时不需要重新生成代码。
    • 支持强类型和模式进化,支持前后向兼容。

  数据格式一致性:消除消息读写操作之间耦合性。如果读写操作耦合,消费者必须升级应用程序才能同时处理新旧数据格式。

          kafka.consumer.key.deserializer=io.confluent.kafka.serializers.KafkaAvroDeserializer

    kafka.consumer.value.deserializer=io.confluent.kafka.serializers.KafkaAvroDeserializer

Kafka主题和分区

  消息以追加方式写入分区,先入先出方式顺序读取。

  由于一个主题包含几个分区,无法保证整个主题范围内消息顺序,仅保证消息在单个分区内内顺序。

  Kafka通过分区实现数据冗余和伸缩性。  

    

broker:  

  一个独立的kafka服务器称为broker,可轻松处理数千个分区及每秒百万级消息量。

    • 接收生产者消息,对消息设置偏移量,并提交消息到磁盘保存。
    • 为消息者提供服务,对读取分区请求作出响应,返回已提交磁盘的消息。

  每个Kafka集群节点有一个全局唯一的broker-id(见server.properties中配置); 

  

 消费者和消费者组

     消费者组:  保证每个分区只能被一个消费者使用,可以消费包含大量消息。

                见下图:上述所有数字只代表offset,不是实际的内容。共计发送了15条消息。

      

 offset:

  每个用户组通过自动提交或主动提交偏移量方式进行offset的提交

  1. 创建消息时,Kakfa添加到消息中。在给定分区中,每个消息偏移量是唯一的。

  2. 消费者对每个分区读取的offset保存在ZK或Kafka上。如果消费者关闭或重启,读取状态不会丢失。

消息队列两种模式:点到点、发布订阅模式(推和拉两种模式)。Kafka Consumer基于Pull模式。


二、基础架构

    

zk作用:1)Kafka集群工作,支撑Leader选举;2)0.9版本前消费者的offset(0.9后存储在Kafka磁盘中),降低对ZK的频繁交互;

     

     Leader和Follower:面向具体Topic,而不是整体面向Broker。

broker:一个服务器是一个broker;一个集群由多个broker组成;一个broker可容纳多个topic。

Consumer Group:消费者组内每个消费者负责消费不同分区的数据。一个分区只能一个组内消费者消费。消费者组间互不影响。

Partition: 为实现扩展性,一个topic可分为多个Partition。每个partition是一个有序的队列。 

Replication:  每个Topic对应的副本,生产者可在创建的时候设置副本数和分区数

Partition->Segment:

  由于生产者消息不断追加到log末尾,为防止log过大而导致数据定位效率问题。所以采用分片+索引机制:

    1. 将每个partition分为多个segment。

    2. 每个segment对应文件:index+log,位于同一目录(topic名称+分区号)

         

1、每个片段的大小控制:log.segment.bytes=1073741824

    

 2、index和log所处目录名称:topic名称+分区号

   

3、index和log以当前segment第1条消息offset命名。

   

    查找过程示意:1)定位segment;2)根据offset查找消息

    

原文地址:https://www.cnblogs.com/clarino/p/14365670.html