00:00
来到文档当中,我们看一看Maxwell,它是由美国这个公司开源出来的一个Java语言编写的my circleq变更数据抓取软件,那他是怎么做的呢?它会实时监控我们MYSQL数据库的变更操作,你比方说我呀,我买搜Q当中新增了一条数据,我把这条数据给修改了,我觉得这条数据没用,我又给他删除了,那么这些动作他能监控的到,但他是怎么监控的?上午我们也简单的提了一嘴,叫做它会监控我们买circle的blo日志啊,监控blo日志所对应的这些变更语句。然后呢,把我们这些变更的语句给它进行一个circle的重播。重播之后,它就会把我们的数据封装成一个JA森的格式,发送给卡夫卡呀,Kiss啊哎等等的,现在各种流数据的处理平台好了,那我们主要看一看,你不是说你会把我们的数据给它进行那啥吧,进行一个重播,重播完之后给封装成一个S格式,那我们先看一看它会Maxwell会把我们的数据给封装成一个什么样的格式来。
01:21
一个一个看。首先我们看insert语句的时候,在insert语句啊,我们会记住这么多内容,Database和table是我们的表明啊,这个地方不用多说了,最大化吧。Database和table啊,这个地方不用多说啊,说我们的数据库名和表名,接下来就有一个type,这个type叫做insert,那大家想一想,我如果说要是插入和删除动作的话,那这个type类型是啥,大家应该也能想得到了吧,插入是insert,删除那对应的就是delete呗。那更新我对应的就是update呗,好,接下来这还有这么一个字段,TS时间戳,这个时间戳代表我们买SQL数据库变更的时间,也就是说我这条数据什么时候写入到了我的表当中的啊,什么时间点写入到了我们的表当中呢?它会给我们进行一个记录,叫做TS时间戳,再来。
02:26
接下来我们这有一个XID,那这个XID啊,它是我们的事物ID,我们的my circle大家都知道它是支持事物的,如果说我们开启了买circleq的事物,那么对应的我执行一条circleq语句,或者是我执行一批circleq语句的时候,它就可以带一个事物,那一条一条的数据,我们都好理解,我执行这一次S口这一条SQL语句啊,它就代表了一次事物没有问题吧,那你说有没有一种这个情况呢?我们在学买SQJBC的时候,我们这么干。
03:02
我们执行了一个开启啊,我我们首先呢开启一个start。Start,一个trans开启一个事务,在开启这一次事务过程当中啊,我执行了多条SQ语句,你比方说我先来一个insert,然后呢,我在执行了一个update。DA,然后呢,我在执行了一个delete。然后我给它关闭了stop,我们的事物啊,Close,关闭了我们的事物。那好了,那大家想一想,我在这个过程当中执行了三条SQL语句,那我们对应的blog日志当中应该有几条数据呢?应该生成了几条数据啊?难道我只有一条吗?我一次事物,我生成一条数据。我们每一次变更操作呀,它都会生成一条数据。
04:01
那也就是说,我这次insert,它会在B当中记录了一条insert语句,我这次update的时候,它同时又会在below当中记录一条update语句,我delete的时候,它又会记录一个delete语句,那现在有这么个事。如果说我这一次事故我执行失败了啊,到最后这我并没有成功的关闭啊,我这次事务并没有成功,而是roll back了,回滚了。那如果说你回滚了的话,或者说出现了一些其他的情况,我呢就想看一看我在这一次事务当中执行了哪些SQL语句,所以说我们就需要这么一个参数叫做XID,我可以通过这个XID我给它进行一个重组,在B浪日志记录的时候,你insert语句我会给你加一个XID,假设啊,它叫123,那我在这一次事务当中所有的操作,他们的XID都是123 123。
05:05
那这就会让我们在这一次事数当中,我们可以通过XID,哎,把我们的在变绕和日志当中啊,我们可以过XID这个字段。帮我们把我们的这些事物给它进行一个重组,那我发现X事物ID是一样的,那它就在一个事物当中,同样呢,我们在这儿还有一个commit这么一个字段,它代表我们这个事物啊,是否提交了,如果说它是true的话,那就证明我们这个事物已经成功提交了再来,那接下来我们这儿还有一个字段叫做date date是啥呢?这就很明显了吧,我们插入的数据。这个里边左边是我们的字段名,ID和name,右边是我们的字段类型,OK,那这个就是insert语句,他所生成的数据,我们再来看一看update它的数据是怎么给我们转化的。首先前面这些不多说了,数据库名还有表名,那tap呀是我们的更新,TS是我们的更新数据的时间XID,它是我们的是ID commit成功提交,那接下来在这个地方,它有两个字段,一个叫做date,一个叫做old。
06:19
Date是我们更新之后的完整的数据。你看啊,我们更新的是谁呀?我们在这执行的这个色后语句update的字段只有一个name,只变化了一个name,从张三变成了李四,那我在这儿,我不光记录了我的name,我还要记录了我的ID,甚至你要是有一些年龄age呀什么其他的字段,你虽然没变,我们也会给你记录到这儿。Date这个字段,它就会记录我们当前这一整行数据所有的字段,在这还有一个old update语句,它对应还会记录一个O的字段,也就是说我变化之前的这条数据,变化之前啊,我变化的这条数据变化之前的这个字段是什么样的?那我在这呢,我只变化了一个内字段,在O里我就只有一个内字段就完事了。好,你看内幕之前是张三,那变化之后是李四,通过这一条数据,我就能知道我当前的ID为一,这条数据变化之前和变化之后是什么样的。好,再来接下来是删除,那删除就比较简单了啊,删除我们看这有一个数据库名,哎,表明,然后呢,Type类型是delete txxid commit,这就不用多说了,都是一样的,那data这呢,我虽然说是删除,我只需要一个ID就完事了,它也会把我要删除的这一整。
07:49
行数据都给我们展示出来,OK,那这个就是MYEX的一个数据的格式,My exl它既然是基于lo的啊,同步我们blo日志,我们现在知道了,那首先我们就要知道它是一个什么样的原理呀,哎,它怎么样能把blog日志给它拿出来呢?那首先我们要知道什么是binlo日志binlog呀,它是一种二进制的日志类型,它呢,会保存我们买SQL数据的所有变更记录,注意啊,是变更记录,它不包括select。
08:27
那这个变更,那我们my circleql的这个变更日志啊,变log日志,它能做哪些事啊,在我们的my circleql当中,他能干这么多事,一个叫做MYQL的主从复制,另外一个叫做读写分离啊,大家不知道有没有听说过组成复制和读写分离,那我们的MYSQ组成复制能实现这么两个啊,不是我们的这个MYSQL组成复制啊,能实现这么两个场景,一个叫做数据库的备份。
09:00
啊,也就是我们所说的组成复制,再一个叫做读写分离,那数据库的备份和读写分离,它们两个是一个概念嘛,大家想一想,哎,它们两个不是一个概念,那它们两个都分别代表了啥?我们来看一下什么叫做组从复制,什么叫做读写分离啊,数据库的热倍,我们看看数据库的热备,我们应该能理解这个含义吧。我们的这个买车数据库。MYSQL,我怕它挂掉,那我怎么办?我在这个地方,我要来一个跟他一模一样的MYSQL数据库,里边的数据是一样的,MYSQL它们两个的数据是一样的,它是。呃,Master。它是standby啊,Stand他是standby他呢一直在给master做一个备份,什么时候master挂掉了,那standby他才会补上来,那大家想一点啊,Master和stand by他俩是只有一个对外工作的吧,那这一点大家要知道啊,什么master挂了这个呃,不能不叫stand,叫s level吧,Love。
10:15
啊,呃,不是stand叫slave主从嘛,主节点和slave啊,说错了再来,那大家想一想,这个主从复制我们怎么样能保证买两台买SQL他们的数据是一致的呢?难道我在插入一条数据的时候,我往这里插入一次,同时我再往这里插入一次,不是的,它是这么干的,它呀会开启,我们要先开启master的一个。我在写数据的时候,我要先把数据写入到我要写的这张表当中,写到表之后,我才会把这条数据给它写入到。啊,能理解吧,再有写完blo之后,我们的这个level呢,它就会一直监控我们blo的变化,监控出来了,他把b log日志的这个变化的内容我拿出来,拿出来之后给他塞回到我们从库的MYSQL表当中,就是这么一个概念,能理解了吧,这个是买S呃热贝的。
11:21
买色空数据库热备这么一个原理,那这个是热贝,还有一个叫做读写分离,我们现在这个是什么呀。这个库我们说它可以既做读也做写,但是我们现在业务,呃,业务这边越来呃,电商的业务啊越来越庞大了,我们读和写都用一台数据库,会导致我们买SQ的压力很大,哎查询的呢很慢,那这个时候我们就要做读写分离了,那读写分离我们在这儿还要有一台MYSQL。假设这台数据库它是我们写的库,那这个数据库就是我们读数据的库,用户呢,想读数据的时候从这读,写数据的时候从这读,那我既然是读写,我给他进行分离了,那我这两台买circle他们两个的数据,我是不是也要让它保证一致?
12:19
数据一致,你才能实现读写分离吧?那同样我们也是通过blog来实现的堆液分离,这台MYS口它也会监控我主节点的,我这台写数据库的。并灶日志的变化监控完之后,它写到我自己的这个表当中,那么这一台my circle它就可以对外工作了。注意啊,这是两个概念组,从它们两个只有一台节点对外工作,那读写分离,它们两个是同时对外工作的,能理解吧,我一台读一台写。他们两个要同时对外工作,哎,我不管你是组成备份还是读写分离,我都要保证你们这个这这些数据库之间,他们的数据是一致的,你只有是一致的,你才能叫备份,你只有是一致的,你在读和写的时候才不会出现问题。
13:16
不然你看我读和写的时候数据不一致,我想读取idv的这条数据,但是你还没有写过来呢,哎,你这是不是没有啊,那我想读取一个数据啊,那我这个地方我读到了,但实际上我写库这个地方我根本就没有,那是不是也不行啊,好,这个就叫做my circle的组,从复制和读写分离它的一个作用啊,再来。啊,那my circle组成复制和读写分离,它的原理到底是啥呢?我们在这儿有这么一张图,来,我们就拿着这张图再仔细的给大家说一下my circleq主从复制它的一个原理,这张图是my circleq官网上的一个图啊。
14:02
左边是master总节点,右边是level重节点。首先我们往my circleql数据库当中写入了一条数据,往my circleql数据库表当中写入了一条数据。接下来data change。Blo呀,发现我们数据的变化了,那他就会把变化的这条数据的变更记录给它,记录到我们的brylo当中,也就是我们的blog二进制日志当中,哎,那大家分析一个问题,你说我们往my circle表当中写入一条数据。我是先写入MYSQL表呢?我还是先写入blo日志呢?先写一还是先写二?先写谁要更好一些,先写日志,先写二,好了,那我给大家分析一个问题,我们的这个日志它是什么呀?它是一个文件吧。
15:00
行,我呢,现在写一条SQL语句,我把这条circleql语句记入到了文件当中了,然后我再往my circleq当中写的时候,我的MYSQL挂了。那这样会出现一个什么问题啊,他会不会出现我的日志变更了,但是我买SQL当中没有数据。但是我的它是监控我的blog的呀,你买SQ当中没有数据,但是blo有了,那我的从库它居然有数据了,这样就会造成一个组从不一致的情况。所以说我们只能先写数据库啊,先写表,把表数据写入成功了之后,我们再写入这个。啊,必须这么干好,那现在数据库写入数据了,然后发现了data change,数据变化了呢,我们会把数据啊给它记录到blog二进制日志当中。那接下来我们呢,修改MYSQL的数据库里面的数据了啊,一张表的数据它发生了变化了,接下来我们b log日志那就发生了变更,那对于我们的c level这边呢,它一直有这么一个线程啊,这个图当中没有画这个线程呢,干嘛呢?它会时刻监控我们b log日志的变化。
16:23
当他发现我们的B浪日志啊第一次发生变化的时候,会对应的开启两个线程,一个叫做IO线程,一个叫做circle线程。那这两个线程它都干了啥事呢?IO线程,它去我们master的blo日志当中去找我们变更的这个日志,找到了我们变更的日志之后,它会把我们变更的日志给它返回到我们的IO线程,然后IO线程还没完事,IO线程啊,会把我们的数据给它写入到这么一个临时的中继日志当中,叫reallylo。
17:07
啊,这不是我们blo日志了啊,注意,虽然它俩放的位置一样,这不是b log日志,它叫reallylo,那它是用来干嘛的呢?我们看一看,写入到这,当我们的circle线程它发现我们中继日志,也就是这个really log发生变化的时候,那接下来这个circle线程它开始工作了,它呀对我们的这个circle线程进行了一次replay。重播,把我们的circleq语句给它重播了,假设啊,我们现在在殡量日志当中记录的就是circleql语句,当然了啊,变量日志有很多模式,我们就先当它是circleql语句,把这个circleql语句重播之后,我是不是就可以给它写入到我们的MYSQL数据库当中了?它是这么样的一个冲播过程,那好了,接下来这一次写结束之后了,如果说没有数据了,对应的我们IO线程和circleq线程,它就进入了睡眠的状态,哎,它那个啊,它进入了一个等待的状态,那什么时候我的这个线程它又监控到我们B烙日志发生变化了,那怎么办?我的IO线程和SQ线程又开始工作了,循环往复啊循环往复,那我们的这个level它的b love日志在哪呢?
18:30
因为我们的level它还没有开启病灶日志。所以为什么他没有开启B日志呢?因为我们没有人监控c level数据库的变化了,好了,那现在我们现在又有一个人,他要监控c level数据库的变化了,我们也可以给level数据库也开一个。B log日志嘛,变log然后怎么办?同时当我们level数据库发生变化的时候,它发生了这个data change了,然后那其他的人再从他的blo日志当中开始同步这个reallylo不是blog啊,不要搞错了,那我们刚刚说的这个叫什么呀?这个叫做my circle主从复制的原理,那我们本次课程讲的不是my circle,我们讲的是啥呀?我们讲的是ma主从原理,那有同学说了,你讲mawell组成复制的原理,你为什么要把买S的原理也给我们讲清楚呢?原因就是因为。
19:30
Maxwell他呀,会把他自己伪装成一个my circle的。它的工作原理就是MYL组成复制的原理,在整个这一个环节当中啊,它就是mywell mawell就干了这么多个事,Max well,它就干了这么多个事儿,但是它跟我们的这个主从复制啊,在内部的执行还是有一定的区别的,那首先他监控我们bin log日志,这个就不用多说了啊,他肯定会监控我们bin log日志了。
20:09
IO线程它肯定要有,同样它拿回来之后,你比方说它也会写入到我们的这个类似于中继日志,但是macel里就没有这个什么终极日志的概念了,他会干嘛呢?他会把我们读取到的这个日数据,我给你进行一个重播啊,他也会重播,他必须要把我们这个数据给他进行一个转化呀,那他转化的就不是买S表所需要的数据格式了,还记得他转化成一个啥了吗?他给重播成一个什么样的数据了?它重播成了一个啥意思。啊,他把数据给重播成了一个Jason的格式,就是我们在最开始的时候看到了那三类insert update delete的再生格式,然后它不会再往MY当中写了,因为它是Maxwell,它没有数据库的概念,它发送到哪了呢?它发送给卡夫卡了。
21:08
他把谁发送给卡普卡了,就把这个Jason给发送给卡普卡了,这个就是Maxwell的原理。
我来说两句