目录:
- Kafka存储机制
- Kafka分区规则
- Kafka日志
Kafka存储机制
再说Kafka存储机制之前我们先了解下分区和副本的作用:
- 分区:为了提高性能(也就是分而治之,它是高并发分布式中心思想)。
- 副本:为了高可用(保证数据安全)。
副本数量如何定义:
- 不要超过broker的数量,最低一个(首先会报错;其次没有意义,broker宕调时不管你有多少个副本都是没有意义的)。
- 就经验来说,参考Hadoop副本数量分配(Hadoop默认3个)。
Kafka分为索引数据和数据,xxx.index、xxx.log。
存储机制同样采用分而治之的方式,首先消息根据topic分区,每个topic又有多个partition,每个partition下又有多个segment。
每一个partition就相当于一个巨大的文件,它被segment拆分成多个小文件,这边是分而治之的思想。你也可以理解成一个公司,老板是partition,他下面有多个中层领导。
.index存储元数据,.log存储大量的消息。以index中348的偏移量,对应log文件中的第3个消息,即log文件170410+3=170413。
Kafka分区规则
假如我们有3个分区,3个副本。
L:leader,F:follow。
T1L T2L T3L
T1F1 T2F1 T3F1
T1F2 T2F2 T3F2
1、先从所有broker选一个存储第一个leader分区。
2、按照broker顺序分配第二、第三个leader分区。
3、一次分配follow分区(如:第一个leader分区被分配到broker1上,那么其它两个follow分区就会被分配到broker2和broker3上)。
Kafka日志
ISR、HW、LEO同步流程:
- ISR(In-sync replica): 副本同步队列,当有一条新的消息提交后,副本同步消息成功后才会出现在此队列中。若某个follow副本落后太多或宕机,leader会将它从ISR中删除。
- HW(high watemark): 高水位,指ISR中所有节点都已经复制完的消息的offset,也是消费者能获取到的最大的offset。
- LEO(LogEndOffset): 最后一条消息的偏移量。
假如有3个副本。
一开始消息的状态是这样的:
L F1 F2
1 1 1
2 2 2
HW & LEO 3 3 3
现发送一条消息,此时消息会先到leader副本,然后再通知其它两个follow副本复制。若此时仅有F1复制成功,此时便是这样的。
L F1 F2
1 1 1
2 2 2
HW 3 3 3
LEO 4 4
那么HW便是在4之上的3的位置,LEO是4的位置,LSR是L、F1。
当所有副本都同步完之后,HW与LEO便回到一个位置上。
L F1 F2 1 1 1 2 2 2 HW & LEO 3 3 3
4 4 4
查看日志命令:./kafka-dumplog.sh --files --file /home/hadoop/kafka/broker-0/xxxx.index