zoukankan      html  css  js  c++  java
  • 数据同步canal服务端介绍

    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、配置示例

     1 #################################################
     2 #########       common argument     ############# 
     3 #################################################
     4 canal.id= 1
     5 canal.ip=
     6 canal.port= 11111
     7 canal.zkServers=
     8 # flush data to zk
     9 canal.zookeeper.flush.period = 1000
    10 # flush meta cursor/parse position to file
    11 canal.file.data.dir = ${canal.conf.dir}
    12 canal.file.flush.period = 1000
    13 ## memory store RingBuffer size, should be Math.pow(2,n)
    14 canal.instance.memory.buffer.size = 16384
    15 ## memory store RingBuffer used memory unit size , default 1kb
    16 canal.instance.memory.buffer.memunit = 1024 
    17 ## meory store gets mode used MEMSIZE or ITEMSIZE
    18 canal.instance.memory.batch.mode = MEMSIZE
    19 
    20 ## detecing config
    21 canal.instance.detecting.enable = false
    22 #canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
    23 canal.instance.detecting.sql = select 1
    24 canal.instance.detecting.interval.time = 3
    25 canal.instance.detecting.retry.threshold = 3
    26 canal.instance.detecting.heartbeatHaEnable = false
    27 
    28 # support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
    29 canal.instance.transaction.size =  1024
    30 # mysql fallback connected to new master should fallback times
    31 canal.instance.fallbackIntervalInSeconds = 60
    32 
    33 # network config
    34 canal.instance.network.receiveBufferSize = 16384
    35 canal.instance.network.sendBufferSize = 16384
    36 canal.instance.network.soTimeout = 30
    37 
    38 # binlog filter config
    39 canal.instance.filter.query.dcl = false
    40 canal.instance.filter.query.dml = false
    41 canal.instance.filter.query.ddl = false
    42 canal.instance.filter.table.error = false
    43 canal.instance.filter.rows = false
    44 
    45 # binlog format/image check
    46 canal.instance.binlog.format = ROW,STATEMENT,MIXED 
    47 canal.instance.binlog.image = FULL,MINIMAL,NOBLOB
    48 
    49 # binlog ddl isolation
    50 canal.instance.get.ddl.isolation = false
    51 
    52 #################################################
    53 #########       destinations        ############# 
    54 #################################################
    55 canal.destinations= example
    56 # conf root dir
    57 canal.conf.dir = ../conf
    58 # auto scan instance dir add/remove and start/stop instance
    59 canal.auto.scan = true
    60 canal.auto.scan.interval = 5
    61 
    62 canal.instance.global.mode = spring 
    63 canal.instance.global.lazy = false
    64 #canal.instance.global.manager.address = 127.0.0.1:1099
    65 #canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
    66 canal.instance.global.spring.xml = classpath:spring/file-instance.xml
    67 #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

     1 #################################################
     2 ## mysql serverId
     3 canal.instance.mysql.slaveId = 1024
     4 
     5 # position info
     6 canal.instance.master.address = ip:3306
     7 canal.instance.master.journal.name =
     8 canal.instance.master.position =
     9 canal.instance.master.timestamp =
    10 
    11 #canal.instance.standby.address = 
    12 #canal.instance.standby.journal.name =
    13 #canal.instance.standby.position = 
    14 #canal.instance.standby.timestamp = 
    15 
    16 # username/password
    17 canal.instance.dbUsername = canal
    18 canal.instance.dbPassword = canal123
    19 canal.instance.defaultDatabaseName = dbname
    20 canal.instance.connectionCharset = UTF-8
    21 
    22 # table regex
    23 canal.instance.filter.regex = .*\..*
    24 # table black regex
    25 canal.instance.filter.black.regex =
    26 
    27 #################################################

    对于同一台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即可.

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

  • 相关阅读:
    CSS常用记录
    CSS字体图标使用方式
    CSS之多个div一行排列
    Mysql MVCC原理和幻读解决
    第8章 管理还原数据
    第20章 数据的移动
    oracle恢复删除的数据
    第11章 索引的管理与维护
    第10章 管理表
    第19章 归档模式下的数据库恢复
  • 原文地址:https://www.cnblogs.com/wangzhisdu/p/8119203.html
Copyright © 2011-2022 走看看