一、环境准备
准备两台机器,搭建阿里开源的mysql同步工具otter,canal就是 它的子项目。
mysql | zk | manager | node | |
---|---|---|---|---|
node5 | 1 | 1 | 1 | 1 |
node6 | 1 | 1 |
二、中间件安装
JDK
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
zk安装,启动
./zkServer.sh start
mysql安装,启动
mysql修改offset
注意双向同步要求两个库表的主键不能重复,如果自增主键要把主键offset错开并1指定increment 如下:
如果都是雪花id,或者uuid 之类的主键,则不用
vim /etc/my.cnf
#开启bin log模式
log-bin=mysql-bin
binlog_format=row
#如果mysql为多写模式,需要在每个写库配置自增主键的偏移量和步长,避免主键冲突,偏移量和步长根据写库数量做配置
#例如myql双写模式场景下,MySQL-A配置如下
auto-increment-increment=2
auto-increment-offset=1
#MySQL-B配置如下
#auto-increment-increment=2
#auto-increment-offset=2
账号备忘
#默认root账号
root
Root@123456
#otter同步账号
otter
Otter@123456
三、安装otter-manager
官网教程https://github.com/alibaba/otter/wiki/Manager_Quickstart
1.下载解压
mkdir -p ./otter/manager
cd ./otter/manager
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gz
tar -zxvf manager.deployer-4.2.18.tar.gz
2.执行数据库表初始化语句
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
3.在cli执行
source otter-manager-schema.sql
4.创建mysql用户
#这个主要用于otter manager后台使用
create user 'otter'@'%' identified by 'Otter@123456';
grant all on *.* to 'otter'@'%' identified by 'Otter@123456';
flush privileges;
5.修改manager的配置信息
cd /usr/local/opt/manager4.2.18
vi conf/otter.properties
# otter manager管理后台的域名或访问ip,页面跳转时会用这个值
otter.domainName = 192.168.56.105
# otter manager管理后台的访问端口
otter.port = 8080
#jdbc
otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter?useSSL=false
#按理应该使用otter,Otter@123456,这里直接用root
otter.database.driver.username = root
otter.database.driver.password = Root@123456
#otter通讯地址,默认可不改
otter.communication.manager.port = 1099
#zk根据实际部署该
otter.zookeeper.cluster.default = 127.0.0.1:2181
6.启动
./bin/startup.sh
7.验证
访问: http://127.0.0.1:8080/,出现otter的页面,即代表启动成功
初始密码:admin/admin
四、安装otter node
官网教程https://github.com/alibaba/otter/wiki/Node_Quickstart
这一步骤需要在两个机房里至少各自选一个服务器作为select node。
1.下载解压
mkdir -p ./otter/node
cd ./otter/node
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gz
tar -zxvf node.deployer-4.2.18.tar.gz
2.安装aria2c
#编译前的准备
yum install -y gcc gcc-c++
wget https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0.tar.gz
tar -zxvf aria2-1.36.0.tar.gz
cd aria2-1.36.0
./configure
make
make install
#验证
aria2c -v
3.配置zookeeper
首先访问manager页面的机器管理页面,点击zookeeper管理,添加一个zookeeper。
注意
用公网ip。
4.配置Node节点
首先访问manager页面的机器管理页面,点击机器管理->Node管理,添加node节点
机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid
注意
如果是生产环境,需要 启用外部id,(还有另外的一处pipline也要启用外部ip)。
5.修改配置
将环境准备中添加机器后获取到的序号(1),保存到conf目录下的nid文件
例如:echo 5 > conf/nid
修改conf/otter.properties,修改如下信息:
otter.manager.address = 127.0.0.1:1099 #修改为otter master外部ip地址
6.启动
./bin/startup.sh
五、otter辅助库创建
otter的双向同步需要在两个mysql实例都创建辅助库 retl,具体步骤如下:
1)获取初始sql:
wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sq
2)在mysql中执行otter-system-ddl-mysql.sql
六、双A同步
双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集。
所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:[Otter数据一致性](https://github.com/alibaba/otter/wiki/Otter数据一致性) ,目前开源版本主要是提供了单向回环补救的一致性方案。
双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:
0 )数据源、数据表、canal配置
菜单-配置管理,为两个mysql实例分别配置如题这3个信息,后续在配置 channel,pipline时会用。
数据表
一般 table name 直接用通配写法
.*
canal
位点信息为canal开始同步的位置,该信息可在mysql中使用如下语句获取:show master status\G;
其中自定义点位 的journalName和position的值对应如下的File、Position,其余canal信息可用默认,点击保存即可。
如果是新库,那不用勾选自定义点位。
1)配置一个channel:
2)配置两个pipeline:
注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误
3)每个pipeline各自配置canal,定义映射关系。
pipeLine:
select异常:跳过
ddl异常:跳过
Load异常:跳过
支持ddl同步: 主->是; 非主->否
启用公网同步: 是
配置同步映射规则
4) 启动同步
配置完映射规则,回到同步管理主页,点击启用即可开启同步。
七.异地机房库初始化
如果不是完全的新项目,而是对线上项目进行双机房改造,那还需要对新机房做数据初始化、以及必要的散列。
1.mysqldump导出/导入数据
在导出数据时,可以先把一些有时效性、无效的数据 删掉,比如token,log等,先归档到其他库,这样提升导出、导入的效率。
#单独安装mysqldump
yum -y install mysql-client
#mysqldump 备份 使用最佳实践
mysqldump -h IP地址 \
-u用户名 -p \
--skip-tz-utc \
--no-create-info \
--insert-ignore \
--master-data=2 \
--default-character-set=utf8 \
--set-gtid-purged=off \
--ignore-table=wechat.weixin_vermicelli \
--ignore-table=wechat.sms_send_record \
--ignore-table=wechat.weixin_error_log \
--ignore-table=wechat.weixin_receivetext \
--ignore-table=wechat.weixin_scene \
--ignore-table=wechat.sys_logon_log \
--ignore-table=wechat.weixin_account_modify_log wechat > dump.sql;
#mysqldump导入
mysql wechat < dump_where_DML.sql中的binlog点位。
2.otter manager
- otter pipline 中,删除同步点位。
- 修改canal自定义点位为dump_where_DML.sql中的binlog点位
- 启动channel同步,双向同步搭建完成。
数据修复
全量同步用于修复数据
尚未生产验证,建议当有问题以后迫不得已才使用
保持channel 启动状态
-
把你想要同步表的表名及记录ID插入到retl_buffer表即可。
例如:希望把node6的 test.user2 表全部同步到node5的test.user2。
#在node6执行 insert into retl.retl_buffer(ID,TABLE_ID,FULL_NAME,TYPE,PK_DATA,GMT_CREATE,GMT_MODIFIED) (select null,0,'test.user2','I',id,now(),now() from test.user2);
如果sql执行报错 1067,解决如下:
show variables like ‘sql_mode’
#(1)临时修改:
set session
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
#(2)永久修改
vi my.cnf
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
机房间网络打通
跨机房同步网络打通2种方案:
- 使用公网ip暴露端口
zk,node,manager,mysql 用到的端口开到外网,并用ip白名单限制。
- 打通网络
openvpn ,或者云vpn产品
跨机房的otter配置,有个很大的问题就是网络访问问题,比如:manager需要能访问node,node之间需要能互相访问,manager和node需要能访问zookeeper,load node需要能访问源mysql等。如何把所有的关节打通是一个比较繁琐的问题,如果生产环境搭建有问题,可以多留意manager和node的日志。
注意:上线备忘
pipline 高级设置 忽略3个异常,select ,load,ddl
注意node,pipline 公网相关设置, 如公网ip等。
注意mysql表的主键是不是递增的,offset有没有错开,increment是否为2,或者主键统一用雪花id、uuid
-
涉及端口
#node 9090、2088、2090 #manager 8080(webUI),1099(管理node) #zk 2181
-
数据表 不要写太复杂的正则,因为在页面上测试正确的正则,可能实际同步时会有问题。
#如下:排除某些没意义的表,这个写法webUI上测试可以,实际同步时不行,改成通配符就可 #如下范例排除 user3,user2 ^((?!user3|user2).)*$
^((?!weixin_vermicelli|weixin_certifyauth_accesstoken|weixin_scene).)*$
# 参考资料
竞品分析 、源码https://www.iteye.com/blog/eyuxu-1941894
https://blog.csdn.net/lexoning/article/details/119938817
https://blog.csdn.net/weixin_41676972/article/details/86632078
https://www.xmmup.com/otteryongyukuayunrdszhijianpeizhishuangzhushishitongbu.html#otter_heogg_you_que_dian
https://blog.csdn.net/wudufeng/article/details/78688240
类似产品:精卫,drc https://docs.google.com/presentation/d/1Yrc6CfHT1raWPqWQOENDT3pdTgVC0ADoNipbrmDm418/edit#slide=id.gb0d10616_60
http://www.wityx.com/post/29968_1_1.html
https://blog.csdn.net/weixin_34261415/article/details/93051444
https://blog.csdn.net/zxcvyoung1234/article/details/39342745
https://blog.csdn.net/qq_37891300/article/details/97402000