同步多个MYSQL实例数据到一个实例 ----- otter 安装过程记录

1,637 阅读7分钟

可同步多个实例的数据库到一台数据库实例上,方便用于查询和统计(MYSQL多源同步不了的情况下的代替方案)。本文的操作系统是CentOs 7。

确定机器上已安装java. 如没有则先安装:

yum install java-1.8.0-openjdk.x86_64

1。下载必要软件,这三个都是直接解压后就可运行。

mirrors.hust.edu.cn/apache/zook… -- 下载最新的稳定版本 wget mirrors.hust.edu.cn/apache/zook…

github.com/alibaba/ott… -- 下载otter的manager 和 node,下载最新的稳定版本 wget github.com/alibaba/ott… -- 下载manager wget raw.github.com/alibaba/ott… -- manager的mysql数据库结构 wget github.com/alibaba/ott… -- 下载node

2。官方参考文档: github.com/alibaba/ott… github.com/alibaba/ott… -- 快速开始

3。安装MYSQL,将源数据库已有的数据导入到目标库中。在源库中执行otter-manager-schema.sql,建好otter数据库。建议不要放在同步目标数据库里。

4。解压 解压后的目录结构 /data/soft/zookeeper/zookeeper-3.4.13 /data/soft/otter/manager.deployer-4.2.15 /data/soft/otter/node.deployer-4.2.15

 > tar -zvxf zookeeper-3.4.13.tar.gz
 > tar -zvxf manager.deployer-4.2.15.tar.gz -C manager.deployer-4.2.15 - 解压到指定目录,要先把目录建好
 > tar -zvxf node.deployer-4.2.15.tar.gz -C node.deployer-4.2.15 - 解压到指定目录

5。运行 zookeeper 复制配置文件:> cp zookeeper-3.4.13/conf/zoo_sample.cfg zookeeper-3.4.13/conf/zoo.cfg 修改配置:> vi zookeeper-3.4.13/conf/zoo.cfg 修改内容: dataDir=/data/soft/zookeeper/data # 目录要先建好 dataLogDir=/data/soft/zookeeper/log 其它配置全部用默认

启动:> ./zookeeper-3.4.13/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /data/soft/zookeeper/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

> netstat -na | grep 2181 看下zookeeper启动了没有

6。运行otter的manager 先确定otter-manager-schema.sql已在数据库执行完毕,otter库已经建好。 运行SQL的时候如果出现错误: ERROR 1067 (42000): Invalid default value for 'GMT_CREATE' 就打开otter-manager-schema.sql文件, 把全部的 GMT_CREATE timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 替换为: GMT_CREATE timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 这是因为mysql的sql_mode参数不允许timestamp类型的字段有0值出现造成的。

给otter库单独建一个帐号。
CREATE USER 'otter'@'127.0.0.1' IDENTIFIED BY '123456';
GRANT all privileges ON otter.* TO 'otter'@'127.0.0.1';
flush privileges;

修改配置文件:> vi ./manager.deployer-4.2.15/conf/otter.properties
otter.domainName = xxx.xxx.xxx.xxx # 修改为正确访问ip(内网访问配置内网地址外网访问配置外网地址)
otter.port = 8081 # 修改http端口,允许公网访问的还是改下吧

otter.database.driver.username = otter # 改为安装了otter库的mysql的帐号
otter.database.driver.password = 123456 # 改为真实密码
otter.zookeeper.cluster.default = 127.0.0.1:2181 # 改为zookeeper的IP和端口,这里用默认因为zookeeper在同一机器上并且保持了默认设置

启动:./manager.deployer-4.2.15/bin/startup.sh
> netstat -na | grep 8081 看下manager启动了没有

问题:
1.启动失败提示:otter Service Unavailable # zookeeper没启动造成,或manager设置的zookeeper地址或端口不对.

7。配置otter的node,先不运行 修改配置文件:> vi ./node.deployer-4.2.15/conf/otter.properties otter.manager.address = 127.0.0.1:1099 # manager所在机器的正确地址和端口,因为这里在同一台机器所以用默认

8。在manager中进行单向同步配置. manager启动成功后,用浏览器打开地址: xxx.xxx.xxx.xxx:8081 # 在manager的otter.properties配置好的,如果打不开看下防火墙的端口是不是开了。 右上角点击登录图标,登录。默认帐号和密码是:admin:admin

