1、下载安装包

canal&github的地址,最权威的学习canal相关知识的地方

https://github.com/alibaba/canal

在下面的wiki列表中找到AdminGuide连接,进入

https://github.com/alibaba/canal/wiki/AdminGuide

环境要求:

① windows/linux均可

② jdk1.6.25以上

③ mysql 5.7.13/5.6.10及以下的版本

④ 开启mysql的binlog写入功能,binlog模式为row,server_id不能和canal的slaveId重复

安装包下载地址

https://github.com/alibaba/canal/releases

选择deployer包下载

2、配置解析

canal配置分为两部分:

  ① canal.properties (系统根配置文件)

  ② instance.properties (instance级别的配置文件,每个instance一份),每个数据库对应1个instance,如果需要同步多个数据库,只需要在conf下创建多个destination目录,创建多个instance.properties,并在每个instance.properties中配置需要的数据库即可。

tar -zxvf canal.deployer-1.0.25.tar.gz

解压后的目录为

启动脚本在bin目录下,但此时启动还为时过早,我们并没有设置同步哪个mysql的哪个库的哪些表,所以先关注一下canal的配置文件

canal.properties是服务端的配置入口,下面为该配置文件需要重点了解的配置项

参数名字 参数说明 默认值
canal.destinations 当前server上部署的instance列表,默认不配死,通过动态扫描获取
canal.conf.dir 配置文件的目录 ../conf
canal.auto.scan 开启instance自动扫描,扫描canal.conf.dir目录下的instance true
canal.port 服务端端口,客户端连接的时候要用到 11111
canal.zkServers 配置canal集群的时候用到该配置,用来连接zookeeper集群
canal.file.data.dir canal持久化数据到file上的目录 ../conf (默认和instance.properties为同一目录,方便运维和备份)
canal.instance.global.spring.xml 全局的spring配置方式的组件文件,选择了基于file持久化模式,用于非HA场景下 classpath:spring/file-instance.xml

canal.properties都是针对canal本身的一些配置,还没解决我们上面的问题。example是系统自带的例子,mysql相关的配置我们可以从此处获取。

进入example,查看instance.properties,其中的关键配置如下

参数名字 参数说明 默认值
canal.instance.mysql.slaveId mysql集群配置中的serverId概念,需要保证和当前mysql集群中id唯一,前面有介绍,不能与mysql的server_id重复 1234
canal.instance.master.address mysql主库链接地址 127.0.0.1:3306
canal.instance.master.journal.name mysql主库链接时起始的binlog文件
canal.instance.master.position mysql主库链接时起始的binlog偏移量,需要与上一个配置组合使用
canal.instance.master.timestamp mysql主库链接时起始的binlog的时间戳
canal.instance.dbUsername mysql数据库帐号 canal
canal.instance.dbPassword mysql数据库密码 canal
canal.instance.defaultDatabaseName mysql链接时默认schema,数据库名,每个instance对应一个数据库
canal.instance.filter.regex mysql 数据解析关注的表,Perl正则表达式,默认为数据库下所有表 .*\\..*

关于配置的几点说明,后面也会陆续涉及到:

1、mysql链接时的起始位置

  ① canal.instance.master.journal.name + canal.instance.master.position : 精确指定一个binlog位点,进行启动

  ② canal.instance.master.timestamp : 指定一个时间戳,canal会自动遍历mysql binlog,找到对应时间戳的binlog位点后,进行启动

  ③ 不指定任何信息:默认从当前数据库的位点,进行启动。(show master status)

  

2、mysql解析关注表是Perl正则表达式,所有表的两种表达方式:.*   or  .*\\..*

3、在新版本canal的instance.properties中有standby相关的配置,对应于master,主要用于解决mysql多节点解析自动切换,这种针对高可用mysql集群的同步在后面会讲到

如此添加好mysql的配置后,就可以启动了。

3、配置示例

 #################################################
