Otter数据同步:搭建同城双活、异地多活数据中心

一、安装环境
otter所需组件:mysql、jdk、zookeeper、otter、aria2
otter官方地址:https://github.com/alibaba/otter
otter官方文档:https://github.com/alibaba/otter/wiki

本文档使用的组件版本:mysql5.7、jdk1.8.0_77、zookeeper3.6、otter4.2.18、aria2-1.36.0

压测数据:在300M带宽下,同城双活跨机房进行MySQL数据同步,使用Otter同步速度可达10000 tps 1秒内同步

二、安装otter manager
下载地址:https://github.com/alibaba/otter/releases

1.解压

mkdir -p ./otter/manager 
cd ./otter/manager 
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gz 
tar zxvf manager.deployer-4.2.18.tar.gz

2.环境准备
安装zookeeper、jdk8、mysql(支持mysql系列的5.1 ~ 5.6/5.7版本,mariadb 5/10版本)

数据库配置:
1)修改MySQL配置,加入如下配置
vim /etc/my.cnf

#开启bin log模式
log-bin=mysql-bin
binlog_format=row
#如果mysql为多写模式,需要在每个写库配置自增主键的偏移量和步长,避免主键冲突,偏移量和步长根据写库数量做配置
#例如myql双写模式场景下,MySQL-A配置如下
auto-increment-increment=2
auto-increment-offset=1

#MySQL-B配置如下
#auto-increment-increment=2
#auto-increment-offset=2

2)下载数据库初始化sql脚本:

wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql

在mysql中执行该脚本:

source otter-manager-schema.sql

3)创建数据库用户

CREATE USER 'otter'@'%' IDENTIFIED BY 'otter777';     #安装时请修改密码
GRANT ALL ON otter.* TO 'otter'@'%'; 
flush privileges;

3.修改配置
修改conf/otter.properties,修改如下信息:

otter.domainName = 127.0.0.1                                        #otter manager管理后台的域名或访问ip,页面跳转时会用这个值
otter.port = 8080    						                        #otter manager管理后台的访问端口
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://127.0.0.1:3308/otter	    #otter数据库地址
otter.database.driver.username = otter				                #otter数据库账号
otter.database.driver.password = otter777				            #otter数据库密码

otter.communication.manager.port = 1099  				            #otter通讯地址,默认可不改
otter.communication.pool.size = 10             			            #otter通讯连接池,默认可不改

otter.zookeeper.cluster.default = 127.0.0.1:2181			        #zk连接地址

4.启动

./bin/startup.sh

5.查看日志

tail -f ./logs/manager.log

当出现the manager server is running now ......即启动成功

6.验证
访问: http://127.0.0.1:8080/,出现otter的页面,即代表启动成功

点击右上角按钮到登录页面,初始密码:admin/admin

三、安装otter node
otter node下载地址:https://github.com/alibaba/otter/releases

1.解压

mkdir -p ./otter/node 
cd ./otter/node 
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gz 
tar zxvf node.deployer-4.2.18.tar.gz

安装aria2c
node节点进行跨机房传输时,会使用到HTTP多线程传输技术,目前主要依赖了aria2c做为其下载客户端
aria2c下载地址:https://github.com/aria2/aria2/releases
编译安装:

wget https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0.tar.gz 
tar zxvf aria2-1.36.0.tar.gz
cd aria2-1.36.0
./configure 
make 
cd src 
cp aria2c /usr/local/bin

编译完成后,将对应的aria2c包加入到PATH路径即可(node和manager节点都需将编译好的aria2c保存至 /usr/local/bin)

otter node会受otter manager进行管理,所以需要预先安装otter manager
完成manager安装后,需要在manager页面为node定义配置信息,并生一个唯一id

2.配置zookeeper
首先访问manager页面的机器管理页面,点击zookeeper管理,添加一个zookeeper

3.配置Node节点
点击机器管理->Node管理,添加node节点

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

机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid

通过这两部操作,获取到了node节点对应的唯一标示,称之为node id,简称:nid. 记录该nid,后续启动nid时会使用

4.修改配置
将环境准备中添加机器后获取到的序号,保存到conf目录下的nid文件
例如:echo 5 > conf/nid

修改conf/otter.properties,修改如下信息:

otter.manager.address = 127.0.0.1:1099   #修改为otter master地址

