Otter 安装部署维护
作者:互联网
介绍
- 淘宝开源的产品,基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库,一个分布式数据库同步系统。
目前同步规模: 同步数据量6亿 文件同步1.5TB(2000w张图片) 涉及200+个数据库实例之间的同步 80+台机器的集群规模
工作原理
原理描述:
1.基于Canal开源产品,获取数据库增量日志数据。
2. 典型管理系统架构,manager(web管理)+node(工作节点)
a. manager运行时推送同步配置到node节点
b. node节点将同步状态反馈到manager上
3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作. 相关名词解释: Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成
Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成
DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等 DataMedia :
抽象的数据介质概念,可以理解为数据表/mq队列定义 DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia
ColumnPair : 定义字段映射关系 ColumnGroup : 定义字段映射组 Node :
处理同步过程的工作节点,对应一个jvm
**
安装部署
**
环境准备
操作系统:Red Hat Enterprise Linux Server release 6.4
A机器:192.168.56.101
B机器:192.168.56.102
C机器:192.168.56.103
Jdk===>大于1.6.25以上版本,本次安装使用版本为jdk-8u91-linux-x64.tar.gz
Manager下载地址:
wget https://github.com/alibaba/otter/releases/download/otter-4.2.13/manager.deployer-4.2.13.tar.gz
node下载地址:
wget https://github.com/alibaba/otter/releases/download/otter-4.2.13/node.deployer-4.2.13.tar.gz
node节点进行跨机房传输时,会使用到HTTP多线程传输技术,目前主要依赖了aria2c做为其下载客户端,因此需下载aria2c,下载地址:
http://sourceforge.net/projects/aria2/files/stable/
zookeeper下载地址:
wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
otter数据库初始化脚本:
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
安装
安装otter数据库,具体参照mysql安装文档,安装完毕后,执行初始化脚本
A、B机器安装mysql数据库,A机器执行otter初始化脚本
source otter-manager-schema.sql
安装JDK并配置环境变量
A、B、C三台机器
mv jdk-8u91-linux-x64.tar.gz /usr/local/src/
tar -zxf jdk-8u91-linux-x64.tar.gz
chown root:root jdk1.8.0_91/ -R
/etc/profile增加以下配置
export JAVA_HOME=/usr/local/src/jdk1.8.0_91
export JRE_HOME=/usr/local/src/jdk1.8.0_91/jre
export PATH=$PATH:/usr/local/src/jdk1.8.0_91/bin
export CLASSPATH=./:/usr/local/src/jdk1.8.0_91/lib:/usr/local/java/jdk1.8.0_91/jre/lib
安装zookeeper
C机器安装zookeeper
tar -zxf zookeeper-3.4.6.tar.gz
chown root:root zookeeper-3.4.6 –R
mkdir /hadoop/{hadoop1,hadoop2,hadoop3} –p
cd hadoop/
mkdir hadoop1/config –p
mkdir hadoop2/config –p
mkdir hadoop3/config –p
mkdir tmp/zk1/{data,log} –p
mkdir tmp/zk2/{data,log} –p
mkdir tmp/zk3/{data,log} –p
vim hadoop1/config/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/hadoop/tmp/zk1/data
dataLogDir=/hadoop/tmp/zk1/log
clientPort=2181
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
cp -r hadoop1/config/zoo.cfg hadoop2/config/
修改对应目录地址
cat hadoop2/config/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/hadoop/tmp/zk2/data
dataLogDir=/hadoop/tmp/zk2/log
clientPort=2182
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
cat hadoop3/config/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/hadoop/tmp/zk3/data
dataLogDir=/hadoop/tmp/zk3/log
clientPort=2183
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
echo 1 > tmp/zk1/data/myid
echo 2> tmp/zk2ata/myid
echo 3> tmp/zk3data/myid
启动zookeeper
./zkServer.sh start
JMX enabled by default
Using config: /soft/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
测试连接
./zkCli.sh
Connecting to localhost:2181
[zk: localhost:2181(CONNECTED) 0]
当出现如上提示说明zookeeper连接正常
安装manager
mkdir /soft/manager –p
tar -zxf manager.deployer-4.2.13.tar.gz -C /soft/manager
cd manager/conf
编辑配置文件:
vim otter.properties
##otter manager domain name
otter.domainName = 192.168.56.101
##otter manager http port
otter.port = 8080
##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://localhost:3306/otter
otter.database.driver.username = root
otter.database.driver.password = password
##otter communication port
otter.communication.manager.port = 1099
##otter communication pool size
otter.communication.pool.size = 10
##default zookeeper address
otter.zookeeper.cluster.default = 192.168.53.103:2181
##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
/soft/manager/bin/startup.sh
查看日志,出现以下日志表示manager启动成功
tail -f /soft/manager/logs/manager.log
2017-02-09 18:28:08.755 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## start the manager server.
2017-02-09 18:28:26.200 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
2017-02-09 18:28:26.201 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
验证:访问http://192.168.56.101:8080,出现以下页面,出现以下页面即代表启动成功,默认密码为admin/admin
关闭:
/soft/manager/bin/stop.sh
安装node
解压node
mkdir /soft/node –p
tar -zxcf node.deployer-4.2.13.tar.gz -C /soft/node/
安装aria2
xz -d aria2-1.17.1.tar.xz
tar -xf aria2-1.17.1.tar
cd aria2-1.17.1
./configure
make check
make
make install
aria2c -v
aria2 version 1.17.1
Copyright (C) 2006, 2013 Tatsuhiro Tsujikawa
在manager页面为node定义配置信息,并生一个唯一id
首先访问manager页面的机器管理页面,点击添加机器按钮
几点说明:
机器名称:可以随意定义,方便自己记忆即可 机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露.
(此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088
下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090 外部ip
:对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。
zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群.
node这种设计,是为解决单机部署多实例而设计的,允许单机多node指定不同的端口 b.
机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid
通过这两部操作,获取到了node节点对应的唯一标示,称之为node id,简称:nid. 记录该nid,后续启动nid时会使用
Node配置修改
- 将上步获取到的序号1写入nid文件
echo 1 > /soft/node/conf/nid
- otter.properties配置修改
cat /soft/node/conf/ 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
准备启动
/soft/node/bin/startup.sh
查看日志,以下日志输出说明启动成功
tail -f /soft/node/logs/node/node.log
2017-02-09 18:59:14.485 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
验证
访问http://192.168.56.101:8080/node_list.htm查看对应的节点状态,如果变为了已启动,代表已经正常启动。(ps,如果是未启动,会是一个红色高亮)
关闭
/soft/node/bin/stop.sh
相同步骤在B机器安装启动node
同步配置
4.1 添加数据源
在配置管理==>数据源配置里分别添加A、B机器MYSQL数据源
4.2 canal解析配置
在配置管理==>canal配置中,添加源库信息
4.3 添加数据表
在配置管理==>数据表配置中,添加要同步的表信息,otest库需提前创建,
选择A、B数据源添加库表信息,.*表示所有表同步
4.4 添加channel
在同步管理中添加channel
4.5 添加pipeline
在同步管理==>channel管理pipeline管理中配置同步节点信息
4.6添加同步映射关系
在同步管理==>channel管理==>pipeline管理==>映射关系管理中编辑映射关系,.*表示所有表同步
4.7 启动
4.8 测试
在A机器otest库下创建表otter_test,在B机器查看表是否创建,A机器插入测试数据,B机器查看记录是否同步
A机器:
B机器:
同步正常,配置完毕。
同步状态查询
5.1 同步简要信息(点击同步列表上的通道channel名字链接
说明:
延迟时间 = 数据库同步到目标库成功时间 - 数据库源库产生变更时间, 单位秒. (由对应node节点定时推送配置)
最后同步时间 = 数据库同步到目标库最近一次的成功时间 (当前同步关注的相关表,同步到目标库的最后一次成功时间)
最后位点时间 = 数据binlog消费最后一次更新位点的时间 (和同步时间区别:一个数据库可能存在别的表的变更,不会触发同步时间变更,但会触发位点时间变更)
5.2 同步详细信息(点击同步简要信息上的pipeline名字的链接)
5.2.1 映射关系列表
说明:
- 定义同步的源和目标的表信息 (注意:表明可以不同,可以定义数据库分库/分表)
- Push权重 (对应的数字越大,同步会越后面得到同步,优先同步权重小的数据)
- FileResolver (数据关联文件的解析类,目前支持动态源码推送,在目标jvm里动态编译生效,不再需要起停同步任务)
- EventProcessor (业务自定义的数据处理类,比如可以定义不需要同步status='ENABLE’的记录或者根据业务改变同步的字段信息简单业务扩展,otter4新特性)
- 字段同步 (定义源和目标的字段映射,字段名和字段类型均可进行映射定义,类似于数据库视图定义功能 otter4新特性)
- 组合同步 (字段组的概念,字段组中的一个字段发生变更,会确保字段组中的3个字段一起同步到目标库 otter4新特性)
- 多个字段决定一个图片地址,变更文件字段中的任何一个字段,就会触发FileResolver类解析,从而可以确保基于字段同步模式,也可以保证FileResolver能够正常解析出文件otter4重要的优化)
5.2.2 吞吐量
说明:
数据记录统计(insert/update/delete的变更总和,不区分具体的表,按表纬度的数据统计,可查看映射关系列表->每个映射关系右边的行为曲线链接)
文件记录统计
5.2.3 延迟时间
说明:
延迟时间的统计 = 数据库同步到目标库成功时间 - 数据库源库产生变更时间, 单位秒. (由对应node节点定时推送配置)
5.2.4 同步进度
说明:
- mainstem状态: 代表canal模块当前的运行节点(也即是binlog解析的运行节点,解析会相对耗jvm内存)
- position状态: 当前同步成功的最后binlog位点信息 (包含链接的是数据库ip/port,对应binlog的位置,对应binlog的变更时间此时间即是计算延迟时间的源库变更时间)
- 同步进度: 每个同步批次会有一个唯一标识,可根据该唯一标示进行数据定位,可以查看每个批次的运行时间,找出性能瓶颈点
5.2.5 监控管理
说明:
监控项目
- 同步延迟,position超时(位点超过多少时间没有更新) , 一般业务方关心这些即可
- 异常 (同步运行过程中出现的异常,比如oracle DBA关心oracle系统ORA-的异常信息,mysql DBA关心mysql数据库相关异常)
- process超时(一个批次数据执行超过多少时间),同步时间超时(数据超过多少时间没有同步成功过)
阀值设置
- 1800@09:00-18:00 , 这例子是指定了早上9点到下午6点,报警阀值为1800.
5.2.6 日志记录
说明:
- 日志标题即为对应的监控规则定义的名字,可根据监控规则检索对应的日志记录
- 日志内容即为发送报警的信息
Otter的限制
6.1 otter只支持ROW模式的数据同步,其他两种模式不支持
6.2 源库只支持mysql,目标库支持mysql和oracle
6.3 同步的表必须要有主键,无主键表update会是一个全表扫描,效率比较差),就是全字段匹配,如果出现重复记录的话,同步会导致数据错乱
6.4 支持部分ddl同步 (支持create table / drop table / alter table / truncate table / rename table / create index / drop
index,其他类型的暂不支持,比如grant,create
user,trigger等等),同时ddl语句不支持幂等性操作,所以出现重复同步时,会导致同步挂起,可通过配置高级参数:跳过ddl异常,来解决这个问题
6.5 otter ddl同步不支持异构处理,库名、表名都要求一致
6.6 不支持带外键的记录同步. (数据载入算法会打散事务,进行并行处理,会导致外键约束无法满足)
6.7 数据库上trigger配置慎重. (比如源库,有一张A表配置了trigger,将A表上的变化记录到B表中,而B表也需要同步。如果目标库也有这trigger,在同步时会插入一次A表,2次B表,因为A表的同步插入也会触发trigger插入一次B表,所以有2次B表同步.)
6.8 2个manager,可以部署2个manager,manager之间本身没有通信,而是通过zk和数据库,配置node的时候需要知道manager,可以指定其中一个即可,数据会反应到数据库和zk中,但是当这个manager挂了,新配置的node信息就不能反馈到另外一个manager上,所以最佳实践是指定所有的manage
常见故障处理
7.1 异构环境下(源与目标库名表名有一个不相同),主库执行DDL导致同步挂起,此时可跳过DDL同步进行恢复,将源库执行的DDL SQL手动执行到目标库。
7.2 网络中断导致同步挂起,此时可重启服务器对应node节点进行恢复。
7.3 其他问题,可通过修改canal post位点或者重新同步进行解决。
标签:node,同步,部署,zookeeper,##,manager,Otter,安装,otter 来源: https://blog.csdn.net/fiendbaal/article/details/122132537