简介
简单模拟下MySQL到OB数据同步的过程,包括schema同步及单个表同步过程,仅记录操作过程。
环境信息
OB集群
3台 centos ( docker 环境)部署的 OB 集群,端口 2882:2881 ,服务器IP分别为 172.20.0.10、172.20.0.11、172.20.0.12。
# 在集群上创建一个租户 obcp_t1 ,过程略。 # 建立用户 obcanal create user obcanal@'%' identified by 'obcanal' ; GRANT ALL PRIVILEGES ON *.* TO 'obcanal' ; create database mydb1 ; # 用户测试整库同步 create database mydb2 ; # 用于测试单表同步
MySQL服务器
1台 MySQL5.7 , IP 地址为 172.20.0.32 ,端口 3306 。
docker run --name mysql57 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=password -e TZ=Asia/Shanghai --restart=always -v /data/dockerdata/mysql1/conf:/etc/mysql -v /data/dockerdata/mysql1/datadir:/var/lib/mysql --network=adnc_net --ip 172.20.0.32 -d mysql:5.7
配置MySQL
# 在/data/dockerdata/mysql1/conf/my.cnf文件中加入内容(3个参数为必改项) [mysqld] log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定义 skip_ssl # 禁用ssl ,否则jdbc无法连接
创建 canal连接 MySQL 账户
# 授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant 。 CREATE USER canal@'%' IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
创建测试库
create database mydb1;
canal、adapter服务器
1台 centos ( docker 环境),IP地址为 172.20.0.31 ,用于部署 canal 、canal-adapter
sudo yum -y install java-1.8.0-openjdk.x86_64
附docker快速构建服务器说明
docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 adnc_net # 自定义网络 docker run --privileged -itd -p 2230:22 --name c10 --network adnc_net --ip 172.20.0.10 centos:7 /usr/sbin/init # 运行容器并指定IP docker exec -it c10 bash # 进入容器 # 更新centos并安装必要的软件包 yum check-update -y && yum update -y yum install initscripts screen wget -y && yum install passwd -y && yum install net-tools -y && yum install -y unzip zip && yum -y install wget tree && yum install -y sudo net-tools yum install -y openssh-server openssh-clients systemctl start sshd useradd admin # 添加admin用户 passwd admin # 修改密码
安装 canal
从 https://github.com/alibaba/canal/releases 下载的包如下:canal.deployer-1.1.5.tar.gz、canal.adapter-1.1.5.tar.gz
登录 canal、adapter 服务器(172.20.0.31),并将上面的两个软件上传到该服务器。
# 以下命令均适用root进行。 mkdir ~/canal tar zxvf canal.deployer-1.1.5.tar.gz -C ~/canal
修改配置
# 修改/root/canal/conf/canal.properties文件,(为简洁,去除部分内容): more /root/canal/conf/canal.properties # tcp, kafka, rocketMQ, rabbitMQ canal.serverMode = tcp # 指定该值为tcp ,默认值即为tcp。 # 修改/root/canal/conf/example/instance.properties文件,修改后的内容如下(为简洁,去除部分内容): more /root/canal/conf/example/instance.properties # position info canal.instance.master.address=172.20.0.32:3306 ## 指定MySQL服务器信息 ....... # username/password canal.instance.dbUsername=canal ## 指定前面部分创建的MySQL账户名 canal.instance.dbPassword=canal ## 指定前面部分创建的MySQ账户密码
启动
/root/canal/bin/startup.sh # 如有如下报错,参考前面部分安装java环境。 bin/startup.sh: line 30: which: command not found # 这里缺少 which命令,可以 yum install -y which 安装 Cannot find a Java JDK. Please set either set JAVA or put java (>=1.5) in your PATH.
查看日志
查看 server 日志
tail -500f /root/canal/logs/canal/canal.log</pre> # 有 [main] INFO com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ...... 表示启动成功。
查看 instance 的日志
tail -500f /root/canal/logs/example/example.log # 确保没有ERROR,并有如下信息显示(源端MySQL binlog信息) # 2021-12-15 17:25:39.346 [destination = example , address = /172.20.0.32:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=replicas-mysql-bin.000005,position=1578,serverId=100,gtid=,timestamp=1639556730000] cost : 1332ms , the next step is binlog dump
关闭命令
sh bin/stop.sh
部署 RDB 适配器
RDB adapter 用于适配 MySQL 到任意关系型数据库(需支持 jdbc )的数据同步及导入 。
安装canal-adapter
# 以下命令均适用root进行。 mkdir ~/canal-adapter tar zvxf canal.adapter-1.1.5.tar.gz -C ~/canal-adapter/
修改配置
# more ~/canal-adapter/conf/application.yml srcDataSources:defaultDS:url: jdbc:mysql://172.20.0.32:3306/mydb1?useUnicode=trueusername: canalpassword: canalcanalAdapters:- instance: example # canal instance Name or mq topic namegroups:- groupId: g1outerAdapters:- name: logger- name: rdbkey: mysql1properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://172.20.0.10:2881/mydb1jdbc.username: obcanal@obcp_t1jdbc.password: obcanal- name: rdbkey: mysql2properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://172.20.0.10:2881/mydb2jdbc.username: obcanal@obcp_t1jdbc.password: obcanal
增加 RDB 文件
# 整库同步 more ~/canal-adapter/conf/rdb/mydb1.yml ## Mirror schema synchronize config dataSourceKey: defaultDS destination: example groupId: g1 outerAdapterKey: mysql1 concurrent: true dbMapping:mirrorDb: truedatabase: mydb1 # 库名和源库一样 # 单表同步 more ~/canal-adapter/conf/rdb/mydb2.yml dataSourceKey: defaultDS destination: example groupId: g1 outerAdapterKey: mysql2 concurrent: true dbMapping:database: mydb1 # 源库名table: t1 # 源表名targetTable: t2 # 目标端表名,库名在jdbc配置里。targetPk:id: idmapAll: truecommitBatch: 3000
启动
~/canal-adapter/bin/startup.sh
查看日志
tail -500f ~/canal-adapter/logs/adapter/adapter.log # 确保无错误发生
测试
过程省略
问题记录
ssl 禁用
第一种方法:在源端jdbc连接串,增加&useSSL=false
第二种方法:在MySQL配置文件中加入:skip_ssl,重启MySQL生效
DML不生效,DDL生效
MySQL 的 binlog 格式设置为 ROW 。
单表同步
需要在目标端先建表,整个库同步不需要单独建表。
表要主键或唯一键
要同步的表需要有主键或唯一键