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

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

otter是一款基于Java且免费、开源基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库的解决方案。

c7ebef365affa13578cf78a4f9aa9f00.png

Otter目前支持了什么

1. 单向同步, mysql/oracle互相同步

2. 双向同步,无冲突变更

3. 文件同步,本地/aranda文件

4. 双A同步,冲突检测&冲突补救

5. 数据迁移,中间表/行记录同步

实际测试中,otter的同步速度相比于mysql的复制,约有5倍左右的性能提升,这取决于其同步算法的实现. 抛弃了强一致性,得到了性能提升。

原理描述

基于Canal开源产品,获取数据库增量日志数据。

典型管理系统架构,manager(web管理)+node(工作节点)

manager运行时推送同步配置到node节点

node节点将同步状态反馈到manager上

基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.

5f7a478925419998f85d2bf073ccd197.png

工作流程:otter基于zookeeper解决分布式状态调度,由manager(web管理)和node(工作节点)组成。manager运行时推送同步配置到node节点上,node节点将同步状态反馈到manger上。

192f74b034db43540a2af7dd23dd392f.png

环境

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下载,例如:

f3ed84cba211e2346f21b4c6e55af333.png

192.168.140.24

下载并分别解压到/usr/local/otter_node,/usr/local/otter_manager目录,如下:

6e28398100074957f81baa178623be7d.png

192.168.140.136

下载node节点node.deployer-4.2.14.tar.gz 并解压到/usr/local/otter_node

caa087f5cbe410ec7a2caf4423dc50c9.png

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/

80935c57c1c60010c358d153f4e28d7b.png

默认情况下,进去的是匿名账户,只有只读查看的权限,登录为管理员才可以有操作权限,管理员账号为admin/admin(otter自带)。

注:默认情况下是没有channel的,因为笔者的环境已经配置了在单向同步的,所以有显示一个channel。

manager启动之后,需要配置使用的zk、canal、node等地址、端口等信息。

zk配置

94b69c69fef440a3cafb61c688436b51.png
ba06385437db5a580c969c6a3e79c5ee.png

node配置

193ad87aa5b783f37eb3993b8aba686a.png
a130f762136138f2846371aec4001795.png

端口建议不要修改。

机器添加完成以后,机器管理的列表中第一列就是nid(这个就是到时候要保存到node/conf/nix文件中的值),如下:

b03938280ccb7f8c17d3b28aabc3d282.png

上述三种类型的节点配置完成后,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控制台的机器管理,可以发现机器状态为已启动,如下:

273c0a43c7b07a9ecac185b4ce7c8543.png

manager/node都启动之后,就可以真正开始配置同步任务了。

同步任务配置

分为下列几个步骤(不熟悉术语概念的建议回到页首重新review下):

1、添加canal

c70ca298ae9fe29c0a79ceb08c3cb4cb.png
58501833fe52ecd9241ac0564868fd8f.png

点位可以通过在主库执行show master status和select unix_timestamp()得到。

2、添加数据源

设置主库和从库的数据源

27cb138ed2a971ba9bc9f1710ed84880.png
83330988b7074afcf4e76b4c61c5193e.png

3、添加同步表

881a39b5161cb73545671584b3507a03.png
e082e09f0f804e88f6b9209818f964a6.png

4、添加channel

cfba1fc88dce7645b70c21709c9cb313.png

5、添加pipeline

pipeline里面主要选择节点和canal。

6、添加映射关系

779d6ba31373c2879cd269069dd788a5.png
25ed0c9ebfa23acff8e7b86fa04515f5.png

7、启动同步

7f02f53433b3e54e74c4478cab6644f4.png

注意:默认会同步ddl,对于分库分表同步到从库的时候,建议不要同步ddl以及跳过ddl。

插入数据试试看吧。。。。

otter同步异常问题排查与监控

笔者一开始启动后,确实报错了,如下:

ce317f894eb4cfc5637bfa6c456c294a.png

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等如下:

a623cd3e0c833b6eec258c705a28ff45.png
3f6c99f705dd3d60eddf7b5ccb33c82e.png

可以看出后面基本上都在io等待了,一般来说数据库服务器io等待持续到10%之后,系统就很慢了,所以总体来说,如果不做太多的字段重命名、二次处理,otter性能本身还是不错的。

otter高可用

对外开源部分HA这一块基本上没有比较完善的。对于canal连接到db主从切换,可以参考:https://www.cnblogs.com/f-zhao/p/7681960.html,已经讲到位了。如果是半同步模式或者基于GTID的话,没有必要回退60s。

在otter中配置canal的主从切换依赖于groupKey,后面测了会补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04day1

无穷的数列 找规律 【问题描述】 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字。 【输入】 第一行一个正整数 N,表示询问次数;接下来的 N 行每行一个正整数 Ai,Ai 表示在序列中的位置。 …

【转】Eclipse+CDT+Gcc编译选项控制

