otter:分布式数据库同步系统
一、otter介绍
阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。
otter项目:https://github.com/alibaba/otter
otter官方文档:https://github.com/alibaba/otter/wiki
二、QuickStart
1. 环境准备
服务器:
服务器A:192.168.x.1(主)
服务器B:192.168.x.3(从)
远程工具:XShell 6(用于建立远程连接)、Xftp 6(用于文件的上传)
操作系统:CentOS 7.2
JDK:1.8.0_221
数据库:MySQL 5.7
ZooKeeper:3.3.6
otter:otter包含两部分,一个是manager,另一个是node,版本都是4.2.16。
2.环境安装
(1) JDK的安装
otter为纯Java编写,因此需要确保机器中部署了Java环境。
本文下载版本:jdk-8u221-linux-x64.rpm(可根据具体需要自行选择)
1)上传安装包
打开Xftp 6,新建连接,上传安装包至指定的服务器,本文以 /home
为例。
2)执行安装
执行 rpm -ivh jdk-8u221-linux-x64.rpm
命令,开始安装JDK,等待安装完成。
在 /usr/java
下会增加一个 jdk1.8.0_221-amd64
,说明JDK安装成功。
3)配置环境变量
执行 vim /etc/profile
命令,打开 profile
文件,按 i
进行文件的编辑,在文件的尾部添加如下内容:
JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
JAVA_BIN=/usr/java/jdk1.8.0_221-amd64/bin
JRE_HOME=/usr/java/jdk1.8.0_221-amd64/jre
PATH=$JAVA_BIN:$PATH
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
注:以上根据实际安装路径填写。
另:如果系统中提示 -bash: vim: command not found
说明还未安装 vim
,需要先执行 yum -y install vim*
进行 vim
的安装。
编辑完成后,按 Esc
键退出编辑状态,并输入 :wq
进行保存并退出。
退出 profile
文件后,执行 source /etc/profile
命令,让配置文件立即生效。
执行 java -version
命令,查看Java信息。
出现如上信息说明JDK已经安装成功。
(2) MySQL的安装
本文下载版本:mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz
1)首先检查服务器中是否有之前安装的残留文件:
find / -name mysql
如果有,则进行删除。
rm -rf 目录+文件名
2)上传安装包
通过Xftp 6,上传MySQL安装包至服务器指定目录,以 /home
为例。
3)解压安装包
- 进入安装包所在目录:
cd /home
- 解压缩:
tar -xzvf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz
- 重命名解压缩后的文件夹:
mv mysql-5.7.16-linux-glibc2.5-x86_64 mysql
4)添加用户及用户组
- 新建mysql用户组:
groupadd mysql
- 查看新建的用户组:
cat /etc/group
- 新建mysql用户并添加至mysql用户组:
useradd -r -g mysql mysql
- 查看新建的用户:
cat /etc/passwd
- 在mysql文件夹下创建新的文件夹:
cd /home/mysql
mkdir data log tmp
- 将mysql文件夹及其子文件夹的用户及用户组改为mysql:
cd /home
chown -R mysql:mysql mysql
5)安装数据库
- 将MySQL配置文件
my.cnf
放到指定位置/etc
目录下(my.cnf
文件的配置可以参考这篇文章《my.cnf常用配置》) - 进入
mysql/bin
目录,执行安装命令,并指定用户、安装目录以及数据存放目录
cd /home/mysql/bin
./mysqld --initialize --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data
注:如果执行上述命令时报错:
./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
此时需要安装libaio
,安装命令为: yum -y install libaio
- 进入日志文件,查看初始密码(一定要保存初始密码,否则后面登陆不了MySQL)
cat /home/mysql/log/error.log
6)修改配置文件
- 进入
support-files
目录
cd /home/mysql/support-files
- 复制配置文件至
/etc/init.d/mysql
cp mysql.server /etc/init.d/mysql
- 修改MySQL配置文件
vim /etc/init.d/mysql
修改以下两个值:
basedir=/home/mysql
datadir=/home/mysql/data
- 配置系统环境变量
vim /etc/profile
添加MySQL相关环境变量:
export MYSQL_HOME=/home/mysql
export PATH=$PATH:$MYSQL_HOME/bin
- 修改完成后,执行
source /etc/profile
使配置生效
7)添加开机自启动服务并将MySQL服务启动
- 添加服务,服务名称为
mysql
chkconfig --add mysql
- 开启
mysql
自启动服务
chkconfig mysql on
- 启动
mysql
服务,出现SUCCESS!
即为启动成功
service mysql start
8)配置用户名、密码并开启远程访问权限
- 进入MySQL(5.7版本的初始密码由MySQL自动生成,即前文中日志文件所说密码)
mysql -u root -p
设置密码
set password=password('123456');
创建用户
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
设置远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;
exit;
(3)ZooKeeper的安装
otter node依赖于zookeeper进行分布式调度,需要安装一个zookeeper节点或者集群。
本文下载版本:zookeeper-3.3.6.tar.gz,只在服务器A:192.168.x.1(主)上进行单节点的部署。
1)使用Xftp 6上传安装包至服务器指定目录,本文以 /home
为例
2)进入安装包所在目录并解压
cd /home
tar -xzvf zookeeper-3.3.6.tar.gz
3)重命名文件
mv zookeeper-3.3.6 zookeeper
4)创建data及log目录
mkdir /home/zookeeper/data
mkdir /home/zookeeper/log
5)修改配置文件
cd /home/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改成如下内容:
6)启动zookeeper
cd /home/zookeeper/bin
./zkServer.sh start
出现 STARTED
字样即为启动成功。
7)自启动配置
vim /etc/rc.d/rc.local
添加下面一行语句:
/home/zookeeper/bin/zkServer.sh start
(4)otter manager的安装
在服务器A:192.168.x.1(主)机器上安装。
本文下载版本:manager.deployer-4.2.16.tar.gz
1)初始化otter manager系统表
下载:
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
注:如果没有安装 wget
需要先执行 yum -y install wget
进行安装。
载入(在MySQL内执行该语句):
source /home/otter-manager-schema.sql
注:MySQL 5.7版本 timestamp
类型的数据默认不能为,由此会导致上述语句执行失败。解决方案如下:
vim /etc/my.cnf
在[mysqld]下面添加一行:
sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
重启MySQL服务使配置生效:
service mysql restart
2)下载otter manager并上传至服务器
下载链接:https://github.com/alibaba/otter/releases
上传至 /home
文件夹下
3)解压缩
mkdir -p /home/otter/manager
cd /home
tar zxvf manager.deployer-4.2.16.tar.gz -C /home/otter/manager
4)配置修改
cd /home/otter/manager/conf
vim otter.properties
otter.domainName = 192.168.x.1(根据自己ip进行设置)
otter.port = 8080(设置otter manager服务的端口号,默认为8080)
otter.database.driver.url = jdbc:mysql://192.168.x.1:3306/otter
otter.database.driver.username = root
otter.database.driver.password = 123456
otter.zookeeper.cluster.default = 192.168.x.1:2181
5)启动
sh /home/otter/manager/bin/startup.sh
6)查看日志
vim logs/manager.log
2019-08-09 11:03:54.828 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
2019-08-09 11:03:54.828 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
出现上述信息,表明启动成功
7)验证
访问:http://192.168.x.1:8080/ 出现otter的页面,即代表启动成功
访问:http://192.168.x.1:8080/login.htm,初始密码为:admin/admin,即可完成登录. 目前:匿名用户只有只读查看的权限,登录为管理员才可以有操作权限
注:如果使用XShell等远程连接工具无法打开上述网址,请先关闭服务器的防火墙再尝试。
8)关闭
sh stop.sh
(5)otter node的安装
otter node需要在各个应用的服务器上进行安装和配置,即:
服务器A:192.168.x.1(主)
服务器B:192.168.x.3(从)
本文以服务器A为例进行讲解,其他机器上的安装配置类似。
本文下载版本:node.deployer-4.2.16.tar.gz
1)在manager中对node进行配置
- 访问http://192.168.x.1:8080/,已管理员的身份登陆系统
- 点击“机器管理”-“zookeeper管理”,添加zookeeper的信息
- 点击“机器管理”-“Node管理”,添加机器的信息
- 机器添加完成后,跳转到机器管理列表页面,得到对应机器的序号,称之为node id,简称nid,后续启动nid时会使用
2)安装aria2
node节点进行跨机房传输时,会使用到HTTP多线程传输技术,目前主要依赖了aria2c做为其下载客户端,当前测试过多个HTTP多线程下载客户端,比如wget,curl,axel,oget,proz,aria2c,测试结果aria2c下载效率最快,基本可以压满网卡。
- 首先安装EPEL源
yum install epel-release
yum repolist //查看是否成功安装epel
- 安装Aria2
yum install aria2
- 生成配置文件并编辑
mkdir /etc/aria2/
vim /etc/aria2/aria2.conf
- 配置内容
#用户名
#rpc-user=自行修改
#密码
#rpc-passwd=自行修改
#上面的认证方式不建议使用,建议使用下面的token方式
#设置加密的密钥
#rpc-secret=token
#允许rpc
enable-rpc=true
#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true
#允许外部访问,false的话只监听本地端口
rpc-listen-all=true
#RPC端口, 仅当默认端口被占用时修改
rpc-listen-port=6800
#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=5
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=5
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M
#单文件最大线程数, 路由建议值: 5
split=10
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
#上传速度限制
max-overall-upload-limit=0
#单文件速度限制
max-upload-limit=0
#断开速度过慢的连接
#lowest-speed-limit=0
#验证用,需要1.16.1之后的release版本
#referer=*
#文件保存路径, 默认为当前启动位置
dir=/root/downloads
#文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用
#disk-cache=0
#另一种Linux文件缓存方式
#enable-mmap=true
#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长
file-allocation=prealloc
- 启动测试
aria2c --conf-path=/etc/aria2/aria2.conf
3)下载otter node并上传至服务器
otter node下载版本:node.deployer-4.2.16.tar.gz
本文以 /home
为例
4)解压缩
mkdir -p /home/otter/node
cd /home
tar zxvf node.deployer-4.2.16.tar.gz -C /home/otter/node
5)配置修改
- nid配置(将前文添加机器后获取到的序号,保存到conf目录下的nid文件)
echo 1 > conf/nid
- otter.properties配置修改
otter.manager.address = 192.168.x.1:1099
6)准备启动
sh /home/otter/node/bin/startup.sh
7)查看日志
vi logs/node/node.log
2019-08-09 14:15:16.886 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
出现上述信息,说明node启动成功
8)验证
访问: http://192.168.x.1:8080/node_list.htm,查看对应的节点状态,如果变为了已启动,代表已经正常启动。
9)关闭
sh stop.sh
(6)otter的安装
1)搭建一个数据库同步任务,源数据库ip为:192.168.x.3,目标数据库ip为:192.168.x.1. 源数据库已开启binlog,并且binlog_format为ROW。
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
2) 数据同步精确到一张表进行测试,测试的表名为test.example,简单包含两个子段。
otter配置官方演示视频
CREATE TABLE `test`.`example` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) COLLATE utf8_bin DEFAULT NULL ,PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into test.example(id,name) values(null,'hello');-----
Otter QuickStart 如何配置一个任务
-----
操作步骤:
1. 添加数据库a. 源库 jdbc:mysql://10.20.144.25:3306b. 目标库 jdbc:mysql://10.20.144.29:3306
2. 添加canala. 提供数据库ip信息
3. 添加同步表信息a. 源数据表 test.exampleb. 目标数据表 test.example
4. 添加channel
5. 添加pipelinea. 选择node节点b. 选择canal
6. 添加同步映射规则a. 定义源表和目标表的同步关系
7. 启动
8. 测试数据
3)配置完成后,手动在源库插入数据,然后快速在目标库进行查看数据,验证数据是否同步成功。
otter:分布式数据库同步系统相关推荐
- 分布式数据库同步系统之Otter
分布式数据库同步系统之Otter Otter概述 Otter安装及配置 Docker安装Otter 安装zookeeper 安装MySQL 创建源数据库 创建目标数据库 创建Otter配置数据库 安装 ...
- 一款低延迟的分布式数据库同步系统--databus
每次看到马路对面摩托罗拉的大牌子,都想起谷歌125亿美元收购摩托罗拉移动,后来又以29亿美元卖给联想的事情.谷歌所做的决策都比较考虑长远利益,在这串交易中,谷歌获得了摩托罗拉最有价值的几千项专利,稳健 ...
- Databus--低延迟的分布式数据库同步系统(Canal类似)
1.简介 Databus是一个低延迟.可靠的.支持事务的.保持一致性的分布式数据库同步系统.它提供可靠的数据捕获.流转和数据处理功能.Databus通过挖掘数据库日志的方式,将数据库变更实时.可靠的从 ...
- 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
项目背景 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter ...
- 001_阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
项目背景 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter ...
- otter,阿里巴巴分布式数据库同步系统
微信公众号:大数据左右手 专注于大数据技术,人工智能和编程语言 个人既可码代码也可以码文字.欢迎转发与关注 otter官网介绍项目背景 otter文档地址 https://github.com/ali ...
- 浅析分布式数据库同步技术理论
[摘 要]如何高效.安全地保持数据库之间数据同步是当前数据库技术研究热点问题.本文对于分布式数据库系统同步传输技术,通过数据库同步机制研究解决了多级数据库信息交换过程中上下级数据库数据不一致问题. ...
- 网易分布式数据库多活架构的演进与实践
本文根据周劲松老师在[deeplus直播第228期]线上分享演讲内容整理而成. 周劲松 网易杭州研究院资深研发工程师 来自网易数据科学中心,目前是网易分布式数据库DDB及网易数据运河NDC项目负责人. ...
- 分布式数据库实战第七节 分布式数据库的现状与未来
24 现状解读:分布式数据库的最新发展情况 你好,恭喜你坚持到了课程的最后一讲. 上一讲,我们探讨了实现数据库中间件的几种技术,包括全局唯一主键.分片策略和跨分片查询,其中最重要的就是分布式事务,希望 ...
最新文章
- SNS 好像遇到了拐点?
- AspectJ切入点语法详解
- gview java_java - 如何在干净模式下运行eclipse? 如果我们这样做会发生什么?
- Redis数据结构以及对应存储策略
- emacs mysql_使用Emacs作为MySQL的客户端
- python中np.reshape与matlab中reshape区别,以及多axis的np.mean分析[探索6]
- OpenAI公布强化学习新算法,可控制复杂机器人
- docker redis 删除集群_基于Docker的Redis集群实践
- python真的是吹过了-别再无脑吹了,python和matleb有什么不同你知道吗?
- 批量创建邮箱通讯组及向通讯组批量添加成员
- 所有子模块都要执行的checkstyle检查
- RestSharp介绍
- 【数值计算】计算机中的数值计算
- hprose php用户手册,04 协程 - 《Hprose for PHP 用户手册》 - 书栈网 · BookStack
- python 爬虫 代理池
- 今有物不知其数三三数之JAVA_今有物不知其数.三三数之剩二.五五数之剩三.七七数之剩二.问物几何? 题目和参考答案——青夏教育精英家教网——...
- HDU5510 Bazinga(KMP)
- Lazy evaluation
- 一些五笔不好打出来的字(转)-留作记念
- java 同时返回两个参数,如何在java中返回两个参数