00:00
好,那接下来呢,在我们读取的环节当中,其实还残留一个点。啊,它有什么样点呢?刚才我们说了,因为你是多并行度读取,但是单并行度,其实这个过程就解决了数据一致性问题,但是在多个并行度的时候,它会存在什么样的问题呢?我们来做一个思考,比方说第一条,第一个创的是要读的数据一到十好,第二个呢,是。11~20好,那我们就拿两个或者三个举例子也可以啊,21~30。那有没有可能是这种情况,什么情况呢?在我一到十的时候。读取数据,我低位点呢是900。高位点呢是1000。好。那么接下来呢,在我们这个地方读取的时候,它呢,读取的低位点是900。10哎,多了一条数据对吧,好它呢是高一点一千。
01:00
零二十。好,它呢,有可能是905,哎,它开始的时候,因为三个零度,谁到底最先启动,这不好说的对吧,好,那将来呢,它可能到这个。1030。啊,读的慢一点对吧,到A0300样数据,那么这个时候存在什么样问题呢?因为我们知道在读取blog数据,也就增量阶段只有一个平行度。啊,只有一个并行度对不对?那么我们想那只有一个并行度,我们刚才说了,它是要消费从低位点到高位点的数据,然后呢去对这个中间数据做一个处理,但现在低位点跟高位点的数据怎么样都不一样。对吧,每个人低位点跟高位点的都不一样,那我们想他应该从哪消费到哪。大家思考一下。为了数据整个。一致性对吧,那我需要从哪开始消费。
02:06
其实这个问题。不难理解,不难去思考对不对,因为我们想到如果数据我们不想丢,那肯定要从最小的开始,而且呢,一直要消费到最大的,再往后这个1030往后的数据来一条我是正常都要吧。都要这个数据对不对。对吧,这个其实比较好理解啊,那接下来呢,我们就主要的核心这块,它通过这种方式取最小值跟这里边核心的最大值对于同一个表里边,对吧,它取一个多个串传过来的最小值跟最大值,它能保证全局的一致性,因为之前我们聊的是单个。创个礼拜的一致性啊,这样就保证多个创客礼拜一致性啊好,那接下来在源码当中,我们大家看一下源码呢,我给大家放到了代码当中,这边有一个源码包对吧?呃,好,那下来呢,你解压放到你的库里边就好了,你就可以打开用D打开,打开之后呢,下载一下依赖,然后呢,我们看到是MYSOCDC,这个里边我们主要看一下刚才我们所说的那个流程。
03:11
嗯,那在哪呢,在我们的。里面的reader。好呃,那我们这个是我们有个核心的类啊,然后接下来呢,还有一个S这边有个read。哎,在不在这个reader,在我们的一个切分。嗯,我给大家找一下这个当中啊。A塞啊A塞na我们也可以看一下啊,首先呢,它有一个创。对不对,要做切分啊,然后呢,有这个loli a s。啊,这样去做处理的好,那我们要看的数据呢,在这好在呢,它的一个分配器,那首先我们来看一下,我们就挑核心的流程,哪个呢?在这里边有一段代码是这样,叫create blo lead,我们最关心的不就是说lo。
04:03
读取blog到底从哪读吗?对不对?好,那我们看一下,首先最核心的代法给它摘出来在这。它有一个初始化的最小值,然后接下来呢,它遍利我们已经分配的叫snapsho的split,诶我们就可看看叫快照的split,这个呢叫Bo split,什么叫快照split呢?就是说用来读取每一个切片创。这个是查询原表数据,所以呢叫快照,做快照,刚才我们在写代码的时候也看到了,第一阶段做快照对吧,好便利它,便利它之后呢,判断当前你里边每个人当中最小的这个。Offset啊,获取到最小的offset,哎,获取到最小的offet呢,然后做一个什么事。做个处理。对吧,如果说你比我当前初始化的这个还小,那我们就更新一下。就更新一下。啊,因为你多个阶段可能来的有的更小,有的你因为多个阶段谁先完成谁后完成,也不知道,完成之后上报之后来我做一个更小,更小之后呢,它将这个数据来看啊,你它去构建我们的。
05:15
ET,也就是说blo读取从我们多个创的最小的这个位置开始读,这样保证不丢数据。啊,不能丢数据对吧,因为有的改了,如果你从最大的开始挑,那么有可能会有的阶段,中间阶段你拿不到丢了,这是我们最小的,那接下来还有一个点,中间它是如何处理这个数据的,就是说我读到了这个IDP一样,对吧?接下来数据如何处理,那在哪呢?在我们刚才看到这个类里面叫b log reader。也就读取到这个数据之后,我们应该如何处理,在b log当中读取到数据对吧,那在这边。其实写的比较清楚啊,在这边好,嗯,那我们看一下。首先比方说举个例子,有两个斯利斯里一一,它是呢?零到1024 1024~2048,同时有一个高位点。
06:08
啊,记录一个高位点,因为低位点呢,我们已经传进来了,跟到读取的时候对吧,他说高位点呢,是一个high water mark0还我MARK1,那接下来我们看啊,他说这个数据呢,什么时候数据。他说属于仅仅属于这个当中的数据,或者说成什么呢?大于我零的数据可以被输出,呃,同时呢,还有什么数据。第二阶段属于它的数据和大于WHATMA1的数据可以被输出,那这个讲的是什么意思呢?对吧?那这个很奇怪,你说的什么意思不太懂,我们就直接看这个方法就行了,它不难理解,对吧,叫shouldit,也就是说应该需要发送的数据啊,什么样数据需要发送呢?我们来看一下啊,首先第一个判断。呃,是否我们当前这个数据是一个什么呢?叫data change啊,什么意思,我们看一下点进去,也就是说你的类型是什么呢?叫operation,也就是说来点开它的操必须是一个什么。
07:13
Op是一个操作,而不是其他的内容,也就是说这个里边必须得是read,其实更细一点可以叫read,因为全量阶段对吧,Read数据同时呢,在我们blog当中,我们必须要我们现在读取blog要干什么事啊。就是要对全量读过来的数据做一些更正。啊,用我们低位点到高位点,对我们全量数据做一个更正,所以既然你读取的是数据本身啊,所以必须得是一个op操作,才需要像事物的开启啊,假如说你是其他的一些操作,那不需要,所以如果你不是,那么这条数据直接放行。就过了,因为这个不涉及到对数据可能做修改,对吧,直接放行好,那将来如果是如果是获取表的ID,接下来获取我们的blog position。
08:08
也就是说在blog当中我们有一个低位点,这个高位点,那当前你这条数据到底是哪个位置,对吧,有可能你消费到高位点之后了,是有可能的啊,所以呢,我们要保留一个这个位置。把它取出来,取出来之后做一个什么事呢?跟我们当前这张表当中最大的我进行比较,也就是说创刚才我们举的例子,900~1000。九百一到1020 905~1030,这张表整个的有一个最小值900,从它开始消费好,然后接下来还有一个1030,就是表的多的吗。那我主要要的是小值跟大值之间。对吧,Low跟high之间对数据内存数据要做更正,但是大于它的数据,新来数据直接放行,所以如果叫is at or before。
09:05
对吧,在这之前那么直接可以放弃。啊,不属于这个之间的数据,直接放行好,那假如说是属于这个之间的数据呢。是不是我们有可能对这个数据要做更正了,首先获取出来K主见啊,这就要求我们这个表呢,得有主见的一个点啊,因为根据主见我们才能知道。数据到底要不要做更正,好,那接下来逐渐获取到了,看循环,因为我们可能这个数据来自于,因为我们已经确定了log跟high是拼接起来的,900~1030,那这个中间呢,可能每一个窗口的数据都在这里面都存在,所以呢,我们根据表ID获取到所有完成的。数据,然后对这个数据做一个遍历,遍历之后判断当前这个。在不在当前info当中,如果是就是我们举的例子,102做了两次更新。就刚才我们在文档当中看到这个。
10:03
K2做了两次更新,如果我们的K在这个当中,并且我们的。普数据属于这个范围,那么正常输出。啊,我们可以正常输出。对吧,我们可以做一个正常输出,好,那如果说比方说。我们第一个窗口是什么呢?一到十好,那我消费的900~1030当中,有没有可能有一条数据是11 K是11。有可能吧,那11被他所便利到的时候,被我们一到十所遍利到,我们在这个里边要做输出吗。注意并不能输出,因为11列表数据应该归谁管?归11~20这个管啊,所以这个地方是一个负循环。啊,是一个训款。
11:00
一定要注意一下,当这条数据所有人都没有的时候,可能是一个新增数据,刚才我们举的例子,那你负责21~30,好,那我如果是31这条数据呢,是不是遍历完之后。所有人都不能够处理我这个数据。对吧,啊,所有人都不能不能处理我这个数据,所以呢,它也是正常输出的啊,并不需要放在内存当中去做什么处理。啊,并不需要做,放在内层当中做这个处理是这个意思对吧?好,那我们要知道一下,每个人都有他自己的一个区间去做处理。啊,在便利完成之后,那这个数据呢,就应该知道它应该去往何处了,啊,他应该去往何处,是这样的一个点对吧?好这个呢,我们要清楚一下,其实就是说通过这个ET判断来决定当前这个数据要更新老的数据,还是直接做一些输出了。
我来说两句