博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql主从canal_mysql同步之otter/canal环境搭建完整详细版
阅读量:6620 次
发布时间:2019-06-25

本文共 8468 字,大约阅读时间需要 28 分钟。

这一篇详细介绍otter/canal环境搭建以及当同步出现异常时如何排查。本文主要参考https://blog.csdn.net/wudufeng/article/details/78688240搭建,出现异常时,主要参考了otter的官方文档,时候阅读官方文档的时候,发现大家还是可以直接参考官方文档吧,本文和https://blog.csdn.net/wudufeng/article/details/78688240基本上下列几个官方文档的整合。只不过文本会包含一些额外的阐述和解释以便更好的理解上下文。

总的来说,搭建DEMO式可用的otter环境很简单,关键在于HA和异常时如何让他快速恢复、压测时的延时如何尽可能短,TPS尽可能高。

https://github.com/alibaba/otter/wiki/Introduction

https://github.com/alibaba/otter/wiki/Manager_Quickstart

https://github.com/alibaba/otter/wiki/Node_Quickstart

https://github.com/alibaba/otter/wiki/Adminguide

https://github.com/alibaba/otter/wiki/Manager%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D

https://github.com/alibaba/otter/wiki/Manager%E4%BD%BF%E7%94%A8%E4%BB%8B%E7%BB%8D

https://github.com/alibaba/otter/wiki/%E6%98%A0%E5%B0%84%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE

https://blog.csdn.net/wudufeng/article/details/78688240

https://github.com/alibaba/otter/wiki/%E6%98%A0%E5%B0%84%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE(对于自定义扩展来说,这个文档是重点)

https://github.com/alibaba/otter/wiki/Otter%E6%89%A9%E5%B1%95%E6%80%A7

https://github.com/alibaba/otter/wiki/Otter%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7

otter的总体架构

7cf620f00e311ed4ff1959cd3057be97.png

otter强依赖于canal,并对canal的配置有一定的约束。也正是因为强约束,在node中集成了canal,canal作为node的线程运行,使用otter搭建mysql同步环境不需要先手工搭建canal。在开始进入搭建环节之前,建议先看下术语,除非很清楚了,不然相信我,你还是要回过头来看的。

Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成

Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成

DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等

DataMedia : 抽象的数据介质概念,可以理解为数据表/mq队列定义

DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia

ColumnPair : 定义字段映射关系

ColumnGroup : 定义字段映射组

Node : 处理同步过程的工作节点,对应一个jvm

他们之间的关系为:

dc99153afdfb62101ee7738a188c6b36.png

下面进入正题,otter的搭建。

otter搭建

环境准备

从上图和otter文档可知,otter/canal均使用java开发,配置信息存储在mysql中,同步和HA信息在zk中。所以我们需要先安装下列包:

jdk 1.8

zk 3.4.x 参考https://zookeeper.apache.org/doc/r3.4.12/zookeeperStarted.html

aria2。yum install aria2   ## aria2(官网) 是一款开源、轻量级的多协议命令行下载工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 协议,拥有众多第三方支持插件,被誉为「下一代下载工具」和「下载神器」,然而由于安装配置复杂,挡住了许多人的使用。参考http://blog.sina.com.cn/s/blog_6bf2cd8a0102x3w2.html

otter的安装包以及脚本:

从https://github.com/alibaba/otter/releases下载,例如:

ec11e1792768be7d21602af874804a24.png

下载并分别解压到/usr/local/app/node,/usr/local/app/manager目录,如下:

a738bdfc886c8c762ce2f8ed3e93eb0d.png

因为otter的配置信息存储在mysql中,所有还有一个初始化脚本:

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

otter一共包含两个部分,manager(作为otter的配置中心和管理控制台应用)和node(作为otter的实际同步工作节点)。

网上和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 = 172.28.1.97 ## 建议改成所在服务器的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://127.0.0.1:3308/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 = 127.0.0.1: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/app/manager/bin

./startup.sh

查看日志

tail -fn 100 ../logs/manager.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 14:59:49.002 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## start the manager server.

2018-07-03 14:59:57.420 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!