8。1 zookeeper 添加
	菜单:机器管理 -> zookeeper管理 -> 按钮:添加

	表单填写,必填项
	集群名字:# 填写一个明确的名字,如:本地zookeeper
	ZooKeeper集群:127.0.0.1:2181; # 因为manager与zookeeper在同一台机器所以用本地IP(最后的分号不要漏掉)
	保存

	保存时可能出现的问题:
	1。http error 500 problem accessing # otter的表所在库数据库没有写入权限,更改mysql帐号权限重启manager。
	2。HTTP ERROR 500  #数据库帐号权限问题

		Problem accessing /channelList.htm. Reason:

		    Failed to invoke Valve[#2/3, level 3]: com.alibaba.citrus.turbine.pipeline.valve.PerformTemplateScreenValve#4f3356c0:PerformTemplateScreenValve

8。2 node 添加
	菜单:机器管理 -> node管理 -> 按钮:添加

	表单填写
	机器名称:#有node.deployer-4.2.15的机器算为一个node,为这台机器起个名字
	机器IP:10.81.83.130 # 对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
	机器端口:2088 # 对应node节点将要部署时启动的数据通讯端口,建议值:2088
	下载端口:9090 # 对应node节点将要部署时启动的数据下载端口,建议值:9090
	外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。因为是内网这里保持默认
	zookeeper集群:选上一步建好的zookeeper
	保存

	保存完毕后,在列表里看下序号是几。我这里是1,按官方说的:
	写入node的id文件:
	> echo 1 > ./node.deployer-4.2.15/conf/nid # 多个node协同工作时不能重复

	此时本条node记录的状态是:未启动

8。3 node 启动
> ./node.deployer-4.2.15/bin/startup.sh
然后刷新node管理列表,看下状态。正常情况下应该是:已启动

可能的问题:
如果状态不是已启动,看node的日志:
> vi ./node.deployer-4.2.15/logs/node/node.log


8。4 数据源配置
	菜单:配置管理 -> 数据源配置 -> 按钮:添加

	说明;这里用于配置源数据库和目标数据库。

	表单填写:
	数据源名字:给源或目标数据库起个名。源数据库(主库 master),目标数据库(从库 Slave)
	用户名:mysql可用的帐号
	密码:mysql帐号密码
	URL:jdbc:mysql://10.20.144.15:3306  # 源或目标库的IP和端口
	编码:与指定的数据库的默认编码一致。

	验证下数据源:恭喜,数据库通过验证! -- 表示成功

	保存

8。5 数据表配置
	菜单:配置管理 -> 数据表配置 -> 按钮:添加

	说明:这里设置源或目标数据库要同步的表。如果源库已有表和数据,要先把现有的数据导入目标库,否则报错。

	表单填写:
	schmea name:要同步的数据库名,如果要同步多个库可用正则表达式:(a库|b库|c库...)
	table name:要同步的表名,如果要同步多个表可用正则表达式:.*或(a表|b表|c表...)
	数据源:选择源或目标数据源.

8.6 canal配置
	菜单:配置管理 -> canal配置 -> 按钮:添加

	说明:配置去主库复制数据的canal。

	表单填写:
	canal名称:起名
	数据库地址:10.51.21.252:3306; # 填写主库IP与端口
	数据库帐号:
	数据库密码:
	其它默认
	保存

8.7 同步管理配置(把主从库关联起来的步骤)
	8.7.1 新建Channel
	菜单:同步管理 -> 按钮:添加

	表单填写:
	Channel Name:起名
	其它默认
	保存

	
	8.7.2 Pipeline管理
	点击 Channel名字 -> 按钮:添加

	表单填写:
	Pipeline名字:起名
	Select机器:数据来源的Node机器 ----- 离源mysql近的应为select机器,离目的mysql近的应为load(如果两个node选择的不一样的特别是异地的,安装aria2工具(在node节点之间提供文件传输通道)。)
	Load机器:被同步的Node机器
	Canal名字: 对应select机器的canal(即用于主从同步的canal)
	其它默认
	保存

	8.7.3 映射关系列表
	点击 Pipeline名字 -> 按钮:添加

	说明:建立源库与目标库之间的映射关系。

	表单填写:
	源数据表:源数据库的数据源配置(主库 master)
	目标数据表:目标数据库的数据源配置(从库 slave)
	保存

	8.7.4 启用Channel
	菜单:同步管理 -> 启用

	8.7.5 查看运行情况
	菜单:监控管理 -> 日志记录,根据日志查看错误情况

	问题处理:
	1。pid:1 nid:1 exception:canal:测试库canal:com.alibaba.otter.canal.parse.exception.CanalParseException: Unsupported BinlogFormat STATEMENT
		第一步:主库的binlog_format必须设置为Row.

		第二步:把zookeeper停止,并把它的日志删除掉。
			清掉manager所有数据表的内容(除帐号表),重启manager和node。
			重新配置所有manager的内容。
			然后,好了
			关键,不知道问题点在哪里

	2。DuplicateKeyException: PreparedStatementCallback; SQL [update `xxx`.`xxx_table` set `id` = ? where ( `id` = ? )]; Duplicate entry '785748' for key 'PRIMARY';
		2.1 先停止channel
		2.2 到 channel管理  >  Pipeline  >  同步进度 菜单下,删除【position 状态】
		2.3 编辑canal的【位点自定义设置】,保存
		2.4 重新启动channel。

后记:

问题: 1.canal elapsed 92450 seconds no data。 原因:node 停了,要去node/bin/stop.sh node/bin/startup.sh 重启下。