前置准备
canal读取Mysql的 binlog文件实现数据同步操作,所以一定要保证Mysql的binlog日志功能正常开启
开启极其简单且网上大把教程,这里跳过这一步。
查看binlog二进制文件信息,执行show master status
查看内容
字段名 | 解释 |
---|---|
File | 表示当前正在写入的二进制日志文件的名称。 |
Position | 表示当前正在写入的二进制日志文件的位置(偏移量)。它指示了下一个事件将从文件的哪个位置开始写入。 |
Binlog_Do_DB | 表示正在复制的数据库。如果设置了–replicate-do-db选项,则只复制指定的数据库。 |
Binlog_Ignore_DB | 表示被忽略复制的数据库。如果设置了–replicate-ignore-db选项,则不复制指定的数据库。 |
Executed_Gtid_Set | 表示当前已执行的全局事务标识(GTID)集合。GTID用于在主从复制中唯一标识每个事务。 |
Auto_Position | 表示是否启用了自动位置(auto-positioning)模式。如果启用了自动位置模式,则File和Position字段将被忽略。 |
下载安装Canal服务
软件 | 版本 |
---|---|
jdk | 1.8.0_231 |
mysql | 8.0.30 |
canal | 1.1.7 |
Canal 下载地址:github
服务说明:
服务 | 说明 |
---|---|
canal-admin | canal控制台,可以统一管理canal服务,选择下载(建议下载,配置简单,功能强大) |
canal-deployer | canal-server,相当于canal同步的一个节点,必须下载 |
canal-adaper | canal的适配器,在canal-deployer读取binlog后提供给其它服务做后续操作,canal-adaper提供了配置式将canal-deployer变更记录同步至其它平台(如ES)的服务,如果有需求使用canal同步数据至ES等平台,下载此服务 |
source-code | canal源码,使用canal-adaper的强烈建议下载,在本地部署调试,adaper目前还有很多坑需要本地部署调试才能发现错误 |
安装canal-admin
一、下载解压canal-admin
二、替换mysql connector(可选)
这里我使用的是mysql 8.0.30,我下载admin时lib里面的mysql-connector-j-8.0.33.jar为8.0.33,差距不大我这边没有替换,若过低版本需要去Mysql官网下载接近的驱动 驱动链接,替换lib文件夹中的文件
三、初始化脚本
在canal-admin conf文件夹中有一个canal_manager.sql,在数据库中执行该sql
执行完后得到以下表
此时可在canal_user中增加一条数据
password 是你想设置密码的MD5值
INSERT INTO canal_user
(id, username, password, name, roles, introduction, avatar, creation_date)
VALUES(1, 'admin', '6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', 'Canal Manager', 'admin', NULL, NULL, now());
四、修改application.yml 文件
打开application.yml (建议备份)
server:
-- 端口号
port: 8089
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
-- canal_manager.sql执行sql所在数据库信息
spring.datasource:
address: 数据库地址
database: 数据库名
username: root
password: 数据库密码
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true
hikari:
maximum-pool-size: 30
minimum-idle: 1
-- 系统管理员信息与canal_user对应 密码明文
canal:
adminUser: admin
adminPasswd: 123456
五、启动admin
打开bin文件夹,哪个平台就使用哪个平台启动文件(startup.xx)。启动成功后输入http://127.0.0.1:8089/,输入默认账号admin/密码即可访问
安装canal-deployer
一、下载解压canal-deployer
二、替换mysql connector(可选)
这里我使用的是mysql 8.0.30,我下载admin时lib里面的mysql-connector-j-8.0.33.jar为8.0.33,差距不大我这边没有替换,若过低版本需要去Mysql官网下载接近的驱动 驱动链接,替换lib文件夹中的文件
三、修改配置文件
在conf目录下,修改canal.properties(建议备份)
# 当前节点ip
canal.register.ip = 127.0.0.1
# canal admin 配置(admin相关配置,密码为admin密文)
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
# admin auto 自动注册
canal.admin.register.auto = true
canal.admin.register.cluster =
canal.admin.register.name =
四、启动服务
打开bin文件夹,哪个平台就使用哪个平台启动文件(startup.xx)。
五、admin管理端查看
启动deployer后一般就会在admin server页面中出现,如果没有出现则需要自己点击新建server 来创建
六、配置instance
我们启动deployer 还需要配置instance来告诉canal,具体监听Mysql数据库的哪些数据建库,表字段等等信息,这里就需要配置instance。
点击载入模板后出现示例模板,以下是一些配置说明,简单使用时大部分都可以不写
我们先配置数据库链接,这里是指当前instance监听数据库地址账号密码,这里不指定binlog,canal会自动去取最新的数据
然后配置数据库表
# mysql 数据解析关注的表,可使用正则表达式(如果有分表全部都在这里配置,不要一张表一个instance)
canal.instance.filter.regex=baseinfo\\.product_base.*|baseinfo\\.product_prc.*
# canal将会过滤那些不符合要求的table
canal.instance.filter.black.regex=
最后保存即可
七、测试
在刚刚instance作用数据库表中,新增/修改一些数据,然后我们就能从admin 的instance日志中查看到日志
如果有报错,对照instance日志查看具体错误(注意不是deployer日志)
八、注意事项
① 这里instance可使用正则匹配数据,所以若目标表分表则使用正则匹配,注意转义符
② 若在admin上删除instance,该instance数据不会立刻删除,建议将cannal-deployer\conf 中该instance数据一同删除。
安装canal-adpter(以同步ES 7为例)
一、下载解压canal-adpter
二、替换mysql connector(可选)
这里我使用的是mysql 8.0.30,我下载admin时lib里面的mysql-connector-j-8.0.33.jar为8.0.33,差距不大我这边没有替换,若过低版本需要去Mysql官网下载接近的驱动 驱动链接,替换lib文件夹中的文件
三、配置adpter配置
打开conf 中 application.yml,我们先只修改注释的地方
① adpter基本配置
canal.conf:
mode: tcp
flatMessage: true
zookeeperHosts:
batchSize: 500 # 表示每次从 Canal Server 获取的数据变更事件的批量大小。
syncBatchSize: 1000 # 表示每次同步到目标数据库的数据变更事件的批量大小。
retries: 1 # 失败后重试次数,-1为无限次,线上一定不能为-1
srcDataSources:
defaultDS: # 监听数据库
url: jdbc:mysql://ip:端口/数据库?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true
username: 账号
password: 密码
defaultDS2: # 监听数据库2(分库示例)
url: jdbc:mysql://ip:端口/数据库?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&autoReconnect=true
username: 账号
password: 密码
设置es同步
canalAdapters:
- instance: product_instance # 这里对应的是deployer配置的instance
groups:
- groupId: product_spu_group # 分组名
outerAdapters:
- name: es7 # 适配器名(会读取anal-adapter\conf中的同名文件)
key: product_spu_0 # 适配器key
hosts: http://127.0.0.1:9200 # es地址
properties:
mode: rest # or rest # 可指定transport模式或者rest模式,这里一定要写rest
security.auth: es账号:es密码 # only used for rest mode
cluster.name: dev-es # es cluster name
四、配置adpter-mapping
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的canal.conf.srcDataSources中的值
outerAdapterKey: product_spu_0 # 对应application.yml中es配置的key
destination: product_instance # cannal的instance或者MQ的topic
groupId: product_spu_group # 对应MQ模式下的groupId, 只会同步对应groupId的数据
esMapping:
_index: product_spu # es对应索引
_type: _doc
_id: _id
sql: "映射sql"
etlCondition: "where a = {} and b >= {}"
commitBatch: 3000
五、启动测试
打开bin文件夹,哪个平台就使用哪个平台启动文件(startup.xx)。
这里可以先手动同步一次数据 es7就是mapping所在文件夹名,后面接着文件名,data中的参数是mapping表中etlCondition 参数,多个以;隔开
curl --location 'http://127.0.0.1:8081/etl/es7/product_10.yml' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'params=2024-01-24;391849160212480'