问题引出
客户需要将华为云rds for MySQL和天翼云rds for MySQL做一个双向同步
,当华为云rds宕机的时候,可以切换到天翼云继续提供服务,而且此时,天翼云的数据也可以自动同步到华为云rds,平时只使用华为云的rds,和双A方案有点差异,需要注意的是rds环境不能安装任何的软件,所以,我目前想到的方案有:
1、用MySQL自带的主从复制。这个方案最简单,但是不可行,因为华为云和天翼云都禁用了super权限,在执行change master
的时候会报权限不足的错误,“ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation
”。
2、使用华为云或天翼云自带的数据同步功能。这个也不可行,翻阅了一下文档,同步只能全量+增量
同步,这对于双向同步来说不可行。
3、使用ogg远程捕获投递。ogg for MySQL从MySQL 5.7和ogg 19c开始支持远程捕获(Remote Capture)和远程投递(Remote Delivery),所以配置双向同步,该方案经过验证也是可行的!
OGG用于跨云RDS之间配置双主实时同步(远程捕获和投递):https://www.xmmup.com/oggyongyukuayunrdszhijianpeizhishuangzhushishitongbuyuanchengbuhuohetoudi.html
4、使用阿里的开源工具otter,这个方案经过验证是可行的。阿里数据同步工具Otter和Canal简介请参考:https://www.xmmup.com/alishujutongbugongjuotterhecanaljianjie.html
otter用于跨云RDS之间配置双主实时同步参考:https://www.xmmup.com/otteryongyukuayunrdszhijianpeizhishuangzhushishitongbu.html
otter和ogg优缺点
1、otter不能同步无主键的表(会导致同步任务停止),而ogg可以
2、otter可以单向同步ddl语句,而ogg对于MySQL 5.7不可以,ogg对MySQL 8.0支持DDL同步
3、otter有图形界面操作,OGG只有命令行操作
搭建otter环境配置双向同步
本次环境架构图如下:

准备环境
购买2台RDS for MySQL环境
这里,我做测试直接买了2台华为云的rds,大家把rds-3388-0001当做华为云rds,另一台当做天翼云rds吧:

购买1台ECS环境作为otter环境
这里,我做测试直接买了1台华为云的ecs:

开放端口:8088,web页面使用
开放端口:2088,2089,2090,这几个端口对rds开放,同时2个rds的3306需要对这台ecs开放。
下面开始配置:
1-- 拉取docker环境的otter
2docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrotter:v2.0
3
4-- 创建otter
5docker run -d --name lhrotter -h lhrotter \
6-v /sys/fs/cgroup:/sys/fs/cgroup \
7-p 8088:8088 -p 2088-2090:2088-2090 \
8--privileged=true \
9registry.cn-hangzhou.aliyuncs.com/lhrbest/lhrotter:v2.0 init
10
11
12-- 进入otter环境
13docker exec -it lhrotter bash
14
15-- 修改/usr/local/otter_manager/conf/otter.properties
16otter.domainName = 139.9.130.227
17
18
19-- 启动otter环境
20sh /etc/rc.local
启动成功后浏览器访问 http://139.9.130.227:8088/login.htm,出现otter的页面,用户名和密码都是admin。

配置otter
修改Node
选择机器管理的node管理:


由于ECS和2台rds通信只能使用外网IP,所以,这里启用外部IP, 如上图。
启动node

启动命令:
1/usr/local/otter_node/bin/startup.sh
管理界面显示节点状态已经启动:

添加数据源
添加2个rds的数据源:填写正确的数据库连接信息。


这里填写的mysql用户不一定要用root,只要有操作需同步数据的库表的相关权限即可。

添加需要同步的数据表


注意:如果同步整个数据库的表,则将schema name和table name都设置成“.*”,不建议对整个库同步,因为有系统库不建议同步。

配置双向同步
双向同步可以理解为两个单向同步的组合,但需要额外处理避免回环同步. 回环同步算法:Otter双向回环控制 .
同时,因为双向回环控制算法会依赖一些系统表,需要在需要做双向同步的数据库上初始化所需的系统表,也可以直接从界面获取(可以点击使用文档-》数据库初始化页面),获取初始sql:
1wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql
界面获取:

