分布式数据库同步系统之Otter

  • Otter概述
  • Otter安装及配置
    • Docker安装Otter
    • 安装zookeeper
    • 安装MySQL
      • 创建源数据库
      • 创建目标数据库
      • 创建Otter配置数据库
    • 安装Otter Manager
    • 安装Otter Node
    • 安装Aria2
  • 配置zookeeper与Node
    • 配置zookeeper
    • 配置node
  • 配置同步任务
    • 建库建表
    • 配置数据源
    • 数据表配置
    • 添加canal
    • 添加channel
    • 添加pipeline
    • 添加映射关系表
    • 测试验证

Otter概述

项目地址:https://github.com/alibaba/otter/

名称:otter ['ɒtə(r)]译意: 水獭,数据搬运工语言: 纯java开发定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统

工作原理

说明:

db : 数据源以及需要同步到的库Canal : 获取数据库增量日志,canal支持独立部署和内嵌使用两种模式。otter使用canal的内嵌方法获取数据库增量日志manager : 配置同步规则设置数据源同步源等zookeeper : 协调node进行协调工作node : 负责任务处理,即根据任务配置对数据源进行解析并同步到目标数据库的操作

原理描述:

基于Canal开源产品,获取数据库增量日志数据。典型管理系统架构,manager(web管理)+node(工作节点)a. manager运行时推送同步配置到node节点b. node节点将同步状态反馈到manager上基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作

Otter安装及配置

Docker安装Otter

镜像canal/canal-server包含了otter所依赖的所有组件,如mysql、zookeeper、manager、node,几个组件的互相依赖的配置都已经初始化完成

拉取镜像

docker pull canal/canal-server

启动otter

创建并进入工作目录,使用otter工程自带的run.sh脚本,会处理好host参数、端口映射、目录挂载等工作
[root@administrator otter]# curl -fsSL https://raw.githubusercontent.com/alibaba/otter/master/docker/run.sh | bash docker run -d -it -h 152.25.4.21 --name=otter-all -v /usr/local/program/otter/data/mysql:/var/lib/mysql -v /usr/local/program/otter/data/zkData:/home/admin/zkData --net=host -p 8080:8080 -p 8081:8081 -p 2181:2181 -p 2088:2088 -p 2089:2089 -p 2090:2090 -m 4096m canal/otter-all

云服务器使用Docker安装Otter默认绑定内网IP,导致外网IP无法正常使用,不清楚如何修改,放弃该方式。

安装zookeeper

整个otter架构依赖了zookeeper进行多节点调度,所以需要安装zookeeper,不需要初始化节点,otter程序启动后会自检。 manager需要在otter.properties中指定一个就近的zookeeper集群机器

拉取镜像

docker pull zookeeper

启动容器

docker run -id --name zk -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:latest

查看容器日志

docker logs -f zk

安装MySQL

使用otter进行数据同步时,需要三类数据库

源数据库目标数据库otter配置数据库

创建源数据库

mkdir mysql1# 创建MySQL数据库配置文件目录,数据存放目录
cd mysql1
mkdir conf data# 创建MySQL数据库配置文件
cd conf
vim mysql.cnf[mysql1]
server_id=1
binlog_format=row
log-bin=mysql-bin
character-set-server=utf8
collation-server=utf8_general_ci# 创建并启动MySQL
docker run -id --name mysql1 \
-v $PWD/data:/var/lib/mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

创建目标数据库

mkdir mysql2# 创建MySQL数据库配置文件目录,数据存放目录
cd mysql2
mkdir conf data# 创建MySQL数据库配置文件
cd conf
vim mysql.cnf[mysql2]
server_id=2
binlog_format=row
log-bin=mysql-bin
character-set-server=utf8
collation-server=utf8_general_ci# 创建并启动MySQL
docker run -id --name mysql2 \
-v $PWD/data:/var/lib/mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

创建Otter配置数据库

otter manager依赖于mysql进行配置信息的存储,所以需要安装mysql,并初始化otter manager的系统表结构

mkdir mysql3# 创建MySQL数据库配置文件目录,数据存放目录
cd mysql3
mkdir conf data# 创建MySQL数据库配置文件
cd conf
vim mysql.cnf[mysql3]
server_id=3
binlog_format=row
log-bin=mysql-bin
character-set-server=utf8
collation-server=utf8_general_ci# 创建并启动MySQL
docker run -id --name mysql3 \
-v $PWD/data:/var/lib/mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

创建名为otter的数据库,并创建相应数据表

下载otter数据库文件并在mysql命令行中执行sql脚本进行建表

wget https://github.com/alibaba/otter/blob/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sqlsource /root/otter-manager-schema.sql;

安装Otter Manager

下载managernodehttps://github.com/alibaba/otter/releases

https://ghproxy.com/https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gzhttps://ghproxy.com/https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gz

解压manager

mkdir managertar -zxf manager.deployer-4.2.18.tar.gz -C manager

修改otter manager配置文件

vim ./manager/conf/otter.properties
## otter manager domain name
## 修改Ip
otter.domainName = IP
## otter manager http port
## manager控制台端口
otter.port = 8080
## jetty web config xml
otter.jetty = jetty.xml## otter manager database config
## 修改数据库配置信息
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://IP:3308/otter?autoReconnect=true&useSSL=false
otter.database.driver.username = root
otter.database.driver.password = 123456## otter communication port
## 通信端口
otter.communication.manager.port = 1099## otter communication payload size (default = 8388608)
otter.communication.payload = 8388608## otter communication pool size
otter.communication.pool.size = 10## default zookeeper address
## 修改zookeeper地址
otter.zookeeper.cluster.default = IP:2181
## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000## otter arbitrate connect manager config
otter.manager.address = ${otter.domainName}:${otter.communication.manager.port}## should run in product mode , true/false
otter.manager.productionMode = true## self-monitor enable or disable
otter.manager.monitor.self.enable = true
## self-montir interval , default 120s
otter.manager.monitor.self.interval = 120
## auto-recovery paused enable or disable
otter.manager.monitor.recovery.paused = true
# manager email user config
otter.manager.monitor.email.host = smtp.gmail.com
otter.manager.monitor.email.username =
otter.manager.monitor.email.password =
otter.manager.monitor.email.stmp.port = 465

启动otter manager

./manager/bin/startup.sh

查看日志

tail -60f ./manager/logs/manager.log

访问 IP:8080 默认密码:admin/admin

安装Otter Node

otter node会受otter manager的管理,所以需要先安装otter manager

解压node.deployer-4.2.18.tar.gz到node目录中

tar -zxvf node.deployer-4.2.18.tar.gz  -C node

修改Otter Node配置文件

vim ./node/conf/otter.properties
# otter node root dir
otter.nodeHome = ${user.dir}/../## otter node dir
otter.htdocs.dir = ${otter.nodeHome}/htdocs
otter.download.dir = ${otter.nodeHome}/download
otter.extend.dir= ${otter.nodeHome}/extend## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000## otter communication payload size (default = 8388608)
otter.communication.payload = 8388608## otter communication pool size
otter.communication.pool.size = 10## otter arbitrate & node connect manager config
## 修改Otter Manager的IP与通信端口
otter.manager.address = IP:1099

启动node

./node/bin/startup.sh

查看日志

tail -60f ./node/logs/node/node.log

安装Aria2

node节点进行跨机房传输时,会使用到HTTP多线程传输技术,目前主要依赖了aria2c做为其下载客户端

aria2 官方首页: http://aria2.sourceforge.net/

下载页面: http://sourceforge.net/projects/aria2/files/stable/

注意:下载完成或者编译完成后,将对应的aria2c包加入到PATH路径即可

yum -y install epel-release aria2

查看是否安装成功

[root@administrator ~]# aria2c -v
aria2 版本 1.34.0
Copyright (C) 2006, 2017 Tatsuhiro Tsujikawa

配置zookeeper与Node

配置zookeeper



配置node

在manager页面为node定义配置信息,并生一个唯一id


添加机器

机器名称:可以随意定义,方便自己记忆即可机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群

机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid(这里指序号1)获取到node节点对应的唯一标示,称之为node id,简称:nid. 记录该nid,后续启动nid时会使用

将添加机器后获取到的序号,保存到conf目录下的nid文件,如添加的机器对应序号为1

echo 1 > conf/nid

重启Node

配置同步任务

多种同步方式配置,这里以单向同步为例,更多配置参考官方文档

单向同步
双向同步
双A同步
级联同步
多A同步
自定义数据同步

建库建表

分别在源数据库(mysql1:3306)和目标数据库(mysql2:3307)创建demo数据库,并分别创建test

CREATE TABLE  `test` (`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(id,name) values(null,'hello');

配置数据源



遇到异常1:

抱歉,数据库未通过验证,请检查相关配置!

查看manager日志

Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

修改jdk/jre/lib/security/java.security文件,需要删除掉SSLv3, TLSv1, TLSv1.1然后重启项目

# jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
jdk.tls.disabledAlgorithms= RC4, DES, MD5withRSA, \DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \include jdk.disabled.namedCurves

遇到异常2:

修改数据库编码

character-set-server=utf8
collation-server=utf8_general_ci

数据表配置

添加源数据库表和目标数据库表

添加canal


数据库地址:指源库的ip和端口connectionCharset ==> 获取binlog时指定的编码位点自定义设置 ==> 格式:{“journalName”:"",“position”:0,“timestamp”:0};指定位置:{“journalName”:"",“position”:0};指定时间:{“timestamp”:0};内存存储batch获取模式 ==> MEMSIZE/ITEMSIZE,前者为内存控制,后者为数量控制.  针对MEMSIZE模式的内存大小计算 = 记录数 * 记录单元大小内存存储buffer记录数内存存储buffer记录单元大小心跳SQL配置 ==> 可配置对应心跳SQL,如果配置 是否启用心跳HA,当心跳SQL检测失败后,canal就会自动进行主备切换.

添加channel



同步一致性

基于数据库反查 (简单点说,就是强制反查数据库,从binlog中拿到pk,直接反查对应数据库记录进行同步,回退到几天前binlog进行消费时避免同步老版本的数据时可采用)基于当前日志变更 (基于binlog/redolog解析出来的字段变更值进行同步,不做数据库反查,推荐使用)

同步模式

行模式 (兼容otter3的处理方案,改变记录中的任何一个字段,触发整行记录的数据同步,在目标库执行merge sql)列模式 (基于log中的具体变更字段,按需同步)

特殊组合: (同样支持)

基于数据库反查+列模式
基于当前日志变更+行模式

添加pipeline



延迟时间 = 数据库同步到目标库成功时间 - 数据库源库产生变更时间, 单位秒. (由对应node节点定时推送配置)最后同步时间 = 数据库同步到目标库最近一次的成功时间 (当前同步关注的相关表,同步到目标库的最后一次成功时间)最后位点时间 = 数据binlog消费最后一次更新位点的时间 (和同步时间区别:一个数据库可能存在别的表的变更,不会触发同步时间变更,但会触发位点时间变更)

添加映射关系表




这里提前额外添加了一个age字段,用以测试

测试验证


无法启动,报错如下:

Caused by: com.alibaba.dubbo.remoting.RemotingException: client(url: dubbo://IP:2088/endpoint?acceptEvent.timeout=50000&client=netty&codec=dubbo&connections=30&heartbeat=60000&iothreads=4&lazy=true&payload=8388608&send.reconnect=true&serialization=java&threads=50) failed to connect to server /IP:2088, error message is:connection timed out

解决:

首先云厂商端口已开放,折腾很久,最后发现由于使用了宝塔,被宝塔把端口限制了,开放端口即可。很纳闷有的端口在云厂商那儿开放后无需在宝塔开放端口即可使用。


源数据库添加一条数据:

目标数据库数据同步

分布式数据库同步系统之Otter相关推荐

  1. 一款低延迟的分布式数据库同步系统--databus

    每次看到马路对面摩托罗拉的大牌子,都想起谷歌125亿美元收购摩托罗拉移动,后来又以29亿美元卖给联想的事情.谷歌所做的决策都比较考虑长远利益,在这串交易中,谷歌获得了摩托罗拉最有价值的几千项专利,稳健 ...

  2. Databus--低延迟的分布式数据库同步系统(Canal类似)

    1.简介 Databus是一个低延迟.可靠的.支持事务的.保持一致性的分布式数据库同步系统.它提供可靠的数据捕获.流转和数据处理功能.Databus通过挖掘数据库日志的方式,将数据库变更实时.可靠的从 ...

  3. 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)

    项目背景 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter ...

  4. 001_阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)

    项目背景 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter ...

  5. otter,阿里巴巴分布式数据库同步系统

    微信公众号:大数据左右手 专注于大数据技术,人工智能和编程语言 个人既可码代码也可以码文字.欢迎转发与关注 otter官网介绍项目背景 otter文档地址 https://github.com/ali ...

  6. otter:分布式数据库同步系统

    一.otter介绍 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了 ...

  7. 浅析分布式数据库同步技术理论

    [摘 要]如何高效.安全地保持数据库之间数据同步是当前数据库技术研究热点问题.本文对于分布式数据库系统同步传输技术,通过数据库同步机制研究解决了多级数据库信息交换过程中上下级数据库数据不一致问题.  ...

  8. 网易分布式数据库多活架构的演进与实践

    本文根据周劲松老师在[deeplus直播第228期]线上分享演讲内容整理而成. 周劲松 网易杭州研究院资深研发工程师 来自网易数据科学中心,目前是网易分布式数据库DDB及网易数据运河NDC项目负责人. ...

  9. 分布式数据库实战第七节 分布式数据库的现状与未来

    24 现状解读:分布式数据库的最新发展情况 你好,恭喜你坚持到了课程的最后一讲. 上一讲,我们探讨了实现数据库中间件的几种技术,包括全局唯一主键.分片策略和跨分片查询,其中最重要的就是分布式事务,希望 ...

最新文章

  1. java的数值类型举例_Java基本类型(示例代码)
  2. java如何使用水晶报表_Java操作水晶报表
  3. Intel qsv + ffmpeg 硬解h264
  4. Falsy Bouncer(第二种解决方式)
  5. 软件推荐-有道超级计算器
  6. 转载 Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  7. 字符与字符串操作——Windows via C/C++
  8. gdb调试Python进程
  9. win10ltsc安装后重启提示bitlocker有问题怎么办_原神安装运行问题-原神打不开进不去解决教程...
  10. hbuildx微信开发者工具-微信小程序测试
  11. Drools规则引擎讲解
  12. 搭建Windows red5流媒体服务器详解
  13. 【网络工程师配置篇】华三交换机基本配置大全(文末附下载链接),网络工程师必备手册
  14. 腾讯视频Node.js服务是如何支撑国庆阅兵直播高并发的?
  15. python3.7通过itchat方式登录微信给好友发送天气信息
  16. 计算机二级 word 论文格式,(计算机二级word练习3.doc
  17. 由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题
  18. 2.4G模块NRF24L01调试经验
  19. java手机游戏星际争霸_java Swing实现的星际争霸游戏源码
  20. openwrt修改生成BIN文件大小以用于8M FLASH(WR703N)

热门文章

  1. 开源AI项目-老照片修复之 Bringing Old Photos Back to Life
  2. 非师范生教师资格证最新政策
  3. cmseasy(易通CMS) 注入漏洞 上传漏洞 爆路径ODAY(含修复)
  4. SpringBoot定时任务(@Scheduled)说明
  5. OpenCV学习~moviepy视频裁剪
  6. java 锁旗标_Java基础知识点整理(一)
  7. 敏捷转型行动笔记:内部敏捷教练实践
  8. 微信字号调整问题 html,微信H5适配 解决微信调整字体大小导致Html5页面混乱
  9. 专栏导读(强烈推荐)
  10. before和after怎么区分_before的用法和如何判断其时态,before和after区别