5.启动

./bin/startup.sh

6.查看日志

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

当出现the otter server is running now ......即启动成功

7.验证
访问otter manager管理后台,点击机器管理->Node管理,查看对应的节点状态,如果变为了已启动,代表已经正常启动。

四、配置同步规则
配置一个otter同步任务,一般需要进行如下步骤:

1)配置数据源
a. 源库 例:jdbc:mysql://10.20.144.25:3306
b. 目标库 例:jdbc:mysql://10.20.144.26:3306
2)配置数据表
a. 源数据表 例:ehc.*
b. 目标数据表 例:ehc.*
3)配置Canal
a. 源数据库Canal
b. 目标数据表Canal(主从单向同步不需要,双主双向同步需要)
4)配置Channel同步通道
5)配置Pipeline同步管道
a. 选择源库节点和目标库节点(可多节点选择)
b. 选择源库Canal
6)配置同步映射规则
a. 定义源表和目标表的同步关系
7)启动
8)测试

1.配置数据源
访问otter manager管理后台,点击配置管理->数据源配置,点击添加,新增要同步的两个数据库

其中,数据库账号密码需要在mysql中创建一个用于otter写数据的账号,例如:

grant all privileges on *.*  to otter@'%' identified by 'Otter666'; 
flush privileges;

2.配置数据表
访问otter manager管理后台,点击配置管理->数据表配置,点击添加,新增要同步的表

其中数据源为步骤1配置的数据库,schema name为数据库名,table name为同步表名,支持单表、分表和正则等模式,.(.*)代表匹配所有表

3.配置Canal
访问otter manager管理后台,点击配置管理->canal配置,点击添加,新增要同步的canal

其中,数据库地址为canal同步的数据库,数据库账号密码需要在mysql中创建一个用于canal同步的账号,例如:

CREATE USER canal IDENTIFIED BY 'Canal..#2021#'; 
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; flush privileges;

位点信息为canal开始同步的位置,该信息可在mysql中使用如下语句获取:show master status\G;

其中File、Position的值即对应journalName和position的值

其余canal信息可用默认,点击保存即可。

4.配置Channel同步通道

访问otter manager管理后台,点击同步管理,点击添加,新增Channel

输入Channel Name,同步一致性选择:基于当前日志更新,同步模式为:列记录模式,如果是主主双向同步模式,还需要开启数据一致性。

5.配置Pipeline同步管道

在Channel列表,点击刚才创建的Channel名字,进入Pipeline管理列表

点击添加按钮,即可创建同步pipeline。主从单向同步,只需创建一条pipeline,主主双向同步需要创建两条pipeline。

6.配置同步映射规则
在Pipeline列表,点击刚才创建的Pipeline名字,进入映射关系列表

点击添加按钮,添加映射关系

选择源数据表和目标数据表,如果数据表是正则表达式,选择完后点击保存即可。
如果数据表为单表,还可以点击下一步进行更精细化的映射关系,详见:https://github.com/alibaba/otter/wiki/%E6%98%A0%E5%B0%84%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE

7.启动同步
配置完映射规则,回到同步管理主页,点击启用即可开启同步。

8.附注
otter支持以下几种同步方式:

  • 单向同步
    单向同步为最基本的同步方式,目前支持mysql -> mysql/oracle的同步。
  • 双向同步
    双向同步可以理解为两个单向同步的组合,但需要额外处理避免回环同步. 回环同步算法: Otter双向回环控制。同时,因为双向回环控制算法会依赖一些系统表,需要在需要做双向同步的数据库上初始化所需的系统表,具体步骤如下:
    1)获取初始sql:
    wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql
    2)删除otter-system-ddl-mysql.sql步骤2的语句,并为先前创建用于otter数据同步的mysql账号授予retl库的所有权限
    3)在mysql中执行otter-system-ddl-mysql.sql
  • 双A同步
    双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集。
    所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:Otter数据一致性 ,目前开源版本主要是提供了单向回环补救的一致性方案。
    双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:
    1)配置一个channel

2)配置两个pipeline

注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误
3)每个pipeline各自配置canal,定义映射关系

  • 级联同步
    详见:https://github.com/alibaba/otter/wiki/Manager%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D
  • 多A同步
    详见:https://github.com/alibaba/otter/wiki/Manager%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D