数据库-工具-otter部署

之前对otter还是比较一知半解的,现在重新在虚拟机环境部署一套环境,并从搭建,配置上顺便描述下otter是怎么工作的。

otter环境部署&数据同步


先说下otter的部署包。

对于canal我们知道单机部署版本有2个部署包一个是canal-deployer,一个是canal-adapter(还有其他的如canal-admin)。canal-deployer实际即canal-server,工作时由canal-server创建canal-instance,由canal-instance连接一个数据源并模拟slavedump日志binlogcanal-server会将binlog转换成内部数据结构Entrycanal-adaptercanal单机版本另一个部署包,其实也就是canal的消费端实现,canal-server可选择将Entrytcp,mq等方式传递给canal-adaptercanal-adapter则负责应用到如数据库,es等等

ottercanal的消费端实现。同样有2个部署包,一个是manager-deployer(类似canal-admin),一个是node-deployernode-deployer才是canal的消费端,内部自带了一个canal-server,由canal-server拿到binlog转换成Entry,直接给到otter,otter转换自己的内部数据结构EventData后做后续的SETLS(select)可以认为是转换EventData,这里其实还有封装Batch的操作(为了性能,打乱原有的事务,自己封装合并多条数据再向后传递)。E(extract)即对数据做一些自定义的转换,比如根据数据库数据发送文件,转换数据供T节点获取,视图转换等。我们目前没有比较特别的需求,基本就是做下数据转换供T节点获取,跨机器同步时会涉及ST节点间数据通过网络传输。T(transform)获取E节点的数据并向后传递。L(load)节点拿到数据后应用到数据库(没有实现其他的)。

ottercanal有个类似的问题,都会竞争得到运行,有可能导致压力集中在一台机器上。但相较来说,otter可以选择部分node,竞争只会发生在这些有权限的node中,而canal会在集群所有canal-server中竞争。

1. otter部署要求

  1. otter使用canal,一部分是canal的要求,如需要源数据库开启binlog,且提供有从库相应权限的用户供canal获取binlog。另外对于otter,必须配置为binlog_format必须配置为ROW
  2. otter使用zookeeper做分布式协调,对于双向同步需要跨机房的zookeeper集群来处理数据回环和一致性的问题
  3. 为了优化网络传输性能,ET节点之间数据传输对于HTTP模式需要安装aria2
  4. manager需要数据库来管理node
  5. 对于双A双向同步的数据库,还需要在双A的数据库各增加额外的表解决数据回环和一致性问题。
  6. otter是纯java语言开发,需要安装jdk,建议1.6.25以上
  7. 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

部署managernode并启动

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.23110.19.104.23710.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		# 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theskyzero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值