######### common argument #############
#################################################
canal.id= 1
canal.ip=
canal.port= 11111
canal.zkServers=
# flush data to zk
canal.zookeeper.flush.period = 1000
# flush meta cursor/parse position to file
canal.file.data.dir = ${canal.conf.dir}
canal.file.flush.period = 1000
## memory store RingBuffer size, should be Math.pow(2,n)
canal.instance.memory.buffer.size = 16384
## memory store RingBuffer used memory unit size , default 1kb
canal.instance.memory.buffer.memunit = 1024
## meory store gets mode used MEMSIZE or ITEMSIZE
canal.instance.memory.batch.mode = MEMSIZE ## detecing config
canal.instance.detecting.enable = false
#canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
canal.instance.detecting.sql = select 1
canal.instance.detecting.interval.time = 3
canal.instance.detecting.retry.threshold = 3
canal.instance.detecting.heartbeatHaEnable = false # support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
canal.instance.transaction.size = 1024
# mysql fallback connected to new master should fallback times
canal.instance.fallbackIntervalInSeconds = 60 # network config
canal.instance.network.receiveBufferSize = 16384
canal.instance.network.sendBufferSize = 16384
canal.instance.network.soTimeout = 30 # binlog filter config
canal.instance.filter.query.dcl = false
canal.instance.filter.query.dml = false
canal.instance.filter.query.ddl = false
canal.instance.filter.table.error = false
canal.instance.filter.rows = false # binlog format/image check
canal.instance.binlog.format = ROW,STATEMENT,MIXED
canal.instance.binlog.image = FULL,MINIMAL,NOBLOB # binlog ddl isolation
canal.instance.get.ddl.isolation = false #################################################
######### destinations #############
#################################################
canal.destinations= example
# conf root dir
canal.conf.dir = ../conf
# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5 canal.instance.global.mode = spring
canal.instance.global.lazy = false
#canal.instance.global.manager.address = 127.0.0.1:1099
#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/file-instance.xml
#canal.instance.global.spring.xml = classpath:spring/default-instance.xml

对于想同步的数据库可以配在第55行,写死的方式,多个数据库用逗号隔开(这种方式不够灵活);也可以在59行配置自动扫描conf目录下的instance,我这里采用了第二种

如上图,可以看出我的conf目录下有5个文件夹(spring不是),表示我同步了5个数据库,而destination就是这些文件夹的名称。为什么要说这句话呢,因为客户端连接服务端的时候需要用到destination属性,而网上对于destination的介绍比较少,有些开发人员对这个概念比较模糊,其实很简单,就是代表同步的目的地(destination),就是第55行canal.destinations的配置内容。而canal要求根据canal.destinations配置项的值,在conf目录下建立同名的文件夹。

每个文件夹下都有一个instance.properties

 #################################################
## mysql serverId
canal.instance.mysql.slaveId = 1024 # position info
canal.instance.master.address = ip:3306
canal.instance.master.journal.name =
canal.instance.master.position =
canal.instance.master.timestamp = #canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp = # username/password
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal123
canal.instance.defaultDatabaseName = dbname
canal.instance.connectionCharset = UTF-8 # table regex
canal.instance.filter.regex = .*\\..*
# table black regex
canal.instance.filter.black.regex = #################################################

对于同一台mysqk服务器上的不同数据库,它们的区别只在于第19行。

按照如上配置即可启动了,只需在bin目录下执行startup.sh即可。启动情况可以到log下查看

到此,canal服务端的简单使用基本完成。但是,对于一个喜欢专研的程序猿来说,怎么能浅尝辄止呢,

4、canal如何维护一份增量订阅&消费的关系信息

① 解析点位,parse模块会记录,上一次解析binlog到了什么位置,对应组件为:CanalLogPositionManager

② 消费点位,canal server在接收了客户端的ack后,就会记录客户端提交的最后位点,对应的组件为:CanalMetaManager

对应的两个位点组件,目前都有几种实现:

① memory (memory-instance.xml中使用)

② zookeeper

③ mixed

④ file (file-instance.xml中使用,集合了file+memory模式,先写内存,定时刷新数据到本地file上)

⑤ period (default-instance.xml中使用,集合了zookeeper+memory模式,先写内存,定时刷新数据到zookeeper上)

我们是有的是第四种,file模式。

4.1 memory-instance.xml介绍:

所有的组件(parser , sink , store)都选择了内存版模式,记录位点的都选择了memory模式,重启后又会回到初始位点进行解析

特点:速度最快,依赖最少(不需要zookeeper)

场景:一般应用在quickstart,或者是出现问题后,进行数据分析的场景,不应该将其应用于生产环境

4.2 file-instance.xml介绍:

所有的组件(parser , sink , store)都选择了基于file持久化模式,注意,不支持HA机制.

特点:支持单机持久化

场景:生产环境,无HA需求,简单可用.

解析点位和消费点位这些元数据会定时从内容刷新到本地文件,文件为meta.dat,与instance.properties在同一目录,该目录是在canal.properties中配置的。数据结构如下:

