otter是阿里开源的一个分布式数据库同步系统,尤其是在跨机房数据库同步方面,有很强大的功能。它是基于数据库增量日志解析,实时将数据同步到本机房或跨机房的mysql/oracle数据库。
网络图:
实验环境:
A机房(公司内网)《===》B机房(云服务环境内网)
数据源(mysql需开启binlog,binlog_format=ROW):
Mysql_A:192.168.1.20:3306(外部IP:xx.xx.xx.xx:3306)
Mysql_B:192.168.123.12:3306(外部IP:yy.yy.yy.yy:3306)
角色分布:
Zookeeper:192.168.1.20:3181(外部IP:xx.xx.xx.xx:3181)
Manager:192.168.1.19:2333
Node1(云服务):192.168.123.12(外部IP:yy.yy.yy.yy:2088)
Node2(公司内网):192.168.1.228:2088(外部IP:xx.xx.xx.xx:2088)
注:由于在现实环境中,考虑到跨机房同步的问题,所以很多时候需要使用到外部IP来进行服务之间的访问,因此mysql,zookeeper以及nodes都需讲相应的端口开放到外网(其中node需开放2088以及9090端口)。
Otter打包
1,下载:https://github.com/alibaba/otter。
2,打包机器上安装mvn打包工具。
3,解压otter包,并搭建otter所需环境。
#unzip otter-4.2.15.zip # cd otter-4.2.15/lib # sh install.sh # cd ../ && mvn clean install
4,打包。
# mvn clean install -Dmaven.test.skip -Denv=release
打包成功后会在target目录下生成manager和node的代码包:
Manager安装
1,把打好的manager代码包传至manager节点,并解压。
# tar -zxvf manager.deployer-4.2.16-SNAPSHOT.tar.gz -C /usr/local/otter-manager
2,在mysql中,新建otter所需的库,并执行otter提供的初始化sql。(初始化sql在otter的代码包中能找到)
Mysql > create database otter_fjhb; Mysql > source /path/otter-4.2.15/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
3,Manager配置文件,配置manager端口以及mysql和zookeeper的连接信息。
4,启动manager。
# /usr/local/otter-manager/bin/starup.sh
Node安装
1,打开manager页面,配置zookeeper信息,注意node节点需能访问zookeeper信息,这里的zk需填写外部IP来访问。
2,添加node1(华为云),启用外部IP。
添加node2(华博内网),启用外部IP:
3,进入node服务器,把打包好的node包传上去,并解压配置。
# tar -zxvf node.deployer-4.2.16-SNAPSHOT.tar.gz -C /usr/local/otter-node
4,配置manager的地址。
5,配置nid (根据node id配置来配置)。
# echo '1' > conf/nid
6,安装aria2工具(在node节点之间提供文件传输通道)。
# tar -zxvf aria2-1.33.1.tar.gz # cd aria2-1.33.1/ && ./configure &&make && make install
7,启动node。
# /path/bin/startup.sh
8,Node正确启动后,可以查看node状态。
注:安装node要先在manager页面上配置node信息,否则启动node的时候会报错:‘在manager上找不到node x’。
这里配置华博内网mysql到华为云内网mysql的单向数据同步。
其中有如下步骤:
1:配置同步双方的mysql数据源:配置管理à数据源配置。
这里填写的mysql用户不一定要用root,只要有操作需同步数据的库表的相关权限即可。
2:配置同步双方的相关mysql数据源表,配置管理==》数据表配置。这里可以配置一个schema下的单张表,也可匹配schema下的所有表,这里我们配置同步所有表。
3:配置canal,定义源数据库,配置管理canal配置。
这里填写的mysql用户不一定是root,但需拥有可执行show master status的权限。
4:新增channel、pipline以及映射关系。
根据同步的流程位置选择select机器和load机器,离源mysql近的应为select机器,离目的mysql近的应为load机器。
根据同步关系选择数据源表:
完成以上配置后返回channel管理,启用channel,该channel中的pipline就会自动去寻找源mysql中的binglog position位置,两边的mysql就开始进入同步状态了。
双向同步本质上就是配置两个单向同步。本质上可以配置两个channel并分别配置pipline来实现,但是这种情况下,会有数据回环同步的问题。Otter里面提供了otter双向回环控制功能,可通过在一个channel里配置两个pipline来实现。
这里实现的是华博内网和华为云双向的数据同步,步骤和单向同步类似。
1:配置同步双方的mysql数据源。
2:配置同步双方的相关mysql数据源表。
3:配置canal,定义源数据库。
由于是双向同步,因此需配置两个canal。
4:新增channel、pipline以及映射关系。
新增channel。
添加pipline,这里根据同步方向不同,添加两个pipline。其中一个Pipline高级设置中的的“支持DDL同步”选项需关闭,否则channel会报“一个channel中只允许开启单向ddl同步!”错误。
在两个pipline中分别添加映射关系,添加完效果如下,形成一个双向的channel。
启用channel,状态中会显示这是一个双向channel,在完成定位后,双向同步开始工作。无论在哪个端的mysql操作数据,都会同步到另一端。但注意,由于其中的一个pipline个关闭了ddl同步功能,这里的ddl操作是单向同步的。
后记:
以上操作是搭建公司两个环境mysql数据库同步的otter时顺手写的文档。其实otter还针对其他同步场景有不同的配置,比如双A配置,主从配置等等,这里由于还未测试过,没有写出来,希望后期后空可以做一下相关的实验。最终的结果效果测试没有放上来,是基于效果截图不直观的考虑。如果正确配置的话,应该同步效果都是没问题的。
跨机房的otter配置,有个很大的问题就是网络访问问题,比如:manager需要能访问node,node之间需要能互相访问,manager和node需要能访问zookeeper,load node需要能访问源mysql等。如何把所有的关节打通是一个比较繁琐的问题,大家可以多留意manager和node的日志。
另外,otter在使用过程中会出现许多不稳定的问题,比如pipline修改配置会造成同步延迟,pipline重启会导致定位异常等。建议给manager和node节点分配大一点的内存使用。