重要说明:需要同步的表必须要有主键 主键 主键
otter是一款基于Java且免费、开源基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库的解决方案。
Otter目前支持了什么
1. 单向同步, mysql/oracle互相同步
2. 双向同步,无冲突变更
3. 文件同步,本地/aranda文件
4. 双A同步,冲突检测&冲突补救
5. 数据迁移,中间表/行记录同步
实际测试中,otter的同步速度相比于mysql的复制,约有5倍左右的性能提升,这取决于其同步算法的实现. 抛弃了强一致性,得到了性能提升。
原理描述
基于Canal开源产品,获取数据库增量日志数据。
典型管理系统架构,manager(web管理)+node(工作节点)
manager运行时推送同步配置到node节点
node节点将同步状态反馈到manager上
基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
工作流程:otter基于zookeeper解决分布式状态调度,由manager(web管理)和node(工作节点)组成。manager运行时推送同步配置到node节点上,node节点将同步状态反馈到manger上。
环境
Ip
操作系统
Mysql
Manager节点
Node节点
192.168.140.24
CenteOS 7.5.1804
Mysql5.7.26
是
是
192.168.140.136
CenteOS 7.5.1804
Mysql5.7.26
否
是
目标:
实现192.168.140.136到192.168.140.24的单向数据同步。
名词解释
Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成
Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成
DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等
DataMedia : 抽象的数据介质概念,可以理解为数据表/mq队列定义
DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia
ColumnPair : 定义字段映射关系
ColumnGroup : 定义字段映射组
Node : 处理同步过程的工作节点,对应一个jvm
otter搭建
环境准备
[root@db192168140024 ~]# yum install java-1.8.0-openjdk-devel.x86_64
[root@db192168140024 ~]# yum install nc
[root@db192168140024software]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
[root@db192168140024 software]# tar -zxvf zookeeper-3.4.14.tar.gz
[root@db192168140024 software]# mv zookeeper-3.4.14 /usr/local/zookeeper
[root@db192168140024 software]# cd /usr/local/zookeeper/conf
[root@db192168140024 conf]# cp zoo_sample.cfg zoo.cfg
[root@db192168140024 conf]# cd ../bin
[root@db192168140024 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@db192168140024 bin]# yum install *aria2*
aria2 是一款开源、轻量级的多协议命令行下载工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 协议,拥有众多第三方支持插件,被誉为「下一代下载工具」和「下载神器」
otter的安装包以及脚本:
从https://github.com/alibaba/otter/releases下载,例如:
192.168.140.24
下载并分别解压到/usr/local/otter_node,/usr/local/otter_manager目录,如下:
192.168.140.136
下载node节点node.deployer-4.2.14.tar.gz 并解压到/usr/local/otter_node
192.168.140.24
因为otter的配置信息存储在mysql中,所有还有一个初始化脚本:
https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
网上和otter文档均提及需要先安装manager,我仔细看了下,是因为manager是被动连接的(很多应用的管理控制台是主动去连接服务的,otter则把所有的配置都存储在了manager中),node启动的时候会连接到manager获取同步相关的信息。生成nid这一步倒没什么关系,事后不一致修改也可以。
manager配置
首先在计划保存otter配置信息的mysql数据库执行otter-manager-schema.sql脚本。
manager的配置文件主要是manager/conf/otter.properties,如下所示(下面列出了建议和需要修改的):
[root@v-03-01-00223 conf]# cat otter.properties
## otter manager domain name
otter.domainName = 192.168.140.24 ## 建议改成所在服务器的ip,而不是默认的127.0.0.1,否则到时候启动的时候所有的连接指向的目标都是localhost,因为通常otter跑在linux环境,很多linux环境是没有图形化界面的,感觉这是个bug
## otter manager http port
otter.port = 8088 ## 如果非专用或者已经有了一些web应用在同一台服务器,建议改成其他的避免端口冲突,这里的端口号要和jetty.xml中的保持一致,这里也是,直接用个非8080端口就更友好了,比如weblogic 控制台7001,es控制台9200,rabbitmq控制台15672
## 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://192.168.160.24:3306/otter ## otter配置信息维护的数据库地址,库名一般为otter/otter_manager/manager
otter.database.driver.username = root
otter.database.driver.password = 123456
## otter communication port
otter.communication.manager.port = 1099 ## node和manager通信的接口,一般不用修改
## otter communication pool size
otter.communication.pool.size = 10
## default zookeeper address
otter.zookeeper.cluster.default =192.168.160.24:2181 ## zk地址
## 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
上述配置修改之后,就可以启动manager了。
[root@v-03-01-00223 bin]# pwd
/usr/local/otter_manager/bin
./startup.sh
查看日志
tail -fn 100 ../logs/manager.log
2019-09-11 09:24:55.223 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
2019-09-11 09:24:55.223 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
Wed Sep 11 09:26:58 CST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
接下去就可以验证manager了。
用浏览器打开http://192.168.160.24:8088/
默认情况下,进去的是匿名账户,只有只读查看的权限,登录为管理员才可以有操作权限,管理员账号为admin/admin(otter自带)。
注:默认情况下是没有channel的,因为笔者的环境已经配置了在单向同步的,所以有显示一个channel。
manager启动之后,需要配置使用的zk、canal、node等地址、端口等信息。
zk配置
node配置
端口建议不要修改。
机器添加完成以后,机器管理的列表中第一列就是nid(这个就是到时候要保存到node/conf/nix文件中的值),如下:
上述三种类型的节点配置完成后,manager前期的配置就完成了。
manager配置完成之后,需要先启动相应的node节点,node节点启动之后,就可以配置真正的同步任务了。
node配置
首先cd NODE_HOME/conf
echo 1 > nid
node配置文件otter.properties(可以默认,不用做任何修改)如下:
[root@v-03-01-00223 conf]# cat 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 pool size
otter.communication.pool.size = 10
## otter arbitrate & node connect manager config
otter.manager.address = 192.168.140.24:1099
启动node
cd NODE_HOME/bin
./startup.sh
[root@v-03-01-00223 node]# more node.log
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=96m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
2018-07-03 15:13:09.364 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
此时再查看manager控制台的机器管理,可以发现机器状态为已启动,如下:
manager/node都启动之后,就可以真正开始配置同步任务了。
同步任务配置
分为下列几个步骤(不熟悉术语概念的建议回到页首重新review下):
1、添加canal
点位可以通过在主库执行show master status和select unix_timestamp()得到。
2、添加数据源
设置主库和从库的数据源
3、添加同步表
4、添加channel
5、添加pipeline
pipeline里面主要选择节点和canal。
6、添加映射关系
7、启动同步
注意:默认会同步ddl,对于分库分表同步到从库的时候,建议不要同步ddl以及跳过ddl。
插入数据试试看吧。。。。
otter同步异常问题排查与监控
笔者一开始启动后,确实报错了,如下:
TODO,等后续梳理确保都可重复执行之后,再补充。
otter简单性能测试
创建了一个简单的表使用mysqlslap进行测试。
注:我们因为环境受限,zk、manager、node、mysql主从均在一台服务器上,配置为16c/8GB阿里云服务器,无swap。
CREATE TABLE `otter_test_table1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
测试100w条插入
mysqlslap --defaults-file="/etc/my.cnf.57" --concurrency=50 --iterations=1 --create-schema=otter_test --query="insert into otter_test_table1 values(FLOOR(0 + (RAND() * 10000000)),'name93923') ON DUPLICATE KEY UPDATE name='wifeufwuwwu'" --number-of-queries=1000000 -uroot -p123456 -P3307 -h127.0.0.1
延迟、tps等如下:
可以看出后面基本上都在io等待了,一般来说数据库服务器io等待持续到10%之后,系统就很慢了,所以总体来说,如果不做太多的字段重命名、二次处理,otter性能本身还是不错的。
otter高可用
对外开源部分HA这一块基本上没有比较完善的。对于canal连接到db主从切换,可以参考:https://www.cnblogs.com/f-zhao/p/7681960.html,已经讲到位了。如果是半同步模式或者基于GTID的话,没有必要回退60s。
在otter中配置canal的主从切换依赖于groupKey,后面测了会补充。