基于 Docker 虚拟化技术快速搭建 Otter 测试环境
2018-02-02 14:02
861 查看
背景
由于公司的业务在高速发展的过程当中需要往海外进行扩张,就导致了海外访问内地的服务出现延迟极高的问题直接影响了终端用户的使用体验,为了应对这个问题我们设想的解决方案是分区域进行一整套环境部署,从而来彻底解决这个问题;但是分区域部署涉及到的主要问题就是数据库的读写与同步,并且如何保证数据的一致性,所以基于这一系列的问题我对 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[/code]启动
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
相关文章推荐
- 基于Docker搭建MySQL(MariaDB)+ mycat读写分离测试环境
- 基于Swarm Docker虚拟化技术的集群环境分析_20170110
- 基于docker ceph环境快速搭建体验
- spring3.0+struts2+hibernate3整个环境的搭建和基于junit4的spring测试框架,最新技术的ssh框架
- 基于Docker快速搭建单机版Kuberntes
- 使用Docker快速搭建Oracle开发环境的方法教程
- 基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享
- 基于 Jenkins 快速搭建持续集成环境
- Ubuntu 基于Docker的TensorFlow 环境搭建
- 详解从 0 开始使用 Docker 快速搭建 Hadoop 集群环境
- OSChina 技术周刊第二十期 —— 使用 Docker 搭建 Java Web 运行环境
- 快速搭建IE测试环境(Virtualbox+ievms)
- 基于 Jenkins 快速搭建持续集成环境
- 基于 Jenkins 快速搭建持续集成环境
- 测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作
- 基于docker的caffe环境搭建方法
- windows 基于docker下的 spark 开发环境搭建
- Docker基于centos7搭建Java环境
- 基于Peers与miniSipServer的VoIP测试环境的搭建
- Ubuntu16.04下基于Docker的Caffe-GPU版本环境搭建总结