一、故事背景 前言 最近工作中遇到了一个数据同步的问题 我们这边系统的一个子业务需要依赖另一个系统的数据,当另一个系统数据变更时,我们这边的数据库要对数据进行同步 那么
一、故事背景前言… 最近工作中遇到了一个数据同步的问题 我们这边系统的一个子业务需要依赖另一个系统的数据,当另一个系统数据变更时,我们这边的数据库要对数据进行同步… 那么我自己想到的同步方式呢就两种: 1、MQ订阅,另一个系统数据变更后将变更数据方式到MQ 我们这边订阅接受 2、数据库的触发器 但是呢,两者都被组长paas了! 1、MQ呢,会造成代码侵入,但是另一个系统暂时不会做任何代码更改… 2、数据库的触发器会直接跟生产数据库强关联,会抢占资源,甚至有可能造成生产数据库的不稳定… 对此很是苦恼… 于是啊,只能借由强大的google、百度,看看能不能解决我这个问题!一番搜索,有学习了一个很有趣的东西…
二、什么是Canalcanal:阿里开源mysql binlog 数据组件 官网解释的相当详细了(国产牛逼)…下边我也是照搬过来的… 官网地址如下:https://github.com/alibaba/canal/wiki 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。ps. 目前内部使用的同步,已经支持mysql5.x和oracle部分版本的日志解析 canal [k?’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 工作原理
canal呢,实际是就是运用了Mysql的主从复制原理… MySQL主从复制实现 复制遵循三步过程:
如何运作 原理很简单:
通过官网的介绍,让我们了解到,canal实际上就是伪装为了一个从库,我们只需要订阅到数据变更的主库,那么canal就会以从库的身份读取到其主库的binlog日志!我们拿到canal解析好的binlog日志信息,就等于拿到了变更的数据啦!… 这样的话呢,我们即保证了不影响其系统数据库正常使用,又不会侵入他的项目代码,一举两得 ok,接下来开始实战篇… 三、Canal安装(1)事前准备(1)数据库开启binlog使用canal呢,有一个前提条件,即被订阅的数据库需要开启binlog 如何查看是否开启binlog呢? 登录服务器上数据库或在可视化工具中 执行查询语句: 如果出现 log_bin ON 表示已开启Binlog
如果服务器上的数据库为自己安装的,则找到配置文件my.conf 添加以下内容,如果买的云实例,则询问厂商开启即可 在my.conf文件中的 [mysqld] 下添加以下三行内容
(2)数据库新建账号,开启MySQL slav权限canaltest:作为slave 角色的账户 Canal123…:为密码
连接测试 那么到这里,准备工作就好了! 可能呢,有的小伙伴有点懵,你这是在干啥?那么咱们就来理那么一理! 敲黑板了哈! 1、事前准备,是针对于订阅数据库的(即主库) 2、实际步骤也就两步 1:更改配置,开启binlog 2:设置新账号,赋予slave权限,供canal读取Binlog桥梁使用 3、以上操作与canal本身没啥关系,仅仅是使用canal的前提条件罢辽… (2)Canal Admin 安装canal admin 是 一个可视化的 canal web管理运维工程,脱离以往服务器运维,面向web… canal-admin设计上是为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作 canal-admin的限定依赖:
下载
解压
进入canal-admin目录下查看
修改配置
里边的配置 按照自己的实际情况更改…
导入canaladmin 所需要的数据库文件 这里需要注意了,要和 application.yml中的数据库名对应,你可以选择命令导入,也可以Navicat 可视化拖sql文件导入…一切…看你喜欢. 我这个玩canal的服务器呢,是新安装的,mysql直接用docker安装即可,具体可查看我的博客: Docker在CentOS7下不能下载镜像timeout的解决办法(图解) CentOS 7安装Docker 需要注意的是,使用docker 安装的mysql 是无法直接使用 mysql -uroot -p 命令的哦,需要先将脚本复制到容器中,docker不熟练或觉得麻烦的同鞋,请直接使用Navicat可视化工具… 导入canal-admin服务所必需的sql文件 如果是服务器软件软件安装的mysql 则直接执行以下命令即可
启动 直接执行启动脚本即可
默认账户密码:
(3)Canal Server 安装canal-server 才是canal的核心我们前边所讲的canal的功能,实际上讲述的就是canal-server的功能…admin 仅仅只是一个web管理而已,不要搞混主次关系… 下载
解压
启动,并连接到canal-admin web端 首先,我们需要修改配置文件
注意了,密码如何加密!!! 要记得,前边 canal-admin 的 aplication.yml 中设置了账户密码为 admin:leitest
所以,我们这里需要对明文 leitest 加密并替换即可 使用数据库函数 PASSWORD 加密即可 SELECT PASSWORD(‘要加密的明文’),然后去掉前边的* 号就行 启动并连接到admin
查看端口看是否有 11110 、11111、11112 netstat -untlp 看了一下,发现没有,说明server 没有启动成功 看下日志
解决办法: 1、canal-admin 先停止后从起 2、canal server 先以之前的形式运行,不输入后边 local 命令 3、关闭canal server 4、再以canal server 连接 admin 形式启动 admin页面上新建server 修改配置,注释 (instance连接信息,我们还是以前边设置的 admin:leitest 为准,所有这里需要注释掉,如果不注释,那么我们代码中连接则需要使用此账号以及密码) 接下来咱们创建instance 如何理解server 和instance 呢,我认为,可以把它当做 java 中的 class 和 bean 即 类和对象 server 为类 instance 为其具体的实例对象 ,可创建多个不同的实例… 而我们这边监听到主库变化的呢,则是根据业务,对不同的实例即(instance )做不同配置即可… 根据自己情况进行过滤数据
更多设置请见官网:https://github.com/alibaba/canal/wiki/AdminGuide 如此一来,一个简单的canal环境就搭建好了,接下来,咱们开始测试吧! (4)springboot demo示例引入canal所需依赖
配置
代码
测试查看 数据库修改数据库时 数据新增数据时 删除数据(把我们才添加的小明删掉) 当我们操作监控的数据库DM L操作的时候呢,会被canal监听到…我们呢,通过canal监听,拿到修改的库,修改的表,修改的字段,便可以根据自己业务进行数据处理了! 哎,这个时候啊,可能有小伙伴就要问了,那么,我能不能直接获取其操作的sql语句呢? 目前,我是自己解析其列来手动拼接的sql语句实现了 话不多说,先上效果:
实际上呢,我们也就是拿到其执行前列数据变化 执行后列数据变化,自己拼接了一个sql罢了…附上代码
当然了,这只是简单的demo 演示,您可根据自己的业务进行修改完善即可… 上边的安装步骤呢,我也是不断的测试过,没有问题,当然可能或多或少有些坑没有踩到,但是如果您按照我的步骤来,大概率是一马平川的… 附上项目源码:springboot-canal https://github.com/leilei0220/springboot-learn |
2021-06-05
2021-05-27
2021-05-26
2021-06-05
2021-05-16