mysql同步之otter/canal环境搭建完整详细版
接上一篇mysql 5.7多源复制(用于生产库多主库合并到一个查询从库)。
这一篇详细介绍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的总体架构
otter强依赖于canal,并对canal的配置有一定的约束。也正是因为强约束,在node中集成了canal,canal作为node的线程运行,使用otter搭建mysql同步环境不需要先手工搭建canal。在开始进入搭建环节之前,建议先看下术语,除非很清楚了,不然相信我,你还是要回过头来看的。
- Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成
- Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成
- DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等
- DataMedia : 抽象的数据介质概念,可以理解为数据表/mq队列定义
- DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia
- ColumnPair : 定义字段映射关系
- ColumnGroup : 定义字段映射组
- Node : 处理同步过程的工作节点,对应一个jvm
他们之间的关系为:
下面进入正题,otter的搭建。
otter搭建
环境准备
从上图和otter文档可知,otter/canal均使用java开发,配置信息存储在mysql中,同步和HA信息在zk中。所以我们需要先安装下列包:
jdk 1.8
mysql 5.7 参考mysql 5.7安装与参数优化
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下载,例如:
下载并分别解压到/usr/local/app/node,/usr/local/app/manager目录,如下:
因为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/
默认情况下,进去的是匿名账户,只有只读查看的权限,登录为管理员才可以有操作权限,管理员账号为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 = 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控制台的机器管理,可以发现机器状态为已启动,如下:
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等如下:
测试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等待等如下:
可以看出后面基本上都在io等待了,一般来说数据库服务器io等待持续到10%之后,系统就很慢了,所以总体来说,如果不做太多的字段重命名、二次处理,otter性能本身还是不错的。
otter高可用
对外开源部分HA这一块基本上没有比较完善的。对于canal连接到db主从切换,可以参考:https://www.cnblogs.com/f-zhao/p/7681960.html,已经讲到位了。如果是半同步模式或者基于GTID的话,没有必要回退60s。
在otter中配置canal的主从切换依赖于groupKey,后面测了会补充。
其他参考
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
mysql同步之otter/canal环境搭建完整详细版的更多相关文章
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十一║Vue实战:开发环境搭建【详细版】
缘起 哈喽大家好,兜兜转转终于来到了Vue实战环节,前边的 6 篇关于Vue基础文章我刚刚简单看了看,感觉写的还是不行呀,不是很系统,所以大家可能看上去比较累,还是得抽时间去润润色,修改修改语句和样式 ...
- ELK环境搭建完整说明
ELK环境搭建完整说明 ELK:ElasticSerach.Logstash.Kibana三款产品名称的首字母集合,用于日志的搜集和搜索.简单地理解为我们可以把服务端的日志(nginx.tomcat等 ...
- 转:testlink 环境搭建(傻瓜版)
testlink 环境搭建(傻瓜版) 2011-11-24 22:23 by 虫师, 12322 阅读, 4 评论, 收藏, 编辑 今天抽了点时间把testlink 环境搭建了一下,一直觉得这东西不怎 ...
- SpringBoot整合Mybatis完整详细版
记得刚接触SpringBoot时,大吃一惊,世界上居然还有这么省事的框架,立马感叹:SpringBoot是世界上最好的框架.哈哈! 当初跟着教程练习搭建了一个框架,传送门:spring boot + ...
- SpringBoot整合Mybatis完整详细版二:注册、登录、拦截器配置
接着上个章节来,上章节搭建好框架,并且测试也在页面取到数据.接下来实现web端,实现前后端交互,在前台进行注册登录以及后端拦截器配置.实现简单的未登录拦截跳转到登录页面 上一节传送门:SpringBo ...
- Java学习路线(完整详细版)
Java学习路线(完整详细版) https://jingyan.baidu.com/article/c1a3101e110864de656deb83.html
- Linux+Apache+Mysql+PHP简单的测试环境搭建
系统版本为:Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x ...
- 写给大忙人的CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南
现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的.经过仔细的分析和研究 ...
- Hibernate环境搭建超详细
前言 环境搭建其实可以简单到导入相关jar包即可. 但是对于学习来说,这个环境搭建的内容还是挺多的,目的是提供一个让我们如何快速学习和掌握类库的学习环境.作为程序猿,学习和使用类库是必须掌握的技能.如 ...
随机推荐
- API 接口自动化测试框架
转自: https://testerhome.com/topics/3455 前言 接口自动化逐渐成为各大公司投入产出最高的测试技术.但是如何在版本迅速迭代过程中提高接口自动化的测试效率,仍然是大部分 ...
- InterProScan 5.25-64.0 安装和使用
InterProScan 5.25-64.0 安装和使用,目前最新版的interproscan 引用自 每日一生信--interproscan安装及使用(终结版)原文官网:http://code.go ...
- java的输入输出
import java.util.Scanner; public class TestScanner { public static void main(String[] args) { Scanne ...
- lsof命令简介
lsof命令简介: lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件 ...
- 在PHP5.3以上版本运行ecshop出现的问题及解决方案
ecshop 问题一:商城首页报错 Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\ ...
- vue中解决跨域问题
方法1.后台更改header header('Access-Control-Allow-Origin:*');//允许所有来源访问 header('Access-Control-Allow-Metho ...
- redhat7.5在H3C机器上黑屏无显
现象:H3C机器上,PXE安装/ISO安装系统,多用户模式启动,过内核启动界面后,屏幕黑屏无显,但是可以通过SSH登陆系统,服务正常 环境:redhat7.5/H3C R4900G3/Purely平台 ...
- 寻路——AI
小球找到目标位置, 必要时候进行跳跃 进行跳跃时,需要在cube上加上 Off Mesh Link 组件,并添加起跳位置和目标位置 在static位置选Navigation static 编写脚本 ...
- hdu5441 并查集+克鲁斯卡尔算法
这题计算 一张图上 能走的 点对有多少个 对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...
- jQuery筛选--first()和last()
first() 概述 获取匹配的第一个元素 last() 概述 获取匹配的最后个元素 <!DOCTYPE html> <html> <head> < ...