kafka之三HW与leader epoch
kafka里的HW(High Watermark)是与消息offset相关的一个概念,本文会从下面这四个方面来展开。
- HW的作用
- HW的更新机制
- 副本同步机制解析
- leader epoch
HW的作用
在kafka中,HW的作用主要有2个:
- 定义消息的可见性,即用来标识分区下的哪些消息是可以被消费者消费的
- 帮助kafka完成副本同步
假设这是某个分区Leader副本的HW图,我们可以清楚地看到‘已提交消息’与‘未提交消息’,在展开之前先解释下何为已提交消息:
当kafka的若干个broker成功地接收到一条消息并写入到日志文件后,它们会告诉生产者这条消息已成功提交,那么这条消息就是‘已提交消息’。注意这里使用的是若干个broker,这个是由使用者配置决定的,使用者可以配置只要有一个broker成功保存该消息就算是已提交,也可以配置令所有broker都成功保存该消息才算是已提交。
回到HW上来,在上图中已提交的消息才会对消费者可见,才会被消费者拉取消费。位移值等于高水位的消息也属于未提交消息,即高水位上的消息是不能被消费者消费的。
图中还有一个日志末端的概念,Log End Offset(LEO)。它表示副本写入下一要消息的位移值。注意,数字 15 所在的方框是虚线,这就说明,这个副本当前只有 15 条消息,位移值是从 0 到 14,下一条新消息的位移是 15。显然,介于高水位和 LEO 之间的消息就属于未提交消息。这也从侧面告诉了我们一个重要的事实,那就是:同一个副本对象,其高水位值不会大于 LEO 值。
高水位和LEO是副本对象的两个重要属性。kafka所有副本都有对应的高水位和LEO值,而不仅仅是leader副本。只不过leader副本比较特殊,kafka使用leader副本的高水位来定义所在分区的高水位。换句话说,分区的高水位就是其leader副本的高水位。