基于 Docker 虚拟化技术快速搭建 Otter 测试环境

由于公司的业务在高速发展的过程当中需要往海外进行扩张,就导致了海外访问内地的服务出现延迟极高的问题直接影响了终端用户的使用体验,为了应对这个问题我们设想的解决方案是分区域进行一整套环境部署,从而来彻底解决这个问题;但是分区域部署涉及到的主要问题就是数据库的读写与同步,并且如何保证数据的一致性,所以基于这一系列的问题我对 Otter 进行了一些调研并写此篇文章。

说明

此篇文章不会介绍:什么是 Docker、什么是 Otter、以及什么是 Canal,请需要的朋友可到相关官方文档库查阅资料,Otter&Canal 官方代码及文档Docker 官方网站;我这边为了对环境进行快速搭建,采用了 docker-compose 进行处理,配置文件仓库地址:https://github.com/caryyu/dockerfiles/tree/master/otter ,此配置文件会构建以下几样容器用来做预备虚机或容器:

  • mysqla - 用此台虚机或容器当作国内数据库;
  • mysqlb - 用此台虚机或容器当作海外数据库;
  • managerdb - 用此台虚机或容器当作 Manager 的数据库;
  • manager - 用此台虚机或容器当作 OtterManager
  • node1 - 用此台虚机或容器当作 Otter 的国内 Node
  • node2 - 用此台虚机或容器当作 Otter 的海外 Node
  • zkServer - 用来给以上的实例进行依赖的服务(如:服务协调、元数据存储等),理论上也需要区分国内与海外的集群,为了直观所有就只弄了一个,有兴趣的朋友可以自己搭建多个。

注意:我这里并未封装 Otter 环境所需的 Docker 镜像,容器里只是一个很简单的空的操作系统,需要自行再安装对应所需的软件;另外,我这里之所以分配静态 IP 地址给每个容器是因为 Otter 的机器配置里面对 Hostname 的支持不太好;顺便说一句:docker-compose 文件里面我注释了 Canal 是因为 Node 已经内嵌了一个。

环境配置

好了,说到这里我们就能进入正题开始进行环境配置了,在环境配置之前请先下载对应所需的发布程序以及数据库相关 Otter 所需的核心脚本进行准备着。

1
2
3
4
wget https://github.com/alibaba/otter/releases/download/v4.2.15/manager.deployer-4.2.15.tar.gz
wget https://github.com/alibaba/otter/releases/download/v4.2.15/node.deployer-4.2.15.tar.gz
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql

启动 docker-compose 命令

1
docker-compose up -d

执行 ManagerDB 的脚本

ManagerDB 数据库中对 otter-manager-schema.sql 的脚本进行执行。

执行 国内与海外DB 的脚本

在两个国内与海外两个数据库都分别进行执行 otter-system-ddl-mysql.sql 脚本,给 双A同步 做准备。

安装 Manager 并配置

容器文件复制

首先,我们先利用 docker cp 命令把文件复制到容器中去,如下所示:

1
docker cp ./manager.deployer-4.2.15.tar.gz otter_manager_1:/

进入容器

然后,进入容器中,如下所示:

1
docker exec -it otter_manager_1 sh

解压文件

然后,创建文件夹 otter 并复制文件到此目录中再进行解压,如下所示:

1
2
3
4
cd /
mkdir otter && mv manager.deployer-4.2.15.tar.gz otter
tar zxf manager.deployer-4.2.15.tar.gz
rm manager.deployer-4.2.15.tar.gz

核心配置

配置文件 conf/jetty.xml 进行修改,如下所示:

1
<Set name="port">8080</Set>`

Jetty 的端口固定为 8080,记住有两处端口,不要取 otter.port 属性值。

配置文件 conf/otter.properties 进行三处修改,如下所示:

1
2
3
otter.port = 8888
otter.database.driver.url = jdbc:mysql://otter_managerdb_1:3306/otter
otter.zookeeper.cluster.default = otter_zkServer1_1:2181

启动

好了,我们开始启动脚本 bin/startup.sh 吧,如下所示:

1
sh bin/startup.sh

如果没有报错就访问地址:http://localhost:8888 ,能打开说明 Manager 启动成功了。

安装 Node 并配置

由于有两个 Node ,我这里只做一次,所以第二次需要你们自己再做一遍,容器名称别搞错了。

容器文件复制

首先,我们先利用 docker cp 命令把文件复制到容器中去,如下所示:

1
docker cp ./node.deployer-4.2.15.tar.gz otter_node1_1:/

进入容器

然后,进入容器中,如下所示:

1
docker exec -it otter_node1_1 sh

解压文件

然后,创建文件夹 otter 并复制文件到此目录中再进行解压,如下所示:

1
2
3
4
cd /
mkdir otter && mv node.deployer-4.2.15.tar.gz otter
tar zxf node.deployer-4.2.15.tar.gz
rm node.deployer-4.2.15.tar.gz

管理控制台界面配置

访问 http://localhost:8888 进行核心配置 (右上角一定要显示超级管理员,否则退出重新登录),如下所示:

图一

IMAGE

图二

IMAGE

图三

IMAGE

图四

IMAGE
这个时候机器显示的状态都是 未启动 的,所以接下来我们要开始启动 Node 的准备工作,图片这里所示的序号编号很重要,第一列的编号序列需要写到对应的 Node 配置中的。

核心配置

Node 的序号和之前添加机器的序号编号对应起来,如下所示:

1
echo 1 > conf/nid

配置文件 conf/otter.properties 进行修改,如下所示:

1
otter.manager.address = otter_manager_1:1099

补充容器系统缺少的几个重要文件与命令,如下所示:

1
2
3
4
touch /root/.bash_profile
cp /bin/sh /bin/bash
apk update
apk add aria2

启动

好了,我们开始启动脚本 bin/startup.sh 吧,如下所示:

1
sh bin/startup.sh

如果在 Manager 界面的机器管理中状态变成 已启动 说明就好了。

数据源

配置国内与海外的数据库数据源。

数据表

把需要同步的表进行预设配置好,随便创建一个 test 数据库,然后创建一张 student 表用来测试,脚本如下:

注意:脚本需要再国内与海外数据库都要进行执行创建操作。

1
2
3
4
5
6
7
CREATE DATABASE test;
USE test;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;

Canal 配置

这里使用 root 账号就可以了,总共要配置两个,一个对应国内的数据库,一个对应海外的数据库。

单向同步

在同步管理里面创建一个 channel 然后再进去创建一个 pipeline 即可,把源数据和目标数据配置好就可以了,比较简单。

双向同步

在同步管理里面创建一个 channel 然后再进去创建二个 pipeline,把其中一个 pipeline主站点 设置为 true,然后再把其中一个 pipeline 的高级设置中的 支持ddl同步 设置为 false

测试

  • 我们在国内数据库插入一行数据,看海外数据库是否同步成功;
  • 我们在海外数据库插入一行数据,看国内数据库是否同步成功;
  • 我们在海外与国内数据库同时写入看具体的表现又是如何。

结论

根据此篇文章的描述已经初步完成了同步的工作,但是投入生产还往往不够,因为根据我的测试,某一个 DB 宕机之后再次启动发现同步会失效等系列问题,而且 Otter 的社区一堆 Issues 未进行有效解决,总之想要直接投入生产还是需要慎重再慎重,还需要对源码进行改造等工作;如果一旦选择使用此方案来做同步,请建立一个团队进行维护与改造,数据乃是重中之重,数据一旦出现问题,后果不堪设想。

以上就是本人一些简单的见解,有任何问题请留言。

更多资料

https://github.com/alibaba/otter/wiki/Manager%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D