Skip to content

Commit

Permalink
使用太记桌面版同步
Browse files Browse the repository at this point in the history
  • Loading branch information
Gezi-lzq committed Oct 7, 2024
1 parent 42ea882 commit 6d5ccb7
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 11 deletions.
Binary file added tiddlers/topic_have_gaps.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions tiddlers/topic_have_gaps.png.meta
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
title: topic_have_gaps.png
type: image/png
33 changes: 31 additions & 2 deletions tiddlers/位点翻译存在哪些挑战?.tid
Original file line number Diff line number Diff line change
@@ -1,6 +1,35 @@
created: 20241007112611920
creator: Gezi-lzq
modified: 20241007112623233
modified: 20241007132656484
modifier: Gezi-lzq
tags: 梳理MM2位点翻译流程
title: 位点翻译存在哪些挑战?
title: 位点翻译存在哪些挑战?

回顾理想情况下位点翻译流程的前提:源集群和目标集群之间的消息复制是一一对应的,也就是说,源集群中的每一个位点都对应着目标集群中的一个位点。

而现实情况下,该前提并不成立!

[img[topic_have_gaps.png]]

!!!''事务标记(Transaction markers)''
在Kafka中,为了支持事务性消息,引入了事务标记。事务标记是一种特殊的消息,它标记了事务的开始和结束。在生产者端,事务标记占用了一个偏移量,但是在消费者端,这些事务标记并不会被消费,也就是说,它们不会被复制到目标集群的对应偏移量。

举例来说,源集群中的偏移量10可能是一个事务标记,虽然它在源集群中占用了一个偏移量,但在目标集群中并没有对应的消息,因为消费者不会消费这个事务标记。这就打破了一一对应的假设。

!!!''SMTs(Single Message Transforms,单消息转换)''
SMTs是Kafka Connect的一个功能,它允许在消息被写入目标主题之前对消息进行转换。一些SMTs可能会选择丢弃某些消息,这些消息将不会被写入目标主题。

例如,我们可能有一个SMT,它的任务是过滤掉所有包含"test"关键字的消息。源集群中偏移量为20的消息包含了"test"关键字,所以这个消息被SMT过滤掉,不会被复制到目标主题。因此,源集群中的偏移量20在目标集群中并没有对应的消息。

!!!''Compacted Topics''
Kafka支持对主题进行压缩,以减少存储空间的使用。当主题被压缩时,一些旧的消息将被删除,只保留每个键的最新消息。这样,源集群中的一些偏移量可能会被删除,而在目标集群中并没有对应的消息。

例如,源集群中的偏移量30的消息已经被删除(因为主题被压缩),只保留了每个键的最新消息。这就意味着,源集群中的偏移量30在目标集群中并没有对应的消息。

!!!''MM2复制落后''
MirrorMaker 2(MM2)是Kafka的一个组件,用于在集群之间复制数据。在某些情况下,MM2可能会落后于源集群的消费者组。这就意味着,源集群中的一些最新的偏移量可能还没有被MM2复制到目标集群。

例如,源集群中的消费者组正在快速地消费消息,而MM2正在尽力地跟上。然而,由于某些原因,MM2落后了,它还没有复制源集群中偏移量为40的消息。这就意味着,源集群中的偏移量40在目标集群中并没有对应的消息。


https://issues.apache.org/jira/browse/KAFKA-12468
15 changes: 15 additions & 0 deletions tiddlers/当前MM2的位点翻译方案?.tid
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
created: 20241007132831726
creator: Gezi-lzq
modified: 20241007133403184
modifier: Gezi-lzq
tags: 梳理MM2位点翻译流程
title: 当前MM2的位点翻译方案?

根据[[预期的位点翻译的效果?]]中的前提与效果,当源集群和目标集群之间的消息复制是一一对应的时候,可以通过距离差值将原集群位点映射到目标集群,这样可以保证是绝对准确的。

