开发者学堂课程【如何将PolarDB-X与大数据等系统互通:如何将 PolarDB-X 与大数据等系统互通】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/984/detail/14937
如何将 PolarDB-X 与大数据等系统互通
原来的那个 client example 里面有个 print column 这样的一个方法,它只是把它打到控制台上,到这里就完了。那我这边就追加了一段同时生成一个 insert into accounts,然后往里面加增量的数据,写到那Kinkhouse 就是这段投递的一个代码。那么现在回到刚才那个上面来看一下,现在 PolarDB-X 有没有正常的运行,那如果它正常运行,我现在通过本地的8527这个端口,用 root 这个账号,密码也是123456就可以连上它了,可以看到已经正常的点到了 PolarDB-X 里面,来看一下系统当前的一个状态,来建一个本次测试时候需要的一个库,就转账测试所需要的一个库,建这样的一个库,我来看一下当前 Binlog 的一个状态,可以看到刚才这个 Binlog 已经建库并记录到全体Binlog 里面,而且格式是跟SQL的那个格式是一样的。抛弃一个 PolarDB-X ,那么接下来其中一个server,那个 server 直接连接到这个 PolarDB-X 上,server使用官方提供一个 Run ,它做了一个简单的封装,可以看到在这里会传进去一堆的参数,这些参数本身都是所需要的。这里面关键的一个点,第一个是要指定PolarDB-X ,这里就是8527端口,那就账号 PolarDB-X ,密码是123456,不过正常再过一会这个clinicnk server 就会正常的连接到 PolarDB-X ,开始消费它的一个增量的日志,可以登到这个容器里面来看一下,这个里面应该是好了,那就再建立一个 Kinkhouse ,回去那个页面上就是给 Copy 过来了,唯一的增加的一个地方就是做了一个端口的映射,它容器里面8123这个端口映射到主机上,这样做的原因是一会要将这个远程的 ecs 端口在映射到本地,以方便就是本地的那段投递的代码能够正常的把这些变更或者投递到 Kinkhouse 里面。这个时候就在远程的服务器上的三个容器就准备完成了,第一个是PolarDB-X ,第二个是clinicnk server,第三个就是 Kinkhouse 。现在需要再做另外一件事情就是将这三个服务它们的端口映射到我的本地的电脑上,看这个端口的映射其实也比较简单,可以用一个ssh,ssh提供一个命令,它在正常登录之后加一个参数就是大写的l变量参数,那它前面一段的意思就是 listen 本机的一个IP和端口,然后后面这段的意思就是把收到的来自于本机的连接到8527端口的所有流量全部无脑的转发到远程那个机器827单子上面,这样也就达到了端口转发的两个目的,那现在需要转发两个端口,第一个是 canal server ,第二个是 pink house ,本地那个 client 这个例子就可以跑起来了,那 clever server 默认的端口是11111,那第二个需要把 Kinkhouse 映射过来, Kinkhouse 默认的是8123,那也来做一下。这样我就将远程的两个服务就是 clever server 和Kinkhouse 两个端口,一个是11111,一个是8123,映射到了本机的端口,可以简单来看一下,那现在这个里面连接的是本地的那个点,来看一下本地所建立的端口,先看一下11111有没有存在,很明显是存在的,然后看一下第二个8123,它也是存在的。接下来尝试跑一下 Canal client 的代码,然后在“52”这个位置打一个断看能不能正常的去发消息。因为现在 PolarDB-X 里边,也就是最远端,它其实是没有变更的,或者说只有一些系统心跳的消息,所以它其实不应该走到这一步,但是它居然完成了,那这就是心跳消息。再进一步到里面去看一下,也就说它走到这里,如果它是一些 dl 的变更 insert、delete、update的时候,它才会走到所需要的这个代码,如果不是它应该不会走到这边,反之就会结束了。
最终是需要它在 print 的时候把它写到一边,就是目前理论上它能从 messenger 拿到消息,意味着已经成功的拿到了clever server 那边的增量的消息,也就意味着clever server 已经成功的跟上游的 PolarDB-X 进行了一个增量的订阅,然后把这两个断点取消掉,那这个时候数据已经从PolarDB-X 到了 canal server ,然后再到了 canal client ,那接下来需要在原端,也就是PolarDB-X 那端来开始转账测试,产生一些dl的一些数据,那期望这段代码能够把这些变更投递到下游的 Kinkhouse 里面,在投递之前需要在 Kinkhouse 里面去建对应的一张表,因为这个这个容器是新建的,所以这里面既没有库,也没有表,所以如果现在直接投递会产生报错的结果,在建立的时候也是用了官方的一个一键连接到已有的容器里面的命令,连接到 Kinkhouse 容器里面的命令,这个就相当于执行一下 MySQL ,直接连接到了一个对应的 MySQL ,那这里就相当于获取到了一个连接到 Kinkhouse 一个终端,那这个连的是刚才启动Kinkhouse 的容器,来看一下它里面目前库的情况,这里面是没有想要叫做 test 这样的一个库,所以先来建立一下,之后再建立一下需要的表,反正测试的表结构还是比较简单的,所以它名字叫 accounts ,它里面有两列,一个叫ID也就是用户的,第二个是它账户余额 balance ,也就是说现在系统里面有一批人,他们现在账户余额是多少钱,就会记录这么个信息,之后系统会开启这些人之间的相互转账,你这边扣100,那他那边加100,这样一个过程。那可以看到Kinkhouse里面建表与 MySQL 基本一致,就是在最后制定一些额外的东西可能不太一样。
现在这张表已经完成了,看一下那显然是空的,这个符合预期,再来看一下远端也就是 PolarDB-X ,现在 test 这个库里面是没有表的,接下来启动转账测试,我把它放在另外一个工程里面,这个是平时用来测试的一个代码,可以看到它连的确实是电脑上的127上面的一个827端口,因为用 ssh 做了一个端口映射,所以才会连接到 ecs 的那边,并且账号和密码都是正确的,现在来启动,那个转账测试启动之后会在 PolarDB-X 或者 ecs里面建一张表。我这边端口映射还没做,我需要把远程的 PolarDB-X ,也就是它8527端口也映射到本地的电脑上,那再来跑一下转账测试,可以看到转账测试已经正常的在运行,然后来看一下PolarDB-X,这张表已经有了,那里面也有100个账户,这账户余额都是以前的,但是现在已经有些变化了,说明它们的转账已经在进行了,那同时刚才 Canal client 的那这个代码,它的断点已经成功运行到了即将写的 Kinkhouse 的那段代码,也就是说已经成功的获取到了这些dl的变更。执行第一条的已经成功,也就是说此应该在 Kinkhouse 里面看到了一条数据,现在打开的终端是那个Kinkhouse 一个命名窗口,这时候再来执行一下看一下有一条数据。
下面将这里的断点取消,让它是这些增量实施的一个同步,可以看到它在不停的 insert ,这个时候再来看一下最下游的 Kinkhouse ,那它里面已经有385条的,为什么会比 PolarDB-X 那边多?因为可以看到这里面有 ID 重复的情况,因为那边在代码处理 update 的时候把它转换成了 insert ,所以这边会往下游插入重复的数据,同步的数据因为没有走去重,所以其实是个追加的过程。
这样就会有这样一个现象,但没关系,这次的重点是已经成功的搭建起了一条同步的链路,这个链路最上游是 PolarDB-X ,那它的中间层是 clinicnk server ,再往下有一个Canal client 消费的clinicnk server里面的数据,最后 Canal client 这个代码的数据投递到了最下游的 Kinkhouse ,现在已经成功的搭建这样的一个的链路,那这里想强调几个点,第一个 PolarDB-X 提供了一个全局的一个 Binlog ,那这个功能是跟 MySQL 保持了一个完全的兼容,像 Canal 这样的一个工具,因为 Canal 是用来订阅 SQL Binlog的,那把它拿过来无脑的接到了 PolarDB-X 上,然后成功地取到了增量,说明 PolarDB-X 的 Binlog 跟 MySQL 的 Binlog 确实有一个很好的兼容性。
那在接下来获取到了增量之后,能够更了解其他的按照格式去解析,接着把增长数据也能投给下游,所以也就是说当原有的一些系统切换PolarDB-X 之后,你原有的是通过那个 Binlog 获取增量的,所有的下游的系统不需要做修改,还是可以正常的在运行,这样可以极大的降低去做系统切换时候的一些成本,这是第一个例子。
那现在就把这些东西全部停掉,一个是先把转账测试给剪掉。可以看到此时这个代码也停掉了,这个就是第一个例子。回到PPT,那在演示第二个例子之前,也就是将MySQL作为 PolarDB-X 的一个这样的一个例子。
先把环境清理一下,PolarDB-X 还用刚才那个,可以看到现在就剩一个容器,这个容器就是 PolarDB-X ,接下来将容器里面的数据清一下,那回到初始的状态,就是这个时候系统里面有一个库,里面的没有表的。
接下来建一个 MySQL 的容器,它也是直接用了官方提供的一个形象,我跑了 MySQL 容器,它的名字叫 MySQL ,然后root密码设了123456,然后做端口映射,这样容器里面3306映射到了我的那个 ecs 上面,这样就是在远程的 ecs 上面,我就跑了两个容器,一个容器是 PolarDB-X ,第二个容器是 MySQL , PolarDB-X 的是8527这个端口, MySQL 是3306,那么接下来就是将这个MySQL通过指令连接到PolarDB-X上,昨天连接到 MySQL上面的,可以看到连的是330端口,账号用的是root,密码用123456。首先来看一下里面是不是空的?需要建一个数据库,这样就上游 PolarDB-X 保持对齐了,那表就不建了,直接把它同步过来。接下来用这个自带的指令,就是打起一个同步链路的指令,它会有几个参数,第一个是指定 master host ,第二个参数是 master port,第三个参数是 master user,用来做同步的账号,最后才会让你指定说你从哪个Binlog文件开始,来看一下目前 PolarDB-X上有哪些Binlog文件,目前还是一个Binlog文件,直接无脑复制过来。最后就是要指定从这个Binlog文件的那个位置开始消费。然后来看一下,可以看到这个因为 PolarDB-X里面目前没变更,但是这个位点却一直在增加,为什么呢?