2018-07-03 14:59:57.420 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......

接下去就可以验证manager了。

用浏览器打开http://172.18.1.97:8088/

2bb0d9a6da52bea5c54b12f3bb613a4a.png

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

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

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

zk配置

d577fa13c1a4957555108332994762e2.png

4a84d09bede698e274276b67f0cb8ef4.png

node配置

60aa5e13d3dbae23dc6bcd778ac18093.png

024d22f844e0fa1f0371b8cb29f52f4d.png

端口建议不要修改。

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

249d18f53bc749e133292fa8da135628.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 = 127.0.0.1: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控制台的机器管理,可以发现机器状态为已启动,如下:

26eb2dc1945cb0dac755832efc3d09ae.png

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

同步任务配置

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

1、添加canal

804cbafbfe8814b254d231e0e3013b48.png

532780ab30f23d7273636bd1fc1679a3.png

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

b26dd89e5305ac71a22d74f5e9f83c1b.png

2、添加数据源

设置主库和从库的数据源

2dd27c3625d9573078aff921abe6a2e0.png

49809026362df52c89aa9389f634260c.png

3、添加同步表

ed667ee70152a78e42ef59337c035bbb.png

a31a892211642651801b798713cc1178.png

4、添加channel

4545f74c7a6fb7c52005716893fedb6e.png

5、添加pipeline

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

6、添加映射关系

bd28c93e6c461f5e936bc5cc7ea15cc1.png

ce3abc328ff6f1171ef9bf7faa0cf930.png

7、启动同步

f38ebe0bb9d5e91f6c70c0dc28ceab2e.png

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

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

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

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

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

ff5797169cb4d79057f6cc472b248071.png

7b954514cc4a11c0964673b6afcfdd30.png

dd1c6be87d266853be58aa2d48fafe5a.png

25d4d3fd437a0b65b651a10e5ebb3f61.png

4eb9ecae76ca08455ef68ada9648ec82.png

测试2000w条插入

mysqlslap --defaults-file="/etc/my.cnf.57" --concurrency=100 --iterations=1 --create-schema=otter_test --query="insert into otter_test_table1 values(FLOOR(1000000 + (RAND() * 100000000)),'namefwei8388dfe88827d7f8fjfjweifiwewifeweuwewuweuewuweuuusyfyeywewew23') ON DUPLICATE KEY UPDATE name='wifeufwuwwu'" --number-of-queries=20000000 -uroot -p123456 -P3307 -h127.0.0.1

延迟、tps、cpu、io等待等如下:

03f419f0b5af4f2f64c4aa13a1b3c720.png

fd200265e817ec63d9f29f1852d79875.png

d347f2940c2d006dc7d7701659da75a8.png

0a0610f9c3fd1d4eb2fd00eb608261ad.png

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

otter高可用

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

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

ac3eb9b5be07a210da97ae8dfc20a8b7.png

其他参考

https://wenku.baidu.com/view/930a5723227916888586d70b.html

https://github.com/alibaba/otter/wiki/Faq

https://my.oschina.net/dxqr/blog/524795

http://shift-alt-ctrl.iteye.com/blog/2399603

你可能感兴趣的文章
JSP与JavaBeans
查看>>
解决Android中TextView首行缩进的问题
查看>>
oracle 查询哪些表分区
查看>>
SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
查看>>
Ubuntu启动sshd服务
查看>>
Java排序算法(三):直接插入排序
查看>>
推断图片格式
查看>>
JVM知识
查看>>
Python 列表 min() 方法
查看>>
C语言中 Float 数据结构的存储计算
查看>>
Linux系统监控命令详解
查看>>
HSF源码阅读
查看>>
1.Flask URL和视图
查看>>
【死磕jeesite源码】Jeesite配置定时任务
查看>>
MFC更换窗口图标
查看>>
[三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类
查看>>
Java 读取某个目录下所有文件、文件夹
查看>>
携程ELK
查看>>
朱晔和你聊Spring系列S1E2:SpringBoot并不神秘
查看>>
关于Java中的注释语句的对Java代码的影响
查看>>