本文转载自微信公众号《微技术》,作者汤姆哥。转载本文请联系微科公众号。大家好,我是Tom~MySQL数据库想必大家都很熟悉吧。今天和大家聊聊数据同步。关于数据同步,我们常用的策略是同步双写和异步消息。1.synchronousdoublewriting:字面意思是synchronous+Doublewriting。例如旧数据库模型重构,数据迁移到新数据库等。迁移过程中,如果有数据变化,必须同时写入旧库和新库,两边同步更新。优点:同步机制保证了数据的有效性。缺点:额外的同步处理逻辑会造成性能损失。2、异步消息:如果依赖方过多,我们通常会将变更数据异构发送到MQ消息系统。感兴趣的商家可以订阅消息主题,拉取消息。然后根据自己的业务逻辑进行处理。优点:可以异步进行架构解耦,减少主链路的性能损失。如果有多个消费者,就不会有指数级的性能叠加。缺点:异步机制不能满足实时性,有一定延迟。只有最终一致性才能实现。以上两种方案都是硬编码的,那么有没有通用的技术方案呢?无论您从事何种业务或写入什么数据,都无关紧要。对于平台,可以抽象成MySQL表,直接同步表数据。只有用户真正关心数据内容。可以参考MySQL的主从同步原理拉取binlog,解析其中的数据即可。流行的中间件是阿里开源的Canal。今天我们来做一个技术解决方案。大致内容如下:1.Canal介绍运河,翻译过来就是水路/管道/沟渠。增量数据订阅和消费。Canal的诞生是为了解决多个备库与主库之间数据同步对主库造成的压力。慢慢的,这个流水线被发扬光大,应用场景也越来越多。工作原理非常简单。它伪装成MySQLslave,模拟MySQLslave交互协议,向MySQLmaster发送dump请求。MySQLmaster收到canal发来的dump请求,开始将二进制日志push到canal,然后canal解析binlog日志,然后存储到不同的存储介质中,比如:MySQL、Kafka、ElasticSearch、Pulsar等业务场景:实时数据库备份ES数据索引的构建与维护分布式缓存的同步维护(如:Redis)数据异构,订阅者可以根据自己的业务需求订阅消费,如:Kafka、Pulsar等2.InstallMySQL1andpulltheMySQLimagedockerpullmysql:5.72、查看镜像dockerimages3、启动MySQL进程dockerrun\--namemysql\-p3306:3306\-eMYSQL_ROOT_PASSWORD=123456\-dmysql:5.74、查看进程[root@iZbp12gqydkgwid86ftoauZmysql]#dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESe92827897538mysql"docker-entrypoint.s..."4secondsagoUp2seconds0.0.0.0:3306->3306/tcp,33060/tcpmysql5,进入MySQL容器dockerexec-it167bfa3785f1/bin/bash注意:修改一些配置文件,可能会遇到一些问题,如:在docker容器bash中使用vi或vim提示:vi:commandnotfound因为没有安装vi编辑器,可以执行如下命令apt-getupdateapt-getinstallvim6,常用MySQL客户端命令#登录mysqlmysql-uroot-p111111#显示数据库列表showdatabases;#选择数据库usemysql;#显示所有表showtables;#显示表结构描述表名;其他更多命令:https://www.cnblogs.com/bluecobra/archive/2012/01/11/2318922.html3.创建MySQL相关配置MySQL用户,用户名:tom,密码:123456createuser'tom'@'%'identifiedby'123456';GrantSELECT,REPLICATIONSLAVE,REPLICATIONCLIENTon*.*to'tom'@'%'授予用户所有库的读写权限:tomidentifiedby'123456';修改MySQL配置文件my.cnf,位置:/etc/my.cnf[mysqld]log-bin=mysql-bin#Openbinlogbinlog-format=ROW#Selectrowmodeserver_id=1#ConfigureMySQLreplaction需要定义,do不与canal的slaveId重复注意:需要重启MySQL容器实例,执行命令dockerrestartmysql查看binlog模式:查看binlog日志文件列表:查看当前正在写入的binlog文件:4.安装Canal1并从官网下载安装包地址:https://github.com/alibaba/canal/releases本次实验使用最新版本v1.1.5,主要针对不同客户端进行个性化支持,属于生态扩展其他更多功能可以到官网查看解压后的tar.gz压缩包tar-zxvfcanal.deployer-1.1.5.tar.gz打开配置文件conf/example/instance.properties,修改配置如下:##v1.0.26版本slaveId后面会自动生成,所以不需要配置#canal.instance.mysql.slaveId=0#databaseaddresscanal.instance.master.address=127.0.0.1:3306#binlog日志名称canal.instance.master.journal.name=mysql-bin.000001#mysql主库链接起始binlog偏移量canal.instance.master.position=156#mysql主库链接起始binlog时间戳canal.instance.master.timestamp=运河。instance.master.gtid=#username/password#MySQL服务器授权的账号密码canal.instance.dbUsername=rootcanal.instance.dbPassword=111111#字符集canal.instance.connectionCharset=UTF-8#enabledruidDecryptdatabasepasswordcanal.instance.enableDruid=false#tableregex.*\\..*表示监听所有的表也可以写具体的表名,用来分隔canal.instance.filter.regex=.*\\..*#mysql数据分析表的黑名单,对于多个表,分开canal.instance.filter.black.regex=启动命令./startup.sh由于使用了阿里云的ECS服务器,发现没有安装JAVA环境。从Oracle官网下载JDK8安装包:https://www.oracle.com/java/technologies/downloads/#java8然后通过以下方式将安装包上传到ECS服务器scpjdk-8u311-linux-x64命令。tar.gzroot@118.31.168.234:/root/java//上传文件安装JDK8环境文件:https://developer.aliyun.com/article/7018645.启动Canal,进入canal.deployer-1.1.5/执行bin启动脚本:./startup.sh进入canal.deployer-1.1.5/logs/example如果exam??ple.log日志文件出现如下内容,则表示启动成功2022-01-0308:23:10.165[canal-instance-scan-0]INFOc.a.otter.canal.instance.core.AbstractCanalInstance-stopCannalInstancefornull-example2022-01-0308:23:10.177[canal-instance-scan-0]INFOc.a。otter.canal.instance.core。AbstractCanalInstance-stopsuccessful....2022-01-0308:23:10.298[canal-instance-scan-0]INFOc.a.otter.canal.instance.spring.CanalInstanceWithSpring-startCannalInstancefor1-example2022-01-0308:23:10.298[运河实例扫描-0]WARNc.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert--->inittablefilter:^.*\..*$2022-01-0308:23:10.298[运河实例-scan-0]WARNc.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert--->inittableblackfilter:^mysql\.slave_.*$2022-01-0308:23:10.299[canal-instance-scan-0]INFOc.a.otter.canal.instance.core.AbstractCanalInstance-Startsuccessful....六、工程实验创建一个SpringBoot项目,spring-boot-bulking-canal引入相关pom依赖
