作者简介
马听,多年 DBA 经验,对MySQL、 Redis、MongoDB、Go等有一定了解,书籍《MySQL DBA精英实战课》作者,慕课网DBA体系课(https://class.imooc.com/sale/dba)讲师
上周一开始,体系课《DBA数据库工程师》活动(原价1999,限时减500),已经有6位朋友加入学习了。
到目前,总共有139位朋友加入了学习。
上周五,第20周的内容已经更新:

如上图,有一个项目就是讲数据库上云的,这中间就涉及到MySQL数据同步到公有云上,当然,有很多方案,比如阿里云的DTS,我们这一节就来分享一下另外一种方案:通过Otter把机房MySQL数据同步到公有云。
1 测试环境准备
有一套本地MySQL和一套云上的RDS MySQL版。
并在云上的RDS上创建同步用户:
用户名:otter_user
密码:Td9Agcadf7
权限:对所有业务库都有查询权限。
并且给RDS开通外网访问地址。
2 把机房全量数据导入公有云
在机房MySQL备份业务库的所有数据
mysqldump -uroot -p --set-gtid-purged=OFF --master-data=2 onlinestore >onlinestore.sql
在RDS创建业务库onlinestore。
把数据导入到RDS:
mysql -hxxx -uotter_user -pTd9Agcadf7 onlinestore <onlinestore.sql
3 构造增量数据
这一步骤,是为了验证Otter是否能同步全备到创建同步这期间的增量数据。
在机房的MySQL中:
insert into t1 values (666,666,666);
4 准备用来存放Otter元数据的数据库
Otter本身需要一个实例来存放元数据,我们找一个MySQL实例,先创建用户:
create user 'otter_rw'@'%' identified with mysql_native_password by 'Yd8G6qG91';GRANT all ON otter.* TO 'otter_rw'@'%';
再下载Otter的元数据并导入这个实例
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sqlmysql -uroot -p otter <otter-manager-schema.sql
5 安装zookeeper
Otter允许多个节点之间协同工作,通过zookeeper来解决分布式调度。
我们就来安装zookeeper
mkdir /data/zookeepercd /data/zookeeperwget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.1/apache-zookeeper-3.9.1-bin.tar.gztar zxvf apache-zookeeper-3.9.1-bin.tar.gzcd apache-zookeeper-3.9.1-bincd conf/cp zoo_sample.cfg zoo.cfg
修改配置文件
vim zoo.cfg
加入(所有zookeeper节点)
server.1=192.168.12.161:2888:3888server.2=192.168.12.162:2888:3888server.3=192.168.12.163:2888:3888
配置myid
mkdir /tmp/zookeeper/echo 1 >/tmp/zookeeper/myid
另外两台机器分别是2和3。
启动zookeeper
/data/zookeeper/apache-zookeeper-3.9.1-bin/bin/zkServer.sh start
6 Otter manager部署
下载并解压otter manager:
cd /data/otterwget https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gzmkdir managertar zxvf manager.deployer-4.2.18.tar.gz -C manager
修改配置文件
vim data/otter/manager/conf/otter.properties
修改如下内容:
## otter manager domain nameotter.domainName = 192.168.152.70## otter manager http portotter.port = 8080otter.database.driver.class.name = com.mysql.jdbc.Driverotter.database.driver.url = jdbc:mysql://192.168.152.30:3306/otterotter.database.driver.username = otter_rwotter.database.driver.password = xxx## default zookeeper addressotter.zookeeper.cluster.default = 192.168.152.70:2181
其中:
otter.domainName 是访问Otter的地址,建议设置成IP;
otter.database.driver 开头的这几个参数,就是Otter元数据使用的MySQL的连接信息;
otter.zookeeper.cluster.default 配置zookeeper的IP和端口。
启动otter manager:
./bin/startup.sh
访问
http://IP:9090/
用户名密码默认都是admin。
7 管理页面增加zookeeper
点击:机器管理-zookeeper管理-添加

将我们前面安装的zookeeper集群配置好:

8 Otter Node部署
点击:机器管理-Node管理-添加

如下图,查看节点的编号,这个编号等会要写入到node的nid文件中

安装配置node
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gzcd /data/ottermkdir nodetar zxvf node.deployer-4.2.18.tar.gz -C node
配置nid,这个就是我们在页面上查看到的node ID
echo 1 > conf/nid
修改配置文件
vim conf/otter.properties
修改manager的地址
## otter arbitrate & node connect manager configotter.manager.address = 127.0.0.1:1099
启动node
./bin/startup.sh
可以查看日志:
tail -f logs/node/node.log
如果显示这个,就表示安装成功
2024-03-07 10:55:00.640 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
在到otter manager,看下节点的状态。
如果显示“已启动”,就表示node安装成功。

9 添加数据源
在机房的MySQL中创建用户:
create user 'otter_user'@'%' identified with mysql_native_password by 'Td9Agcadf7';GRANT all ON *.* TO 'otter_user'@'%';
进到Manager管理页面:
配置管理-数据源配置
先配置同步源,如下图,点击“验证连接数据源”:

用户名密码就是刚才我们创建的:
otter_user
Td9Agcadf7
再配置同步目标:

10 增加数据表配置
这一步,也就是配置要同步的库和表。
配置管理-数据表配置-添加
源端配置如下:
schema name为要同步的库;
table name是要同步的表,(.*)表示同步这个库所有表;
数据源选择我们在第9步添加的数据源。
一般配置完之后,需要点击“查询Schema&Table”按钮验证一下:

目标端

11 配置canal
配置管理-canal配置-添加

这里要注意,需要配置备份时的位点信息,可以去查看上面第2步备份文件onlinestore.sql。

12 添加Channel
同步管理-添加

13 添加pipeline
进到上一步添加的Channel中,添加pipeline。

14 添加映射关系
在点击进入到这个新建的Pipeline中
点击:添加
选择对应的数据表(前者机房MySQL,后者RDS)

15 启动同步
同步管理-在对应的Channel,点击启用

16 确定增量数据有没有同步
在RDS上,执行
select * from t1;
看是否有我们在第3步构造的增量数据。
17 再测试DDL和DML同步
机房MySQL执行:
CREATE TABLE `t2024` (`id` int NOT NULL,`c1` int DEFAULT NULL,`a` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t2024 values ( 666,666,666);
RDS确定数据:
select * from t2024;
更多MySQL实战项目,欢迎订购小编的DBA体系课。

关注公众号
回复“高可用”,可获取8篇MySQL高可用文章;
回复“DBA面试题”,可获取一份DBA面试题PDF。
点击阅读原文跳转到课程。




