之前对
otter还是比较一知半解的,现在重新在虚拟机环境部署一套环境,并从搭建,配置上顺便描述下otter是怎么工作的。
otter环境部署&数据同步
先说下otter的部署包。
对于canal我们知道单机部署版本有2个部署包一个是canal-deployer,一个是canal-adapter(还有其他的如canal-admin)。canal-deployer实际即canal-server,工作时由canal-server创建canal-instance,由canal-instance连接一个数据源并模拟slave去dump日志binlog,canal-server会将binlog转换成内部数据结构Entry。canal-adapter是canal单机版本另一个部署包,其实也就是canal的消费端实现,canal-server可选择将Entry以tcp,mq等方式传递给canal-adapter,canal-adapter则负责应用到如数据库,es等等
otter是canal的消费端实现。同样有2个部署包,一个是manager-deployer(类似canal-admin),一个是node-deployer。node-deployer才是canal的消费端,内部自带了一个canal-server,由canal-server拿到binlog转换成Entry,直接给到otter,otter转换自己的内部数据结构EventData后做后续的SETL。S(select)可以认为是转换EventData,这里其实还有封装Batch的操作(为了性能,打乱原有的事务,自己封装合并多条数据再向后传递)。E(extract)即对数据做一些自定义的转换,比如根据数据库数据发送文件,转换数据供T节点获取,视图转换等。我们目前没有比较特别的需求,基本就是做下数据转换供T节点获取,跨机器同步时会涉及ST节点间数据通过网络传输。T(transform)获取E节点的数据并向后传递。L(load)节点拿到数据后应用到数据库(没有实现其他的)。
otter和canal有个类似的问题,都会竞争得到运行,有可能导致压力集中在一台机器上。但相较来说,otter可以选择部分node,竞争只会发生在这些有权限的node中,而canal会在集群所有canal-server中竞争。
1. otter部署要求
otter使用canal,一部分是canal的要求,如需要源数据库开启binlog,且提供有从库相应权限的用户供canal获取binlog。另外对于otter,必须配置为binlog_format必须配置为ROWotter使用zookeeper做分布式协调,对于双向同步需要跨机房的zookeeper集群来处理数据回环和一致性的问题- 为了优化网络传输性能,
ET节点之间数据传输对于HTTP模式需要安装aria2 manager需要数据库来管理node- 对于双A双向同步的数据库,还需要在双A的数据库各增加额外的表解决数据回环和一致性问题。
otter是纯java语言开发,需要安装jdk,建议1.6.25以上otter使用4.2.18版本,内置canal 1.1.4
2. 部署步骤
2.1 环境
补充下,需要
zk大集群环境,目前B机房测试的zk还给kafka使用,所以observer三个节点先去掉了。A,B机房的节点都注册到A机房集群上。
zookeeper:
server.0=10.19.161.186:2888:3888
server.1=10.19.161.187:2888:3888
server.2=10.19.161.188:2888:3888
# server.4=10.19.104.234:2888:3888:observer
# server.5=10.19.104.235:2888:3888:observer
# server.6=10.19.104.236:2888:3888:observer
manager:
10.19.161.230 # http://10.19.161.230:8080 admin/admin
db: 10.19.161.232
node:
10.19.161.230
10.19.161.231
10.19.104.237
10.19.104.238
db:
A: jdbc:mysql://10.19.161.232:3306/usercenter_0
B: jdbc:mysql://10.19.104.240:3306/usercenter_0
2.2 部署manager
部署manager和node并启动
2.2.1 上传安装包
# 登录10.19.161.230
mkdir -p /u02/otter
# 上传node.deployer-4.2.18.tar.gz & manager.deployer-4.2.18.tar.gz 至/u02/otter
# 解压
mkdir -p /u02/otter/node
tar -zxvf /u02/otter/node.deployer-4.2.18.tar.gz -C /u02/otter/node/
mkdir -p /u02/otter/manager
tar -zxvf /u02/otter/manager.deployer-4.2.18.tar.gz -C /u02/otter/manager/
# 依次上传至10.19.161.231,10.19.104.237,10.19.104.238
依次上传至10.19.161.231,10.19.104.237,10.19.104.238
2.2.2 初始化manager数据库
manager-deployer压缩包没有初始化脚本,上git上拿一份 otter-manager-schema.sql。
# 连接10.19.161.232
# 执行otter-manager-schema.sql
2.2.3 启动manager
# 登录10.19.161.230
# 切换到manager目录
cd/u02/otter/manager
# 修改otter.properties
# vi conf/otter.properties
otter.domainName = 10.19.161.230
otter.database.driver.url = jdbc:mysql://10.19.161.232:3306/otter
otter.database.driver.username = otter
otter.database.driver.password = otter
otter.zookeeper.cluster.default = 10.19.161.186:2181,10.19.161.187:2181,10.19.161.188:2181
# 启动manager
bin/startup.sh
2.2.4 设置node
补充下,需要
zk大集群环境,目前B机房测试的zk还给kafka使用,所以observer三个节点先去掉了。A,B机房的节点都注册到A机房集群上。
# 登录http://10.19.161.230:8080
# 切换为管理员用户登录 admin/admin
# 添加AB机房zookeeper集群
# 机器管理/Zookeeper管理
A:
集群名称: A
Zookeeper集群: 10.19.161.186:2181;10.19.161.187:2181;10.19.161.188:2181; # 注意使用;分隔
描述: A机房zk集群
B:
集群名称: B
Zookeeper集群: 10.19.104.234:2181;10.19.104.235:2181;10.19.104.236:2181; # 注意使用;分隔,
描述: B机房zk集群
# 添加AB机房node机器(预先设置分配id,后面node启动需要)
# 机器管理/Node管理
A-Node1: # 添加完记录序号1,启动node需要这个序号
机器名称: A-Node1
机器IP: 10.19.161.230
机器端口: 2088
下载端口: # 默认
Mbean端口: # 默认
外部IP: # 外网需要
启用外部IP: 否
zookeeper集群: A
描述: A机房Node节点1
A-Node2: # 添加完记录序号2,启动node需要这个序号
机器名称: A-Node2
机器IP: 10.19.161.231
机器端口: 2088
下载端口: # 默认
Mbean端口: # 默认
外部IP: # 外网需要
启用外部IP: 否
zookeeper集群: A
描述: A机房Node节点2
B-Node1: # 添加完记录序号3,启动node需要这个序号
机器名称: B-Node1
机器IP: 10.19.104.237
机器端口: 2088
下载端口: # 默认
Mbean端口: # 默认
外部IP: # 外网需要
启用外部IP: 否
zookeeper集群: B # 这里后面先换成A了
描述: B机房Node节点1
B-Node2: # 添加完记录序号4,启动node需要这个序号
机器名称: B-Node2
机器IP: 10.19.104.238
机器端口: 2088
下载端口: # 默认
Mbean端口: # 默认
外部IP: # 外网需要
启用外部IP: 否
zookeeper集群: B # 这里后面先换成A了
描述: B机房Node节点2
2.2.4 启动node
以A-Node1示例
# 登录10.19.161.230
# 切换node目录
cd /u02/otter/node
# 编辑otter.properties
# vi conf/otter.properties
otter.manager.address = 10.19.161.230:1099
# 创建nid
echo 1 > conf/nid # 这里1 即上面manager配置node时分配的序号,node根据管理地址向manager注册时会根据序号校验ip等,而且程序中很多地方会需要根据序号取到对应的node
# 启动node
bin/startup.sh
# 查看manager
# http://10.19.161.230:8080/node_list.htm
# A-Node1 已启动
依次再启动A-Node2,B-Node1,B-Node2
2.3 manager配置管理
设置同步的数据表和canal
2.3.1 数据源设置
设置AB机房待同步的数据源
# 登录manager http://10.19.161.230:8080/data_source_list.htm
# 配置管理/数据源配置
A-uc:
数据源名称: A-uc
类型: MYSQL
用户名: user # 有select,connect权限就好了,用作反查数据库和应用数据库
密码: passwd
URL: jdbc:mysql://10.19.161.232:3306/usercenter_0 # 这里设置jdbc:mysql://10.19.161.232:3306好些,但是默认字符集是latin1,下面编码不支持,就指定数据库了
编码: UTF8
验证连接数据源: 恭喜,数据库通过验证!
B-uc:
数据源名称: B-uc
类型: MYSQL
用户名: user
密码: passwd
URL: jdbc:mysql://10.19.104.240:3306/usercenter_0 # 注意,这里设置usercenter_0是需要已经先做一次数据全量备份恢复
编码: UTF8
验证连接数据源: 恭喜,数据库通过验证!
2.3.2 数据表配置
设置AB机房待同步的数据表
A:
schema name: usercenter_0 # 也可以用 .* 全匹配
table name: .*
数据源: A-uc
验证连接表: SELECT 未成功 # 配置单表的验证
查询Schema&Table: # 列出usercenter_0下所有表
B:
schema name: usercenter_0 # 也可以用 .* 全匹配
table name: .*
数据源: B-uc
验证连接表: SELECT 未成功 # 配置单表的验证
查询Schema&Table: # 列出usercenter_0下所有表
2.3.3 Canal配置
设置canal-instance,连接AB机房数据源。
# 连接对10.19.161.232,canal连接用户授权
# 比较尴尬,提供的ggs没有grant权限,需要root用户才行(虽然可以搞...但是算了吧...使用@汪松涛建的canal_sync用户)
# canal_sync/canal_sync
# 查询B机房binlog位点信息, 连接10.19.104.240
show master status; # File:mysql-bin.000001; Position:25363375
# canal配置
A-canal:
canal名称: A-canal
运行模式: 嵌入式
zookeeper集群: A
数据源类型: mysql
数据库地址: 10.19.161.232:3306;
数据库账号: canal # 这里要用有从库权限可以dump日志的用户
数据库密码: canal
connectionCharset: UTF-8 # 获取binlog指定编码
位点自定义设置: 是 # 指定位置增量更新
是否启用gtid位点: 是
位点信息: {
"journalName":"mysql-bin.000001","position":25363376}; # {"journalName":"","position":25363376,"timestamp":0};
是否开启表结构TSDB: 否 # 忘了是啥了,双A用?
存储机制: memory # memory即可,内嵌的canal,直接在内存转换
内存存储batch获取模式: MEMSIZE # 默认32M大小=记录数*记录大小,
内存存储buffer记录数: 1024 # 默认32768,32M, 会需要aria2进行http传输,这里控制大小为1M(有用吗?)
内存存储buffer记录单元大小: 1024
HA机制: heartbeat
是否开启心跳: 否
其他参数设置:
meta机制: mixed # 订阅消费信息存储机制,otter只用了canal的memory,zookeeper & mix(PeriodMixedMetaManager:memory+zookeeper)
索引机制: memory_meta_failback # position存储机制,otter用了canal的memory,zookeeper,mix(PeriodMixedLogPositionManager:memory+zookeeper),meta,failback(FailbackLogPositionManager:memory+meta)
服务端口: 11111
默认连接超时: 30s
sendBufferSize: 16384 # 16k
receiveBufferSize: 16384 # 16k
切换回退时间: 60 # 大概是切换canal要回退重推?
过滤表达式: # 过滤binlog
描述信息: A机房canal
B-canal:
canal名称: B-canal
运行模式: 嵌入式
zookeeper集群: B
数据源类型: mysql
数据库地址: 10.19.104.240:3306;
数据库账号: canal # 这里要用有从库权限可以dump日志的用户
数据库密码: canal
connectionCharset: UTF-8 # 获取binlog指定编码
位点自定义设置: 否 # 指定位置增量更新
是否启用gtid位点: 否
位点信息:
是否开启表结构TSDB: 否 # canal管理源表结构信息存储,支持memory和database,开启会持久化在manager的数据库
存储机制: memory # memory即可,内嵌的canal,直接在内存转换
内存存储batch获取模式: MEMSIZE # 默认32M大小=记录数*记录大小,
HA机制: heartbeat
是否开启心跳: 否
其他参数设置:
meta机制: mixed # 不知道是啥
索引机制: memory_meta_failback # 不知道是啥
服务端口: 11111
默认连接超时: 30s
sendBufferSize: 16384 # 16k
receiveBufferSize: 16384 # 16k
切换回退时间: 60 # 大概是切换canal要回退重推?
过滤表达式: # 过滤binlog
描述信息: B机房canal
2.3.4 主备设置
提供A机房主备数据库切换用,先不用这个
2.4 同步管理
设置开启AB机房数据同步
2.4.1 添加AB机房同步channel
参数说明见:Manager配置介绍
# 登录manager http://10.19.161.230:8080/channel_list.htm
# 同步管理/Channel管理
Channel:
Channel Name: A<->B
同步一致性: 基于当前日志变更
同步模式: 列记录模式
是否开启数据一致性: 是
一致性算法: 单向回环补救
一致性反查数据库延迟阀值(s): 60
描述: AB机房同步Channel
2.4.2 设置AB同步管道
参数说明见:Manager配置介绍, Otter调度模型
# 登录manager http://10.19.161.230:8080/channel_list.htm
# 同步管理/Channel管理/Pipeline管理
A->B:
Pipeline名字: A->B
Select机器: A-Node1,A-Node2 # 看上去和 canal一样,不能指定优先node? 抢占式压力会抢在一台机器?
Load机器: B-Node1,B-Node2
并行度: 5 # 并行化调度参数,同时仅处理5个process,第一个process未Load,不会继续Select
数据反查线程数: 10
数据载入线程数: 15
文件载入线程数: 15
主站点: 是
同步数据来源: Canal
Canal名字: A-canal
消费批次大小: 4000 # 使用otter文档推荐值
获取批次数据超时时间(毫秒): 500 #

最低0.47元/天 解锁文章
2511

被折叠的 条评论
为什么被折叠?



