重要说明:需要同步的表必须要有主键 主键 主键

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,后面测了会补充。

mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)相关推荐

  1. mysql插入多行数据来自另一张表_mysql从一张表查询批量数据并插入到另一表中的完整实例...

    说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最 ...

  2. mysql子查询存到另一张表_MySQL多表查询与子查询

    多表查询 多表查询实际上根据查询要求先将两个表连接起来,形成一张新表,再在新表中查询出满足条件的记录多表查询可分为连接查询和子查询. 一. 连接查询(可分为外连接和内连接)关于外链接的几点说明: A. ...

  3. mysql查询当天最新的一张表_mysql 查询当天、本周,本月,上一个月的数据

    本篇文章内容为网上收集内容 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE T ...

  4. SqlServer:绑定一张表中的某列数据到另一张表中的某列数据

    利用表b中的某列数据去更新表a中的某列数据,a与b中cc字段为关联字段 update a set a.xxx=(select b.xxx from b where a.cc=b.cc) 例如: upd ...

  5. mysql子查询存到另一张表_MySQL数据库(11)----使用子查询实现多表查询

    子查询指的是用括号括起来,并嵌入另一条语句里的那条 SELECT 语句.下面有一个示例,它实现的是找出与考试类别('T')相对应的所有考试事件行的 ID,然后利用它们来查找那些考试的成绩: SELEC ...

  6. java项目大概多少张表,要把数据插入到多张表?该如何处理

    当前位置:我的异常网» Java Web开发 » 要把数据插入到多张表?该如何处理 要把数据插入到多张表?该如何处理 www.myexceptions.net  网友分享于:2013-01-27  浏 ...

  7. mysql 把表的值用来计算_mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

  8. 一个mysql可以存多少数据类型_mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

  9. 关于mysql一张表到底能存多少数据?

    前言 程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互, ...

最新文章

  1. 大牛程序员分享 Python基础学习笔记
  2. java 文件路径表达式_Java基础(二十二) Lambda表达式和File类
  3. linux——shell 中常用的控制语句 for、while、if、case、expect、exit、break、continue
  4. c++/cli之我见
  5. windows 64 搭建RabbitMQ环境
  6. 如何用U盘安装Ubuntu操作系统
  7. 能提升自己能力的几个经典项目
  8. 卓豪发布IT大数据分析平台,整合ITSM系统
  9. 修改win10 小娜Cortana 默认搜索浏览器(chrome)和搜索引擎
  10. JAVA毕设项目微博系统网站(java+VUE+Mybatis+Maven+Mysql)
  11. Windows防火墙与TCP、UDP
  12. 这些操作系统的概念,保你没听过!
  13. 几何学的公理化:塔尔斯基 pk 希尔伯特,谁能取胜?
  14. php历法,Atitit.基于时间戳的农历日历历法日期计算
  15. 移动互联时代测试工具,互动视频
  16. TensorFlow识别图片数字
  17. 数据结构-线性表(链式存储结构)
  18. mPaaS iOS框架笔记1-mPaaS APMobileFramework (以MPH5Demo_plugin为例)
  19. yolov7 网络架构深度解析
  20. BT下载工具——bitstormlite

热门文章

  1. red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6
  2. 倒计时小工具_送你3个倒数计日的小程序,让你不再遗忘重要事
  3. file数组 删除文件_java编程IO基础之一:File类
  4. python萤火虫算法_FA:萤火虫算法的测试及Python实现
  5. springboot jpa sql打印_SpringBoot集成Spring Data JPA以及读写分离
  6. linux下mysql5.7修改密码
  7. python3 week4
  8. 构建测试的体系化思维(基础篇)
  9. Hadoop集群(一) Zookeeper搭建
  10. centos 静态拨号