{"clientDatas":[{"clientIdentity":{"clientId":1001,"destination":"gov","filter":""},"cursor":{"identity":{"slaveId":-1,"sourceAddress":{"address":"10.10.49.11","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.000031","position":49097461,"serverId":1,"timestamp":1514357874000}}}],"destination":"gov"}

事实证明,单实例的模式已经足够好用,即使服务端异常停止,我们仍然能从指定位置或指定时间重新解析binlog,不会造成数据丢失。无需一味追求集群、HA、高可用,简单适合自己才是王道。

4.3 default-instance.xml介绍:

所有的组件(parser , sink , store)都选择了持久化模式,目前持久化的方式主要是写入zookeeper,保证数据集群共享.

特点:支持HA

场景:生产环境,集群化部署.

4.4 group-instance.xml介绍:

主要针对需要进行多库合并时,可以将多个物理instance合并为一个逻辑instance,提供客户端访问。

场景:分库业务。 比如产品数据拆分了4个库,每个库会有一个instance,如果不用group,业务上要消费数据时,需要启动4个客户端,分别链接4个instance实例。使用group后,可以在canal server上合并为一个逻辑instance,只需要启动1个客户端,链接这个逻辑instance即可.

后面两种方式都是针对于比较复杂的应用场景,本人尚未测试验证过。

数据同步canal服务端介绍的更多相关文章

  1. 数据同步canal服务端HA配置

    canal服务端HA模式,本人并未使用过,为保证文章的完整性,从以下地址摘抄该部分内容,待以后验证及使用 https://github.com/alibaba/canal/wiki/AdminGuid ...

  2. 数据同步canal服务端配置mysql多主

    canal服务端HA模式,本人并未使用过,为保证文章的完整性,从以下地址摘抄该部分内容,待以后验证及使用 https://github.com/alibaba/canal/wiki/AdminGuid ...

  3. js获取cookie数据并发送给服务端

    js获取cookie数据并发送给服务端 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  4. 数据同步canal客户端

    1.增量订阅.消费设计 get/ack/rollback协议介绍: ① Message getWithoutAck(int batchSize),允许指定batchSize,一次可以获取多条,每次返回 ...

  5. BodeAbp服务端介绍

    BodeAbp服务端只提供api,绝大部分api通过abp的动态WebApi机制提供,原理可以参考这篇文章:http://www.cnblogs.com/1zhk/p/5418694.html 与业务 ...

  6. 大数据框架hadoop服务角色介绍

    翻了一下最近一段时间写的分享,DKHadoop发行版本下载.安装.运行环境部署等相关内容几乎都已经写了一遍了.虽然有的地方可能写的不是很详细,个人理解水平有限还请见谅吧!我记得在写DKHadoop运行 ...

  7. Rsync+inotify 实时数据同步 inotify master 端的配置

    强大的,细致的,异步的文件系统事件监控机制.Linux 内科从 2.6.13 起支持 inotify Inotify 实现的几款软件:Inotify,sersync,lsyncd ※Inotify 实 ...

  8. mongo大数据量更新服务端超时解决: Cursor not found, cursor id: 82792803897

    mongodb pymongo.errors.CursorNotFound: Cursor not found, cursor id: 82792803897 默认 mongo server维护连接的 ...

  9. canal数据同步目录

    我们公司对于数据同步有以下需求 1.多个mysql库中有一些基础表需要数据统一,mysql跨库同步 2.mysql热数据加载到redis 3.全文检索需要mysql同步到es 4.数据变更是附属的其它 ...

随机推荐

  1. 在 CentOS7 上安装 RabbitMQ 消息队列中间件

    RabbitMQ 是流行的开源消息队列系统,是 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)的标准实现,用 erlang 语言开发.RabbitMQ ...

  2. Java - HashMap 多线程安全解析

    HashMap多线程并发问题分析 多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问 ...

  3. java设计模式-----24、访问者模式

    概念: Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作. 访问者模式的应用示例 比如有一个公园,有一到多个不同 ...

  4. HDU3829(KB10-J 二分图最大独立集)

    Cat VS Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total ...

  5. RBAC 介绍 (权限)

    RBAC是什么? RBAC是基于角色的访问控制(Role-Based Access Control )在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权 ...

  6. (二)收集的MongoDB命令集合

    一:针对整个数据库的 1."show dbs" 命令可以显示所有数据的列表. 2. "db" 命令可以显示当前数据库对象或集合. 3."use&quo ...

  7. JavaScript:作用域与作用域链

    1.什么是作用域(scope)? 简单来讲,作用域(scope)就是变量访问规则的有效范围. 作用域外,无法引用作用域内的变量: 离开作用域后,作用域的变量的内存空间会被清除,比如执行完函数或者关闭浏 ...

  8. 安装nvm管理不同的node版本

    在工作或者学习中,偶尔会遇到需要切换不同node版本的需求,幸好有神器nvm可以帮我们解决问题.下面我们就来讲解如何在window系统上安装nvm!

  9. css3的calc()属性

    1.calc()是css3的一个新增的功能,用来指定元素的长度,你可以使用calc()给元素的border.margin.pading.font-size和width等属性动态的设置值. 2.calc ...

  10. 更多内容 - 请关注我的 CSDN 博客

    欢迎关注我的 CSDN 博客 因为粉丝多数是在 CSDN 上,所以更多内容放在了 我的 CSDN 博客: [点击跳转] 地址:https://icode.blog.csdn.net