背景
由于公司的业务在高速发展的过程当中需要往海外进行扩张,就导致了海外访问内地的服务出现延迟极高的问题直接影响了终端用户的使用体验,为了应对这个问题我们设想的解决方案是分区域进行一整套环境部署,从而来彻底解决这个问题;但是分区域部署涉及到的主要问题就是数据库的读写与同步,并且如何保证数据的一致性,所以基于这一系列的问题我对 Otter 进行了一些调研并写此篇文章。
说明
此篇文章不会介绍:什么是 Docker
、什么是 Otter
、以及什么是 Canal
,请需要的朋友可到相关官方文档库查阅资料,Otter&Canal 官方代码及文档 、Docker 官方网站;我这边为了对环境进行快速搭建,采用了 docker-compose
进行处理,配置文件仓库地址:https://github.com/caryyu/dockerfiles/tree/master/otter ,此配置文件会构建以下几样容器用来做预备虚机或容器:
- mysqla - 用此台虚机或容器当作国内数据库;
- mysqlb - 用此台虚机或容器当作海外数据库;
- managerdb - 用此台虚机或容器当作
Manager
的数据库; - manager - 用此台虚机或容器当作
Otter
的Manager
; - node1 - 用此台虚机或容器当作
Otter
的国内Node
; - node2 - 用此台虚机或容器当作
Otter
的海外Node
; - zkServer - 用来给以上的实例进行依赖的服务(如:服务协调、元数据存储等),理论上也需要区分国内与海外的集群,为了直观所以就只弄了一个,有兴趣的朋友可以自己搭建多个。
注意:我这里并未封装
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
的脚本进行执行。
执行 国内与海外DB 的脚本
在两个国内与海外两个数据库都分别进行执行 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">8080</Set>`
把
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;
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