双机房多活实战(二) --mysql同步otter

一、环境准备

准备两台机器,搭建阿里开源的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-manager.png

四、安装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节点

otter_7_node_3.png

机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid

otter_7_node_2.png

注意

如果是生产环境,需要 启用外部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信息可用默认,点击保存即可。

如果是新库,那不用勾选自定义点位。

otter_3.png

1)配置一个channel:

otter_1.png

2)配置两个pipeline:

otter_2.png

注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误

3)每个pipeline各自配置canal,定义映射关系。

pipeLine:

select异常:跳过
ddl异常:跳过
Load异常:跳过
支持ddl同步: 主->是; 非主->否
启用公网同步: 是
otter_4_pipeline.png

otter_5_pipeline.png

配置同步映射规则

otter_6_mapRule.png
otter_7_mapRule.png

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同步,双向同步搭建完成

数据修复

全量同步用于修复数据

尚未生产验证,建议当有问题以后迫不得已才使用

  1. 保持channel 启动状态

  2. 把你想要同步表的表名及记录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);
    
    
  3. 如果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种方案:

  1. 使用公网ip暴露端口
    zk,node,manager,mysql 用到的端口开到外网,并用ip白名单限制
  1. 打通网络
    openvpn ,或者云vpn产品

跨机房的otter配置,有个很大的问题就是网络访问问题,比如:manager需要能访问node,node之间需要能互相访问,manager和node需要能访问zookeeper,load node需要能访问源mysql等。如何把所有的关节打通是一个比较繁琐的问题,如果生产环境搭建有问题,可以多留意manager和node的日志。

注意:上线备忘

  1. pipline 高级设置 忽略3个异常,select ,load,ddl

  2. 注意node,pipline 公网相关设置, 如公网ip等。

  3. 注意mysql表的主键是不是递增的,offset有没有错开,increment是否为2,或者主键统一用雪花id、uuid

  4. 涉及端口

    #node
    9090、2088、2090
    #manager
    8080(webUI),1099(管理node)
    #zk
    2181
    
  5. 数据表 不要写太复杂的正则,因为在页面上测试正确的正则,可能实际同步时会有问题。

    #如下:排除某些没意义的表,这个写法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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容