配置上相比于单向同步有一些不同,操作步骤:
首先配置一个channel
然后添加两个pipeline
注意:两个单向的canal和映射配置,在一个channel下配置为两个pipeline。如果是两个channel,每个channel一个pipeline,将不会使用双向回环控制算法,也就是会有重复回环同步.每个pipeline各自配置canal,定义映射关系
双向需要注意:
一个channel 添加两个 pipeline ,
两个为双向同步,如果要用DDL同步,一个pipeline开启ddl同步,另一个不要开启,且建议开启跳过ddl异常,DryRun模式 不要开启
同时在配置双向同步的时候,建议执行otter-system-ddl-mysql.sql增加同步控制库,若是单向同步,则不需要运行该脚本。
双向同步建议在需要同步的两个数据库中新建retl数据库。
1/*
2供 otter 使用, otter 需要对 retl.* 的读写权限,以及对业务表的读写权限
31. 创建database retl
4*/
5CREATE DATABASE retl;
6
7/* 2. 用户授权 给同步用户授权 */
8CREATE USER retl@'%' IDENTIFIED BY 'retl';
9GRANT USAGE ON *.* TO `retl`@'%';
10GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `retl`@'%';
11GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO `retl`@'%';
12/* 业务表授权,这里可以限定只授权同步业务的表 */
13GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `retl`@'%';
14
15/* 3. 创建系统表 */
16USE retl;
17DROP TABLE IF EXISTS retl.retl_buffer;
18DROP TABLE IF EXISTS retl.retl_mark;
19DROP TABLE IF EXISTS retl.xdual;
20
21CREATE TABLE retl_buffer
22(
23 ID BIGINT(20) AUTO_INCREMENT,
24 TABLE_ID INT(11) NOT NULL,
25 FULL_NAME varchar(512),
26 TYPE CHAR(1) NOT NULL,
27 PK_DATA VARCHAR(256) NOT NULL,
28 GMT_CREATE TIMESTAMP NOT NULL,
29 GMT_MODIFIED TIMESTAMP NOT NULL,
30 CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
31) ENGINE=InnoDB DEFAULT CHARSET=utf8;
32
33CREATE TABLE retl_mark
34(
35 ID BIGINT AUTO_INCREMENT,
36 CHANNEL_ID INT(11),
37 CHANNEL_INFO varchar(128),
38 CONSTRAINT RETL_MARK_ID PRIMARY KEY (ID)
39) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
40
41CREATE TABLE xdual (
42 ID BIGINT(20) NOT NULL AUTO_INCREMENT,
43 X timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
44 PRIMARY KEY (ID)
45) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
46
47/* 4. 插入初始化数据 */
48INSERT INTO retl.xdual(id, x) VALUES (1,now()) ON DUPLICATE KEY UPDATE x = now();
添加canal
Otter使用canal开源产品获取数据库增量日志数据,可以把cannal看作是源库的一个伪slave。
原理:canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议,mysql master收到dump请求,开始推送binarylog给slave(也就是canal), canal解析binary log对象(原始为byte流)。
若要配置双向同步,则必须添加2个canal,若配置单向同步,则配置一个canal即可。




添加channel、pipline以及映射关系

若是单向同步,则可以不开启数据一致性!



注意这里的选项:



2个Pipeline都需要添加映射关系:


启动channel


验证
验证是否同步:
1-- 华为云
2mysql -uroot -p -h124.70.97.208
3
4
5MySQL [lhrdb]> insert into ab values(2);
6Query OK, 1 row affected (0.03 sec)
7
8
9-- 天翼云
10mysql -uroot -p -h114.116.245.109
11
12MySQL [(none)]> select * from lhrdb.ab;
13+----+
14| id |
15+----+
16| 1 |
17| 2 |
18+----+
192 rows in set (0.03 sec)
20
21MySQL [lhrdb]>
22MySQL [(none)]> insert into lhrdb.ab values(3);
23Query OK, 1 row affected (0.03 sec)
24
25-- 华为云查询
26MySQL [lhrdb]> select * from lhrdb.ab;
27+----+
28| id |
29+----+
30| 1 |
31| 2 |
32| 3 |
33+----+
343 rows in set (0.03 sec)
双向同步配置完成。

添加监控


压测
使用mysqlslap
创建了一个简单的表使用mysqlslap进行测试。
1CREATE TABLE `otter_test` (
2`id` int(11) NOT NULL,
3`name` varchar(100) DEFAULT NULL,
4PRIMARY KEY (`id`)
5) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
测试100w条插入:
1mysqlslap --concurrency=50 --iterations=1 --create-schema=lhrdb \
2--query="insert into otter_test values(FLOOR(0 + (RAND() * 10000000)),'namexmm') \
3ON DUPLICATE KEY UPDATE name='xmmupwuwwu'" \
4--number-of-queries=1000000 -uroot -plhr -P3306 -h124.70.97.208
5

延迟、tps等如下:





使用sysbench
由于DDL是单向同步,所以,在华为云rds需要做建表操作,然后可以在天翼云rds做压测:
1-- 在华为云rds
2sysbench /usr/share/sysbench/oltp_common.lua --time=100 --mysql-host=124.70.97.208 \
3--mysql-port=3306 --mysql-user=root --mysql-password=lhr --mysql-db=lhrdb \
4--table-size=100000 --tables=10 --threads=16 --events=999999999 prepare
5
6-- 在天翼云rds
7sysbench /usr/share/sysbench/oltp_read_write.lua --time=100 --mysql-host=114.116.245.109 \
8--mysql-port=3306 --mysql-user=root --mysql-password=lhr --mysql-db=lhrdb \
9--table-size=100000 --tables=10 --threads=16 --events=999999999 --report-interval=10 \
10--db-ps-mode=disable --forced-shutdown=1 run






总体来说,如果不做太多的字段重命名、二次处理,otter性能本身还是不错的。
本文结束。

• 个人博客地址:www.xmmup.com
• 微信公众号:DB宝,作者:小麦苗,作者微信:db_bao
• 作者QQ:646634621,QQ群:230161599、618766405
• 提供Oracle OCP、OCM、高可用(rac+dg+ogg)、MySQL DBA和PostgreSQL DBA培训及其考证事宜
• 版权所有,欢迎分享本文,转载请保留出处• 若有侵权请联系小麦苗删除

长按下图识别二维码,关注小麦苗的微信公众号:DB宝,学习最实用的数据库技术。