但是根据[[位点翻译存在哪些挑战?]]可知在复制过程中无法保证这个前提,那么如果还按照这个方式去翻译,会是什么效果呢?

答曰:会重复消费



6 changes: 3 additions & 3 deletions tiddlers/梳理MM2位点翻译流程.tid
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
created: 20241007074530319
creator: Gezi-lzq
due: 20241008155959999
modified: 20241007101928338
modified: 20241007132848698
modifier: Gezi-lzq
priority:
tags: todo [[增强 Kafka 集群迁移功能特性并完善迁移方案]] kafka kafka迁移
Expand All @@ -13,8 +13,8 @@ title: 梳理MM2位点翻译流程

2. [[预期的位点翻译的效果?]]

3. 位点翻译存在哪些挑战?
3. [[位点翻译存在哪些挑战?]]

4. 当前MM2的位点翻译方案?
4. [[当前MM2的位点翻译方案?]]

5. 该位点翻译方案的效果以及优劣?
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
created: 20241007101812861
creator: Gezi-lzq
modified: 20241007120649470
modified: 20241007133422467
modifier: Gezi-lzq
tags: 梳理MM2位点翻译流程
title: 预期的位点翻译的效果?
title: 预期的位点翻译的效果

在讨论MM2位点同步的过程之前,我们首先需要理解一个关键的假设: ''源集群和目标集群之间的消息复制是一一对应的,也就是说,源集群在复制范围中的每一个位点都对应着目标集群中的一个位点,且目标集群中的每一个位点都可以对应到源集群。''

这个假设是基于理论分析的,也是位点同步能够进行的关键前提。

如果这个假设成立,那么我们就可以通过计算源集群和目标集群位点之间的差值,也就是“距离”,来进行位点的翻译。例如,如果源集群的位点是10,目标集群的位点是20,那么他们之间的“距离”就是10。当我们要翻译源集群的位点15时,我们只需要在15上加上“距离”10,就可以得到目标集群的位点25。

!!! ''Q:迁移完在翻译消费位点,还是迁移中翻译消费位点?''

!!!Q:迁移完在翻译消费位点,还是迁移中翻译消费位点?
A:为了使消费者和流应用程序透明、方便地从源集群迁移到目标集群,例如在源集群发生故障的情况下,提出了一个后台作业来定期同步从源集群到目标集群的消费者偏移量,以便当消费者当流应用程序切换到目标集群时,它将从源集群中断的地方恢复消费。

!!!Q:若目标集群中已存在该group位点,是否应该覆盖?
!!! ''Q:若目标集群中已存在该group位点,是否应该覆盖?''

A:需要判断在目标集群中该group是否处于活动状态。如果处于活动状态,则无需同步偏移。
如果目标集群(即备份集群)的消费者位点(也就是 "watermark")比主集群的位点更高,那么就不应该将较低的 "watermark" 写入到目标集群。这是因为,如果主集群的消费进度比备份集群慢,那么写入一个较低的 "watermark" 将会导致消费者回到之前的位点,从而导致消费重复的消息。

!!!Q:翻译过去的位点是否需要精准的处于原集群的那条消息?
!!! ''Q:翻译过去的位点是否需要精准的处于原集群的那条消息?''

A:是的,预期的效果是应该从源集群的group消费到哪个消息,翻译后到group的offset就应该处于那个消息上面。最次的效果也应该处于那个消息之前,接受重复消费若干条,绝对不能接受的是翻译过去后处于那个消息之后,导致有若干个消息被跳过了。

!!!Q:当复制的进度还未赶上原集群的消费位点时,会进行翻译嘛?
!!! ''Q:当复制的进度还未赶上原集群的消费位点时,会进行翻译嘛?''

A:不应该翻译,因为如果翻译,则会在原集群出现负的消费堆积。同时,如果group的消费位点大于该分区的max offset,翻译过去也丧失了意义。

0 comments on commit 6d5ccb7

Please sign in to comment.