原文地址:http://www.oschina.net/question/4873_19441 如果我们的程序调用动态链接库,当在cdt中运行的时候,可以通过run-->enviroment-->添加LD_LIBRARY_PATH 环境变量来设置查找动态链接库文件的路径。但是在运行的时候,程…

apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境

学习网络开发过程中不想“污染”macOS,考虑到之后部署网络应用主要是与linux打交道,所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机,一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习&#xff0…

float去掉小数点之后_float类型的存储方式

在c语言中float函数是单精度的。它在内存中以二进制的形式存储。分为符号位,阶码与尾数三部分。 符号位最为简单,如果你存储的是正数那么符号数就是0。如果是负数,则为1。下面,我以13.625为例说明阶码与尾数的表示方法。首先&…

idea 2020.2 如何设置classpath_开发属于自己的第一款IDEA插件!

作者:木杉 http://imushan.com/写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件。要…

按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者: Yura不说数据说 ,PYuraLPS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.c…

c++获取当前时间戳_python开发:python时间模块的使用

前言:今天元宵节,祝福大家元宵节快乐。今天在元宵节给各位朋友分享一下python时间模块。我们在开发中经常会与时间打交道,如:获取事件戳,时间戳的格式化等,这里简要记录一下python操作时间的方法。ython中常…

python 获取向上两级路径_Python学习第171课--相对路径和绝对路径

【每天几分钟,从零入门python编程的世界!】这节我们补充2个概念:相对路径和绝对路径。●绝对路径就像一棵大树一样,从它的根开始,往上会有大的枝干,在大的枝干上面又会有小一点的树枝,小树枝上面…

百度热力图颜色说明_大数据下的龙港、鳌江人口热力图

大数据下的龙港、鳌江人口热力图--趋势显示,人口逐步集中于区域中心地区与城市 2020-08-25 大数据(big data),是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据有五大特点,即大量(Volume)、高速(Velocity)…

python语言的单行注释以井号开头_【学习】Python语言入门

Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 语法 Python中没有强制的语句终止字符,且代码块是通过缩进来指示的。缩进表示一个代码…

python 参数个数 同名函数_Python——函数的参数

函数的参数定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,…

webview的

问题描述我给WEBVIEW加了等待的圆圈,怎么不起作用?布局文件:<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:lay…

java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

final关键字&#xff1a; final表示最终的不可变的&#xff0c;在java中可以用来修饰类或方法、局部变量、成员变量。 // 1.final关键字修饰类需要放在class关键字前面&#xff0c;表示不可变的类&#xff0c;需要注意&#xff0c;这里表示当前类不能有子类&#xff0c;但是有…

python安装后无法使用_Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)...

在终端通过pip装好包以后&#xff0c;在pycharm中导入包时&#xff0c;依然会报错。新手不知道具体原因是什么&#xff0c;我把我的解决过程发出来&#xff0c;主要原因就是pip把包安装到了“解释器1”&#xff0c;但我们项目使用的是“解释器2”。我们新手怕字多&#xff0c;所…

03-sizeof的用法

1、作用 sizeof运算符是C语言特有的运算符。 用来计算一个变量或者一个常量、一种数据类型在内存中所占的字节数。 2、基本形式 (1) sizeof (变量或常量) (2) sizeof 变量或常量 (3) sizeof(数据类型) (4) 不能是sizeof 数据类型, 即计算数据类型的字节数必须用小括号括起来 实…

【Python3】POP3协议收邮件

初学Python3&#xff0c;做一个email的例子&#xff0c;虽然知道做的很渣渣&#xff0c;还是分享一下吧POP3协议POP3全称Post Official Protocol3&#xff0c;即邮局协议的第三个版本&#xff0c;它规定了怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议&…

发红包案例(RedPacketFrame简介)

发红包案例&#xff1a; 案例目录结构如下&#xff08;red包为第三方包&#xff0c;需要的话可以到网上自行下载或私信我邮箱即可&#xff09;&#xff1a; // 1.这里将借用发红包的框架&#xff1a;RedPacketFrame&#xff08;图形界面化&#xff09;&#xff0c;OpenMode处…

easy connect 获取服务端配置信息失败_如何统计 Mysql 服务器状态信息?

最近在看《高性能的 Mysql》一书&#xff0c;下面是关于如何学习统计 Mysql 服务器状态的学习总结&#xff0c;主要是学习使用 SHOW STATUS&#xff0c;SHOW ENGINE INNODB STATUS&#xff0c;SHOW PROCESSLIST&#xff0c;SHOW PROFILE 四个命令。命令一&#xff1a;SHOW STAT…

实现线段切割法_切割晶圆及玻璃产品的现代技术与设备

作者&#xff1a;韩卓申科VS1,2&#xff0c;伊凡诺夫VI3&#xff0c;吕鸿图2,4&#xff0c;纳乌莫夫A S2,4&#xff0c;王薇媛4摘要&#xff1a;由于需以各种非金属半导体材料晶圆制造使用价值低之微电子产品&#xff0c;对其加工高精度及品质改善的要求更为严苛&#xff0c;因…