broker
消息中间件处理节点,一个Kafka节点就是一个Broker,一个或多个Broker可以组成一个kafka集群
partitions
物理上的概念,一个Topic可以分多个Partition,每个Partition内部是有序的
topic
主题,Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个Topic
group
每一个Consumer属于一个特定的ConsumerGroup,一条消息可以发送到多个不同的Consumer Group,但是一个Consumer Group中只能有一个Consumer能够消费该消息
是一个逻辑上的概念,是kafka实现单播和广播两种消息模型的手段。
同一个topic的数据,会广播不同的group,同一个group中的worker,只有一个worker能拿到这个数据
对于同一个topic,每个group都可以拿到同样的所有的数据,但是数据进入grup后只能被其中一个worker消费。
group内的woker可以使用多线程或者多线程来实现,也可以将进程分散在多台机器上,worker的数量不超过partition的数量,而且二者最好保持整数被关系,因为kafka在设计时假定了一个partition只能被一个worker消费(同一个group内)
思考
为什么设计一个goup内的消息只能一个workeri 消费
group和substribe那里的offset有什么关系
producer
消息生成方,存储消息在哪一个partition中,如果没有指定partition,则进行轮询发送。如果指定了partition key,则对Key值进行Hash,然后和partition个数进行取余操作,保证了同一个key值的会被路由到同一个分区,如果想队列强顺序一致性,可以让所有的消息都设置同一个key。
如何优化写入速度
增加线程
提供batch.size
增加更多的producer实列
增加partition 数
设置acks=-1时,如果延迟增大,可以增加num.replica.fetchers(follower同步数据的线程数)来调解
跨数据中心传输,增加socket缓冲区设置以及OS tcp缓冲区设置
ack配置
1
默认设置,数据发送到kafka后,进过leader成功接收消息的确认,就算是发送成功了。在这种情况下,如果leader down机,则会丢失数据
0
生产者将数据发送出去以后就不管了,不去等待任何返回。这种情况下数据传输效率最高,但是数据可靠性确是最低的
-1
producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。当ISR中所有Replica都想Leader发送ACK时,leader才commit,这时候producer才能认为一个请求中的消息都commit
Offset
Kafka为每一个topic维护了分布式的分区日志文件,每个partition在kafka的存储层面是一个Append Log。 任何发布到此Partition的消息都会追加到Append Log的文件尾部,在每一个分区中每条消息都会按照时间顺序分配到一个单调递增的顺序编号,也就是我们的Offset。它是一个Long类型的数字。我们通过Offset可以确定一条消息在该Partition下的唯一消息。在Partition下面保证了有序性,但是在Topic下面没有有序性
ISR
副本同步队列
ISR是有leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个纬度,当前最新版本0.10.x中只支持replica.lag.time.max.ma这个纬度)任意一个超过阀值都会把follower剔除ISR,存入OSR(outof-Sync Replicas)列表,新进入的follower也会先存放在OSR中。AR=ISR+OSR
unclean
unclean.leader.election.enable=true
非ISR集合的broker也可以参与选举,这样有可能会丢失数据,spark streaming在消费过程中拿到的end offset会突然变小,导致spark streaming会变小,导致spark streming job 挂掉。
可能发生数据丢失和数据不一致的情况,kafka的可靠性降低
unclean.leader.election.enable=false
Kafka的可用性就会降低
思考:具体业务场景中应该怎么用
message
格式
一个固定的header和一个变长的消息体body组成
header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成
当magic的值为1的时候,会在magic和crc32之间多一个字节的数据,attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性
body是由N个字节构成的一个消息体,包含了具体的key/value消息