利用otter实现跨机房数据同步

Otter:

     otter是阿里开源的一个分布式数据库同步系统,尤其是在跨机房数据库同步方面,有很强大的功能。它是基于数据库增量日志解析,实时将数据同步到本机房或跨机房的mysql/oracle数据库。 


环境:(由于环境隐私原因,环境中使用的外部IP隐藏)

网络图:

实验环境:

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:

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目录下生成managernode的代码包:



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’。



Otter单向数据同步

这里配置华博内网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就开始进入同步状态了。



Otter双向数据同步

双向同步本质上就是配置两个单向同步。本质上可以配置两个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节点分配大一点的内存使用。

你可能感兴趣的:(利用otter实现跨机房数据同步)