赞
踩
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
优点:
一些重要的术语:
1.Producer: 生产者,发送消息到指定的 topic .
2.Consumer: 消费者,从 topic 中消费消息.
3.broker: 节点,一台 kafka 服务器就是一个 broker。
4.topic: 每一个发布到 kafka 的消息都会指定一个类别,即 topic,消息按照topic来分类。
5.partition:
分区,每个topic被物理划分为一个或多个分区,每个分区在物理上对应一个 log 文件夹,该文件夹存储了索引文件和消息文件。
6.offset:
消息序号,代表消息在 partition 中的偏移量。每一条消息在partition都有唯一的offset,一般情况下,消费者消费完一条消息后会递增 offset ,这时如果将 offset 设定为较小的值,就可以重复消费一些消息。
7.consumer group:
消费者组,每个consumer属于一个特定的consumer group,若不指定则属于默认的group。
同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。
8.leader:
每个 partition 有多个副本,其中有一个为 leader ,其他都是 follower , leader 负责所有的客户端读写操作。
9.follower:
不对外提供服务,只与leader保持数据同步。如果 leader 失效,则选举一个 follower 来充当新的leader。
每个 partition 对应于一个 log 文件,该 log 文件中存储着 producer 生产的数据。
Producer 将消息发送到 topic 时,会根据 分区策略 将消息写入 log 文件的末尾,属于顺序写磁盘,效率非常高。(有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。顺序写省去了大量磁头寻址的时间)
- 指明 partition 的情况下,直接将指明的值直接作为 partiton 值。
- 没有指明 partition 的值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值.
- partition 和 key 值都没有时,第一次会随机生成一个数, 与 partition 数取余得到 partition 值,以后每次在这个数的基础上加1。
数据可靠性保证
为数据能可靠的发送到指定的 topic, topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果producer 收到 ack, 就会进行下一轮的发送,否则重新发送数据。
什么是ISR?
Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。
当 ISR 中的 follower 完成数据的同步之后, leader 就会给 follower 发送 ack。如果 follower 长 时 间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由 replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。
由于对不同数据的可靠性要求不同,kafka提供了三种可靠性级别。
ack = 0;
延迟最低,producer 不等待 broker 的 ack, broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据。
ack = 1;
producer 等待 broker 的 ack, partition 的 leader 落盘成功后返回 ack。
但是如果在 follower 同步完成之前, leader 故障,将会导致数据丢失。
ack = -1;
producer 等待 broker 的 ack, leader 和 follower 完成落盘后才返回 ack。
但是如果在 broker 返回 ack 之前,leader 出现故障,则会造成数据重复。
kafka 的 ack 默认值 为 1。
At Least Once:
ack = -1 时,可以保证 Producer 到 Server 之间不会丢失数据,但是不能保证数据不重复 。
At Most Once:
ack = 1 时,可以保证数据不重复,但是不能保证数据不丢失。
幂等性:
0.11版本后引入,指 Producer 不论向 Server 发送多少次重复数据, Server 端都只会持久化一条。
ExactlyOnce指的就是 幂等性 + At Least Once 。即保证了数据的不重复,又保证了数据不丢失。
启用幂等性: Producer 的参数中 enable.idempotence 设置为 true 即可。
LEO: 标识当前日志文件中下一条待写入的消息的offset。
HW: 高水位,它等于 ISR 队列中最小的 LEO,消费者只能消费HW之前的消息。
如下图所示:
发生故障时,如何保持数据一致?
follower 故障
follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后, follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。
leader 故障
leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性, 其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据。
① push方式:由消息中间件主动地将消息推送给消费者。
优点: 不需要消费者额外开启线程监控中间件,节省开销。
缺点: 无法适应消费速率不相同的消费者。可能导致部分消费者空闲,部分消费者堆积,造成缓冲区溢出。
② pull方式:由消费者主动向消息中间件拉取消息。
优点: 消费端可以按处理能力进行拉取。
缺点: 消费端需要另开线程监控中间件,有性能开销。如果 kafka 没有数据,消费者可能会陷入循环中, 一直返回空数据。
Kafka 的消费者可以在消费数据时会传入一个参数 timeout,如果当前没有数据可供消费, consumer 会等待一段时间之后再返回,这段时长即为 timeout。
groupId
的 消费者
只能消费同个 topic
的某个消息一次。就是说 A和B的
groupId
相同且同时订阅了test
,则A消费了test
中的消息后,B就不能再次消费这个消息。
groupId
的消费者可共同消费同个 topic
的消息。A与B不同
groupId
,则A消费后,B仍然可以消费。
当
分区数
<消费者数
时,如3个分区,4个消费者,则会有一个消费者无消息消费。当分区数
>消费者数
时,如4个分区,3个消费者,则有个消费者会同时消费2个分区。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。