一、canal介绍
canal译为水道,管道,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
canal的工作原理就是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Elastic Search等等。
canal的作用:
-
数据库镜像
-
数据库实时备份
-
索引构建和实时维护
-
业务cache(缓存)刷新
-
带业务逻辑的增量数据处理
说明:
server代表一个canal运行实例,对应于一个jvm
instance对应于一个数据队列instance模块:
eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)
eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)
eventStore (数据存储)
metaManager (增量订阅&消费信息管理器)
二、docker部署canal
1.部署canal-admin
#1.下载包
cd /opt
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/cana l.admin-1.1.5.tar.gz
mkdir canal-admin
tar -zxvf canal.admin-1.1.5.tar.gz -C canal-admin
#2.登录数据库,创建库---mysql安装略(开启binlog)
create database canal_manager;
grant all privileges on canal_manager.* to canal@'%' identified by 'canal'
flush privileges;
exit
mysql -ucanal -pcanal
use canal_manager;
source /Users/jing/Opt/canal-admin/conf/canal_manager.sql
#3.启动镜像canal-admin
docker pull canal/canal-admin:v1.1.5
docker run --network mynet -p 8089:8089 -v /Opt/canal-admin/conf:/home/admin/canal-admin/conf -v /opt/canal-admin/logs:/home/admin/canal-admin/logs --name canal-admin -e spring.datasource.addres s="mysqlip:3306/canal_manager?allowMultiQueries=true&useUnicod=true&charac terEncodin=utf-8&serverTimezone=CTT&allowPublicKeyRetrieval=true&useSSL= false" -e spring.datasource.username=canal -e spring.datasource.password =canal -e canal.adminPasswd=123456 -d canal/canal-admin:v1.1.5
注:canal_manager.sql 提供的脚本中,canal_user 表提供的默认⽤户名为: canal,密码为:6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9,也就是 SELECT PASSWORD('123456'); 的值
所以登陆 canal-admin 管理平台的⽤户名就是 admin/123456。
但当你登录进 canal-admin 容器中,会发现在 /home/admin/canal-admin/conf ⽬录存在⼀个 application.yml ⽂件
该⽂件中的配置项正是我们 docker 命令 -e 所指定的选项。
application.yml ⽂件中存在这样⼀个配置:
canal:
adminUser: admin
adminPasswd: admin
这⾥请把 adminPasswd 改成 123456,或者在启动容器时指定: -e canal.adminPasswd=123456 ,以保证和 canal_manager 的 canal_user 表下 admin 账号的密 码保持⼀致
浏览器访问:IP:8089 默认用户名密码:admin/123456
2.创建集群
#修改配置
# zk 的地址需要指定
canal.zkServers = zookeeper:2181
# tcp, kafka, rocketMQ, rabbitMQ
canal.serverMode = tcp
# 此配置需要修改成 default-instance
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
# 这个不需要指定,在admin上⼿动添加
canal.destinations
3.启动canal-server镜像
#1.启动canal-server
docker run --network mynet -p 11111:11111 -v /opt/canal-serve r/logs:/home/admin/canal-server/logs/canal --name canal-server01 -e cana l.admin.register.auto=true -e canal.admin.register.cluster=test -e cana l.admin.register.name=canal-server01 -e canal.admin.manager=canal-admin: 8089 -e canal.admin.port=11110 -e canal.admin.user=admin -e canal.admin. passwd=6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 -e canal.admin.register. cluster=test -d canal/canal-server:v1.1.5
canal.admin.passwd 的密码,可在 canal_manager 的 canal_user 表下找到,实际上就是: SELECT upper(sha1(unhex(sha1(‘123456’)))); 的值 我这⾥只起了⼀个 Canal Server,根据需要可以起多个 此时 Canal Admin 将⾃动出现刚刚启动的 Canal Server:
4.创建 instance
Canal Admin 界⾯上新建 Instance,选择载⼊模板,修改如下配置项:
# mysql集群配置中的serverId概念,需要保证和当前mysql集群中id唯⼀ (v1.1.x版本之后c anal会⾃动⽣成,不需要⼿⼯指定)
# canal.instance.mysql.slaveId=0
# mysql主库链接地址
canal.instance.master.address=mysql:3306
# mysql主库链接时起始的binlog⽂件
canal.instance.master.journal.name=
# mysql主库链接时起始的binlog偏移量
canal.instance.master.position=
# mysql主库链接时起始的binlog的时间戳
canal.instance.master.timestamp=
# mysql数据库帐号(此处的⽤户名和密码为 安装canal#mysql配置相关#创建canal⽤户 这⼀步 创建的⽤户名和密码)
canal.instance.dbUsername=canal
# mysql数据库密码
canal.instance.dbPassword=canal
# mysql 数据解析编码
canal.instance.connectionCharset = UTF-8
# mysql 数据解析关注的表,Perl正则表达式,即我们需要关注那些库和那些表的binlog数据, 也可以在canal client api中⼿动覆盖
canal.instance.filter.regex=.*\\..*
# table black regex
# mysql 数据解析表的⿊名单,表达式规则⻅⽩名单的规则
canal.instance.filter.black.regex=mysql\\.slave_.*
三、docker-compose部署canal
1.部署canal-admin
#1.安装docker-compose
sudo yum -y install epel-release
sudo yum -y update
sudo yum -y install python-pip
yum install -y docker-compose
docker-compose -v
#1.将docker部署的配置文件放到相应目录
mv /opt/canal-admin /data/ota/config/canal-admin
#2.在相应的目录下编写yml文件
cd /data/ota/yaml
vim canal-admin.yml
version: '3.1'
services:
ota-canal-admin:
image: canal/canal-admin:v1.1.5
container_name: ota-canal-admin
restart: always
environment:
spring.datasource.address: 172.17:3306
spring.datasource.database: canal_manager
spring.datasource.username: canal
spring.datasource.password: canal
driver-class-name: com.mysql.jdbc.Driver
volumes:
- ../logs/canal-admin:/home/admin/canal-admin/logs
- ../config/canal-admin/conf:/home/admin/canal-admin/conf
ports:
- "18089:8089"
networks:
- otanet
extra_hosts:
- "ota-mysql:172.17"
- "ota-canal-admin:172.17"
networks:
otanet:
external: true
#3.启动
docker-compose -p ota-canal-admin -f canal-admin.yml up -d
docker-compose -p ota-canal-admin -f canal-admin.yml down #停止
#4.浏览器访问IP:18089
2.部署canal-server
#1.导出手动部署的数据库配置(数据库要在canal-admin部署之前导入)
mysqldump -uroot -p --databases canal_manager >canal_manager.sql
将备份的sql导入数据库
#2.编写yml文件
cd /data/ota/yaml
vim canal-server01.yml
version: '3.1'
services:
ota-canal-server:
image: canal/canal-server:v1.1.5
container_name: ota-canal-server01
restart: always
environment:
PARAMS: "--canal.admin.register.auto=true --canal.admin.register.cluster=test --canal.admin.register.name=canal-server01 --canal.admin.manager=canal-admin:8089 --canal.admin.port=11110 --canal.admin.user=admin --canalk.admin.passwd=6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 "
ports:
- 11111:11111
volumes:
- ../logs/canal-server01:/home/admin/canal-server/logs/canal
networks:
- otanet
extra_hosts:
- "ota-mysql:172.17"
networks:
otanet:
external: true
#3.启动
docker-compose -p canal-server01 -f canal-server01.yml up -d
docker-compose -p canal-server01 -f canal-server01.yml down #停止