由于公司的业务在高速发展的过程当中需要往海外进行扩张,就导致了海外访问内地的服务出现延迟极高的问题直接影响了终端用户的使用体验,为了应对这个问题我们设想的解决方案是分区域进行一整套环境部署,从而来彻底解决这个问题;但是分区域部署涉及到的主要问题就是数据库的读写与同步,并且如何保证数据的一致性,所以基于这一系列的问题我对 Otter 进行了一些调研并写此篇文章。
此篇文章不会介绍:什么是 Docker
、什么是 Otter
、以及什么是 Canal
,请需要的朋友可到相关官方文档库查阅资料,Otter&Canal 官方代码及文档 、Docker 官方网站;我这边为了对环境进行快速搭建,采用了 docker-compose
进行处理,配置文件仓库地址:https://github.com/caryyu/dockerfiles/tree/master/otter ,此配置文件会构建以下几样容器用来做预备虚机或容器:
Manager
的数据库;Otter
的 Manager
;Otter
的国内 Node
;Otter
的海外 Node
;注意:我这里并未封装
Otter
环境所需的Docker
镜像,容器里只是一个很简单的空的操作系统,需要自行再安装对应所需的软件;另外,我这里之所以分配静态 IP 地址给每个容器是因为Otter
的机器配置里面对Hostname
的支持不太好;顺便说一句:docker-compose
文件里面我注释了Canal
是因为Node
已经内嵌了一个。
好了,说到这里我们就能进入正题开始进行环境配置了,在环境配置之前请先下载对应所需的发布程序以及数据库相关 Otter
所需的核心脚本进行准备着。
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
命令docker-compose up -d
ManagerDB
的脚本在 ManagerDB
数据库中对 otter-manager-schema.sql
的脚本进行执行。
在两个国内与海外两个数据库都分别进行执行 otter-system-ddl-mysql.sql
脚本,给 双A同步
做准备。
Manager
并配置首先,我们先利用 docker cp
命令把文件复制到容器中去,如下所示:
docker cp ./manager.deployer-4.2.15.tar.gz otter_manager_1:/
然后,进入容器中,如下所示:
docker exec -it otter_manager_1 sh
然后,创建文件夹 otter
并复制文件到此目录中再进行解压,如下所示:
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
进行修改,如下所示:
<Set name="port">8080Set>`
把
Jetty
的端口固定为 8080,记住有两处端口,不要取otter.port
属性值。
配置文件 conf/otter.properties
进行三处修改,如下所示:
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
吧,如下所示:
sh bin/startup.sh
如果没有报错就访问地址:http://localhost:8888 ,能打开说明 Manager
启动成功了。
Node
并配置由于有两个
Node
,我这里只做一次,所以第二次需要你们自己再做一遍,容器名称别搞错了。
首先,我们先利用 docker cp
命令把文件复制到容器中去,如下所示:
docker cp ./node.deployer-4.2.15.tar.gz otter_node1_1:/
然后,进入容器中,如下所示:
docker exec -it otter_node1_1 sh
然后,创建文件夹 otter
并复制文件到此目录中再进行解压,如下所示:
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 进行核心配置 (右上角一定要显示超级管理员,否则退出重新登录),如下所示:
这个时候机器显示的状态都是 未启动
的,所以接下来我们要开始启动 Node
的准备工作,图片这里所示的序号编号很重要,第一列的编号序列需要写到对应的 Node
配置中的。
把 Node
的序号和之前添加机器的序号编号对应起来,如下所示:
echo 1 > conf/nid
配置文件 conf/otter.properties
进行修改,如下所示:
otter.manager.address = otter_manager_1:1099
补充容器系统缺少的几个重要文件与命令,如下所示:
touch /root/.bash_profile
cp /bin/sh /bin/bash
apk update
apk add aria2
好了,我们开始启动脚本 bin/startup.sh
吧,如下所示:
sh bin/startup.sh
如果在 Manager
界面的机器管理中状态变成 已启动
说明就好了。
配置国内与海外的数据库数据源。
把需要同步的表进行预设配置好,随便创建一个 test
数据库,然后创建一张 student
表用来测试,脚本如下:
注意:脚本需要再国内与海外数据库都要进行执行创建操作。
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;
这里使用 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