Kafka

Kafka的概念:

  • 1、类JMS,消费者可以多个,并且主动拉取数据
  • 2、数据生产者 messageProducer
  • 3、数据消费者 messageConsumer
  • 4、数据保存的进程,实例:broker 拉皮条,每台服务器都有独立的broker进程
  • 5、数据目的(分类 ,主题):destination | topic
  • 6、数据分片:partition,有多个,有副本

————— kafka
1、kafka是什么
答:类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中有点对点模式才有消费者主动拉取数据

  • kafka是一个生产-消费模型。
  • Producer:生产者,只负责数据生产,生产者的代码可以集成到任务系统中。
    数据的分发策略由producer决定,默认是defaultPartition  Utils.abs(key.hashCode) % numPartitions
    
  • Broker:当前服务器上的Kafka进程,俗称拉皮条。只管数据存储,不管是谁生产,不管是谁消费。
    在集群中每个broker都有一个唯一brokerid,不得重复。
    
  • Topic:目标发送的目的地,这是一个逻辑上的概念,落到磁盘上是一个partition的目录。partition的目录中有多个segment组合(index,log)
    一个Topic对应多个partition[0,1,2,3],一个partition对应多个segment组合。一个segment有默认的大小是1G。
    每个partition可以设置多个副本(replication-factor 1),会从所有的副本中选取一个leader出来。所有读写操作都是通过leader来进行的。
    特别强调,和mysql中主从有区别,mysql做主从是为了读写分离,在kafka中读写操作都是leader。
    
  • ConsumerGroup:数据消费者组,ConsumerGroup可以有多个,每个ConsumerGroup消费的数据都是一样的。
    可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据,组员之间不能重复消费。 
    

2、kafka生产数据时的分组策略

  • 默认是defaultPartition Utils.abs(key.hashCode) % numPartitions
    上文中的key是producer在发送数据时传入的,produer.send(KeyedMessage(topic,myPartitionKey,messageContent))

3、kafka如何保证数据的完全生产

  • ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。
    0:不等待broker返回确认消息
    1:等待topic中某个partition leader保存成功的状态反馈
    -1:等待topic中某个partition 所有副本都保存成功的状态反馈

4、broker如何保存数据

  • 在理论环境下,broker按照顺序读写的机制,可以每秒保存600M的数据。主要通过pagecache机制,尽可能的利用当前物理机器上的空闲内存来做缓存。
    当前topic所属的broker,必定有一个该topic的partition,partition是一个磁盘目录。partition的目录中有多个segment组合(index,log)

5、partition如何分布在不同的broker上

1
2
3
4
5
6
7
int i = 0
list{kafka01,kafka02,kafka03}

for(int i=0;i<5;i++){
brIndex = i%broker;
hostName = list.get(brIndex)
}

6、consumer和partition之间如何做负载均衡

  • 最好是一一对应,一个partition对应一个consumer。
    如果consumer的数量过多,必然有空闲的consumer。

  • 算法:

    假如topic1,具有如下partitions: P0,P1,P2,P3
    加入group中,有如下consumer: C1,C2
    首先根据partition索引号对partitions排序: P0,P1,P2,P3
    根据consumer.id排序: C0,C1
    计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
    然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
    

7、如何保证kafka消费者消费数据时全局有序的

  • 伪命题
    如果要全局有序的,必须保证生产有序,存储有序,消费有序。
    由于生产可以做集群,存储可以分片,消费可以设置为一个consumerGroup,要保证全局有序,就需要保证每个环节都有序。
    只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用场景相悖。

————— 生产者
1生产者分组策略
默认为kafka.producer.DefaultPartitioner,按照key 哈希取模
2如何保证数据的完全生产
答:设置发送数据是否需要服务端的反馈,有三个值0,1,-1

  • 0: producer不会等待broker发送ack
  • 1: 当leader接收到消息之后发送ack
  • -1: 当所有的follower都同步消息成功后发送ack.

————— 服务端
3每个partition的数据如何保存到硬盘
每个partition都有一个而目录,相当于一个大文件被切割成很多固定大小的小文件,默认1G,7天
4kafka有什么独特的特点
5partition的数量和broker数量的关系

————— 消费者
6消费者如何标记消费状态
7消费者负载均衡的策略
一个组中的数据最好和分片数对应,一个分片对应一个组中的消费成员,如果组中的成员太多,必然会有成员空闲。
链接网址
8如何保证消费者消费的数据是有序的
伪命题。伪命题。
1、生产者是集群模式—>全局序号管理器
2、broker端只设置一个partition—>kafka的高并发下的负载均衡,kafka的效果就展现不出来
3、消费者如果是一个组,如何保证消息有序?消费者来一个线程(自定义一个数据结构做排序,数据非常大,)

kafka有什么独特的特点:
pagecache | sendfile