mysql-canal-rabbitmq 安装部署超详细教程
原文
1.1.开启MySQL的binlog日志
1.修改my.cnf或my.ini(windows),添加配置项:
#binlog日志存放路径 log-bin=D:\env\mysql-5.7.28-winx64\binlog #日志中记录每一行数据被修改的形式 binlog-format=ROW #当前机器的服务ID,如果为集群时不能重复 server_id=1
2.重启mysql服务后,查看配置变量是否生效:
mysql>showvariableslike'%log_bin%'; +---------------------------------+----------------------+ |Variable_name|Value| +---------------------------------+----------------------+ |log_bin|ON| |log_bin_basename|D:\env\mysql-5| |log_bin_index|D:\env\mysql-5.index| |log_bin_trust_function_creators|OFF| |log_bin_use_v1_row_events|OFF| |sql_log_bin|ON| +---------------------------------+----------------------+ 6rowsinset,1warning(0.00sec)
配置mysql数据库的canal用户
mysql-uroot-p登录mysql,创建并授权用户canal;
CREATEUSERcanalIDENTIFIEDBY'canal'; GRANTSELECT,REPLICATIONSLAVE,REPLICATIONCLIENTON*.*TO'canal'@'%'; FLUSHPRIVILEGES;
1.2.配置rabbitmqExchanges和Queues
1.新建Queue
2.新建Exchange
3.设置Queue里的Bindings,填写Exchange名称,以及路由Routingkey;
1.3.安装单机canal
1.3.1.下载安装
下载并解压缩;
sudowgethttps://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz sudotar-zxvfcanal.deployer-1.1.4.tar.gz
最新版本1.1.5的安装
sudowgethttps://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.deployer-1.1.5-SNAPSHOT.tar.gz sudotar-zxvfcanal.deployer-1.1.5-SNAPSHOT.tar.gz
1.3.2.配置文件
1.3.2.1.节点配置文件canal.properties
#tcpbindip,当前节点的IP地址 canal.ip=192.168.2.108 #registeriptozookeeper,注册到ZK的IP地址,如下图1. canal.register.ip=192.168.2.108 canal.zkServers=zk集群 #tcp,kafka,RocketMQ,最新版本1.1.5可以直接连接rabbitmq canal.serverMode=rabbitmq #destinations,当前server上部署的instance列表,对应各个实例文件夹(../conf/)名称 canal.destinations=example2 #设置mq服务器地址,此处为rabbitmq的服务器地址 #!!此处下载后默认的配置是有配置IP:端口的 #rabbitmq此处则不需要配置端口 canal.mq.servers=192.168.208.100 #一下几项均为1.1.5新版本新增支持rabbitmq的配置 canal.mq.vhost=/ canal.mq.exchange=example2-ex#指定rabbitmq上的exchange名称,"新建`Exchange`"步骤新建的名称 canal.mq.username=admin#连接rabbitmq的用户名 canal.mq.password=****#连接rabbitmq的密码 canal.mq.aliyunuid=
1.3.2.2.实例配置文件instance.properties
#positioninfo,数据库的连接信息 canal.instance.master.address=192.168.2.108:3306 #以下两个配置,需要在上面配置的address的数据库中执行`SHOWMASTERSTATUS`获取的`File`和`Position`两个字段值 canal.instance.master.journal.name=mysql-5.7 canal.instance.master.position=674996 #tablemetatsdbinfo,禁用tsdb记录tablemeta的时间序列版本 canal.instance.tsdb.enable=false #username/password,实例连接数据的用户名和密码 canal.instance.dbUsername=canal canal.instance.dbPassword=canal #tableregex,正则匹配需要监听的数据库表 canal.instance.filter.regex=ysb\\.useropcosttimes_prod #mqconfig,指定rabbitmq设置绑定的路由,详见"配置rabbitmq"步骤里的第三步配置的`Routingkey` canal.mq.topic=example2-routingkey
1.3.3.启动canal服务
Linux对应的启动脚本./bin/startup.sh,Windows对应的启动脚本./bin/startup.bat;以Windows为例:
λ.\startup.bat startcmd:java-Xms128m-Xmx512m-XX:PermSize=128m-Djava.awt.headless=true-Djava.net.preferIPv4Stack=true-Dapplication.codeset=UTF-8-Dfile.encoding=UTF-8-server-Xdebug-Xnoagent-Djava.compiler=NONE-Xrunjdwp:transport=dt_socket,address=9099,server=y,suspend=n-DappName=otter-canal-Dlogback.configurationFile="d:\env\green\canal-1.1.5\bin\\..\conf\logback.xml"-Dcanal.conf="d:\env\green\canal-1.1.5\bin\\..\conf\canal.properties"-classpath"d:\env\green\canal-1.1.5\bin\\..\conf\..\lib\*;d:\env\green\canal-1.1.5\bin\\..\conf"java-Xms128m-Xmx512m-XX:PermSize=128m-Djava.awt.headless=true-Djava.net.preferIPv4Stack=true-Dapplication.codeset=UTF-8-Dfile.encoding=UTF-8-server-Xdebug-Xnoagent-Djava.compiler=NONE-Xrunjdwp:transport=dt_socket,address=9099,server=y,suspend=n-DappName=otter-canal-Dlogback.configurationFile="d:\env\green\canal-1.1.5\bin\\..\conf\logback.xml"-Dcanal.conf="d:\env\green\canal-1.1.5\bin\\..\conf\canal.properties"-classpath"d:\env\green\canal-1.1.5\bin\\..\conf\..\lib\*;d:\env\green\canal-1.1.5\bin\\..\conf"com.alibaba.otter.canal.deployer.CanalLauncher JavaHotSpot(TM)ServerVMwarning:ignoringoptionPermSize=128m;supportwasremovedin8.0 Listeningfortransportdt_socketataddress:9099
最后手动修改数据库数据,或者等待其他的修改,再查看一下rabbitmq上的监控即可知道流程是否走通了.
1.4.安装集群canal
1.4.1.安装canal-admin
1.4.1.1.下载安装
下载并解压缩
sudowgethttps://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.admin-1.1.5-SNAPSHOT.tar.gz sudotar-zxvfcanal.admin-1.1.5-SNAPSHOT.tar.gz
1.4.1.2.配置文件
application.yml
server: port:8089 spring: jackson: date-format:yyyy-MM-ddHH:mm:ss time-zone:GMT+8 spring.datasource: address:192.168.2.108:3306 database:canal_manager username:canal password:canal driver-class-name:com.mysql.jdbc.Driver #数据库连接字符串末尾需添加`serverTimezone=UTC`,否则启动时会报时区异常; url:jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC hikari: maximum-pool-size:30 minimum-idle:1 canal: #配置canal-admin的管理员账号和密码 adminUser:admin adminPasswd:123456
canal_manager.sql
在管理canal-admin数据的数据库中执行该sql脚本,初始化一些表;
1.4.1.3.启动canal-admin服务
Linux对应的启动脚本./bin/startup.sh,Windows对应的启动脚本./bin/startup.bat;以Windows为例:
λ.\startup.bat startcmd:java-Xms128m-Xmx512m-Djava.awt.headless=true-Djava.net.preferIPv4Stack=true-Dapplication.codeset=UTF-8-Dfile.encoding=UTF-8-DappName=canal-admin-classpath"D:\env\green\canal-1.1.5-admin\bin\\..\conf\..\lib\*;D:\env\green\canal-1.1.5-admin\bin\\..\conf"com.alibaba.otter.canal.admin.CanalAdminApplication 2020-04-1320:01:39.495[main]INFOcom.alibaba.otter.canal.admin.CanalAdminApplication-StartingCanalAdminApplicationonMemento-PCwithPID50696(D:\env\green\canal-1.1.5-admin\lib\canal-admin-server-1.1.5-SNAPSHOT.jarstartedbyMementoinD:\env\green\canal-1.1.5-admin\bin) 2020-04-1320:01:39.527[main]INFOcom.alibaba.otter.canal.admin.CanalAdminApplication-Noactiveprofileset,fallingbacktodefaultprofiles:default 2020-04-1320:01:39.566[main]INFOo.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext-Refreshingorg.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@13a5bf6:startupdate[MonApr1320:01:39CST2020];rootofcontexthierarchy 2020-04-1320:01:41.149[main]INFOo.s.boot.web.embedded.tomcat.TomcatWebServer-Tomcatinitializedwithport(s):8089(http) 2020-04-1320:01:41.166[main]INFOorg.apache.coyote.http11.Http11NioProtocol-InitializingProtocolHandler["http-nio-8089"] 2020-04-1320:01:41.176[main]INFOorg.apache.catalina.core.StandardService-Startingservice[Tomcat] 2020-04-1320:01:41.177[main]INFOorg.apache.catalina.core.StandardEngine-StartingServletEngine:ApacheTomcat/8.5.29 ... 2020-04-1320:01:42.996[main]INFOorg.apache.coyote.http11.Http11NioProtocol-StartingProtocolHandler["http-nio-8089"] 2020-04-1320:01:43.007[main]INFOorg.apache.tomcat.util.net.NioSelectorPool-Usingasharedselectorforservletwrite/read 2020-04-1320:01:43.019[main]INFOo.s.boot.web.embedded.tomcat.TomcatWebServer-Tomcatstartedonport(s):8089(http)withcontextpath'' 2020-04-1320:01:43.024[main]INFOcom.alibaba.otter.canal.admin.CanalAdminApplication-StartedCanalAdminApplicationin3.919seconds(JVMrunningfor5.241)
1.4.1.4.注意事项
canal-admin连接数据库的账号,必须有建表,读写数据的权限,如果还是采用上文中创建的canal账号,需要另外扩展一下权限:
GRANTALLPRIVILEGESON*.*TO'canal'@'%';
1.4.2.添加单机canal-server节点
1.4.2.1.启动canal-server节点服务
单机canal-server照常启动,此时,canal-server默认加载的../conf/canal.properties里的配置信息,可以从../bin/startup.bat[startup.sh]脚本中获悉,获取从执行的脚本命令提示里获悉;
1.4.2.2.新建单机server
在canal-admin中新建一个单机server
该server会自动识别已启动的canal-server节点,但是此时由admin接管后,不会自动加载../conf/canal.properties的配置文件,点击最右侧的操作-配置查看,该server加载的是默认的配置信息
需要手动将1.3.2中配置好的../conf/canal.properties里的配置信息拷贝到该配置里进行覆盖!
1.4.2.3.新建实例instance
手动在canal-admin中新建一个instance,对应单机canal-server配置下的实例example2;同样,需要手动将./conf/<实例名称>/instance.properies配置文件手动拷贝到admin中
!!注意
在新建或启动instance实例时,先删除实例文件夹下的meta.dat文件,并更新canal.instance.master.journal.name=...,canal.instance.master.position=...两个配置项;
1.4.3.添加集群canal-server节点
1.4.3.1.新建集群
需要指定集群名称,以及配置集群绑定的zookeeper集群地址;
新建成功后,在最右侧的操作-主配置中配置集群的通用server配置信息
此处也可以将之前配置的../conf/canal.properties配置直接拷贝过来,稍微修改一下就可以用了
#canaladminconfig canal.admin.manager=192.168.2.108:8089 canal.instance.global.mode=manager
1.4.3.2.新建server
指定所属集群,为1.4.3.1中设定的集群名称;
如果先前已经启动了canal-server节点服务,则新建的server会自动识别为启动状态,否则为断开状态;
这里有一点需要十分注意的地方
细心的人可能会发现,除了canal.properties配置文件,还有一个canal_local.properties的配置文件,后者比前者的内容少了很多,因为这个文件就是用于搭建canal集群时,本地节点的配置文件,而前者配置文件里的其他信息都是交由canal-admin集中配置管理的;
在./bin/startup.bat[startup.sh]启动脚本里,默认是加载canal.properties配置文件,即以单机形式启动的服务;
windows在搭建canal集群时,需要手动修改startup.bat,蓝色标注处是加载%canal_conf%变量的配置文件路径,所以需要将红色框内的变量调整为:
@remsetcanal_conf=... setcanal_conf=%conf_dir%\canal_local.properties
使启动时加载canal_local.properties的配置文件
1.4.3.3.新建instance
此处配置也可以基于单机server中的实例1.4.2.3配置进行调整使用;
#2.positioninfo,指定mysql开始同步的binlog位置信息 canal.instance.master.address=192.168.0.25:63306 canal.instance.master.journal.name=mysql-bin.001349 canal.instance.master.position=198213313 #3.username/password,设置同步mysql的数据库用户名和密码 canal.instance.dbUsername=xxxx canal.instance.dbPassword=xxx #4.tableregex,正则匹配需要同步的数据表 canal.instance.filter.regex=xxxx #5.mqconfig,指定mysql上的路由绑定,见`1.2.3` canal.mq.topic=example2-routingkey
保存后即可在操作中启动该实例
后话
如果此处的instance无法启动,按一下几个步骤检查操作一下试试:
检查集群里的主配置里的canal.destinations是否包含新建的实例instance名称;检查canal-server节点是否加载的canal_local.properties配置文件;删除实例文件夹下的.db,.bat文件,更新实例配置文件中的canal.instance.master.position的binglog位置后,启动instance;
1.5.canal配置说明
1.5.1.canal.properties
- canal.ip,该节点IP
- canal.register.ip,注册到zookeeper上的IP
- canal.zkServers,zk集群
- 是否启用tsdb,开启tablemeta的时间序列版本记录功能
- //5.canal.serverMode,设置为rabbitmq,默认为tcp
canal.instance.tsdb.enable=true canal.instance.tsdb.dir=${canal.file.data.dir:../conf}/${canal.instance.destination:} canal.instance.tsdb.url=jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL; canal.instance.tsdb.dbUsername=canal canal.instance.tsdb.dbPassword=canal
5.canal.destinations,当前集群上部署的instance列表
6.canal.mq.servers,设置Rabbitmq集群地址,!!此处不可以加上端口
1.5.2.instance.properties
- canal.instance.master.address,master数据库地址
- canal.instance.master.journal.name,在数据库中执行showmasterstatus的File值
- canal.instance.master.position,在数据库中执行showmasterstatus的Position值
- canal.instance.tsdb.enable=false,禁用tsdb
- canal.instance.dbUsername,实例数据库用户名
- canal.instance.dbPassword,实例数据库密码
- canal.instance.filter.regex,匹配需要同步的表
- canal.mq.topic,canal注册mq的topic名称
1.5.3.properties配置文件
properties配置分为两部分
canal.properties(系统根配置文件)
instance.properties(instance级别的配置文件,每个实例一份)
1.canal.properties
canal.destinations#当前server上部署的instance列表 canal.conf.dir#conf目录所在路径 canal.auto.scan#开启instance自动扫描 #如果配置为true,canal.conf.dir目录下的instance配置变化会自动触发 #1.instance目录新增:触发instance配置载入,lazy为true时则自动启动; #2.instance目录删除:卸载对应instance配置,如已启动则进行关闭; #3.instance.properties文件变化:reloadinstance配置,如已启动则自动进行重启操作; canal.auto.scan.interval#instance自动扫描间隔时间,单位s canal.instance.global.mode#全局配置加载方式 canal.instance.global.lazy#全局lazy模式 canal.instance.global.manager.address#全局的manager配置方式的链接信息 canal.instance.global.spring.xml#全局的spring配置方式的组件文件 canal.instance.example.mode canal.instance.example.lazy canal.instance.example.spring.xml #instance级别的配置定义,如有配置,会自动覆盖全局配置定义模式 canal.instance.tsdb.enable#是否开启tablemeta的时间序列版本记录功能 canal.instance.tsdb.dir#时间序列版本的本地存储路径,默认为instance目录 canal.instance.tsdb.url#时间序列版本的数据库连接地址,默认为本地嵌入式数据库 canal.instance.tsdb.dbUsername#时间序列版本的数据库连接账号 canal.instance.tsdb.dbPassword#时间序列版本的数据库连接密码
2.instance.properties
canal.id#每个canalserver实例的唯一标识 canal.ip#canalserver绑定的本地IP信息,如果不配置,默认选择一个本机IP进行启动服务 canal.port#canalserver提供socket服务的端口 canal.zkServers#canalserver连接zookeeper集群的连接地址,例如:10.20.144.22:2181,10.20.144.23:2181 canal.zookeeper.flush.period#canal持久化数据到zookeeper上的更新频率,单位ms canal.instance.memory.batch.mode#canal内存store中数据缓存模式 #1.ITEMSIZE:根据buffer.size进行限制,只限制记录的数量 #2.MEMSIZE:根据buffer.size*buffer.memunit的大小,限制缓存记录的大小; canal.instance.memory.buffer.size#canal内存store中可缓存buffer记录数,需要为2的指数 canal.instance.memory.buffer.memunit#内存记录的单位大小,默认为1KB,和buffer.size组合决定最终的内存使用大小 canal.instance.transactions.size#最大事务完整解析的长度支持,超过该长度后,一个事务可能会被拆分成多次提交到canalstore中,无法保证事务的完整可见性 canal.instance.fallbackIntervalInSeconds#canal发生mysql切换时,在新的mysql库上查找binlog时需要往前查找的时间,单位s #说明:mysql主备库可能存在解析延迟或者时钟不一致,需要回退一段时间,保证数据不丢 canal.instance.detecting.enable#是否开启心跳检查 canal.instance.detecting.sql#心跳检查sql,insertintoretl.xdualvalues(1,now())onduplicatekeyupdatex=now() canal.instance.detecting.interval.time#心跳检查频率,单位s canal.instance.detecting.retry.threshold#心跳检查失败重试次数 canal.instance.detecting.heatbeatHaEnable#心跳检查失败后,是否开启mysql自动切换 #说明:比如心跳检查失败超过阈值后,如果该配置为true,canal会自动连到mysql备库获取binlog数据 canal.instance.network.receiveBufferSize#网络连接参数,SocketOptions.SO_RCVBUF canal.instance.network.sendBufferSize#网络连接参数,SocketOptions.SO_SNDBUF canal.instance.network.soTimeout#网络连接参数,SocketOptions.SO_TIMEOUT
1.5.4.canal.mq.dynamicTopic
参考:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart?tdsourcetag=s_pctim_aiomsg
1.6.问题处理
1.windows下执行startup.bat启动canal时,出现如下异常
Failedtoinstantiate[ch.qos.logback.classic.LoggerContext]
Reportedexception:
ch.qos.logback.core.LogbackException:Unexpectedfilenameextensionoffile[file:/D:/env/green/canal/conf/].Shouldbeeither.groovyor.xml
atch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:79)
atch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:152)
atorg.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:85)
atorg.slf4j.impl.StaticLoggerBinder.(StaticLoggerBinder.java:55)
atorg.slf4j.LoggerFactory.bind(LoggerFactory.java:141)
atorg.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
atorg.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
atorg.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
atorg.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
atcom.alibaba.otter.canal.deployer.CanalLauncher.(CanalLauncher.java:29)
解决方法:
将startup.bat里的一下这行代码注释打开
@remsetlogback_configurationFile=%conf_dir%\logback.xml
注,新版1.1.5不存在该问题,1.1.5这个文件中的这一行是没有注释掉的.
1.1.5新版本canal-admin启动时出现如下异常:
2020-04-1018:55:40.406[main]ERRORcom.zaxxer.hikari.pool.HikariPool-HikariPool-1-Exceptionduringpoolinitialization.
java.sql.SQLException:Theservertimezonevalue'�й���ʱ��'isunrecognizedorrepresentsmorethanonetimezone.YoumustconfigureeithertheserverorJDBCdriver(viatheserverTimezoneconfigurationproperty)touseamorespecifctimezonevalueifyouwanttoutilizetimezonesupport.
解决方法
spring.datasource.url配置的mysql连接地址后面加上参数&serverTimezone=UTC
Instance日志里出现异常errno=1236,sqlstate=HY000errmsg=logevententryexceededmax_allowed_packet;
2020-04-1313:06:09.507[destination=example3,address=/192.168.2.108:3306,EventParser]ERRORcom.alibaba.otter.canal.common.alarm.LogAlarmHandler-destination:example3[java.io.IOException:Receivederrorpacket:errno=1236,sqlstate=HY000errmsg=logevententryexceededmax_allowed_packet;Increasemax_allowed_packetonmaster;thefirstevent'mysql-5.7'at671745,thelasteventreadfrom'D:\env\mysql-5.7'at673181,thelastbytereadfrom'D:\env\mysql-5.7'at673200.
atcom.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher.fetch(DirectLogFetcher.java:102)
atcom.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:235)
atcom.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:265)
atjava.lang.Thread.run(UnknownSource)
]
解决方法
删除canal/conf下对应实例里的meta.dat文件,让canal-admin自动再生成即可;
1.7.参考资料
canal(基于mysql数据库binlog的增量订阅和消费)
CanalAdmin搭建Canal集群以及体验
canal整合RabbitMQ
canal系列—配置文件介绍
到此这篇关于mysql-canal-rabbitmq安装部署超详细教程的文章就介绍到这了,更多相关mysql-canal-rabbitmq安装部署内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。