数据库 MySQL 异地同步问题

Peter · 2016年08月17日 · 最后由 msg7086 回复于 2016年08月18日 · 3540 次阅读

http://v2ex.com/t/299994 两边都发一下,希望从大家那里学到更好的方法。

各位好,最近又面临 MySQL 异地同步问题,想了一个主意,不知道大家有没有更好的办法。

背景

MySQL,MyISAM 引擎,中美欧三地机房 数据不要求实时,有一两天延时也没关系,服务器半夜可停机。 <- 这些前提很重要

原来

美国放主服务器 中欧放从服务器 主从复制 效果好的时候一切 OK,但你懂的,经常断,修复起来很麻烦。

找更好的方案

比如说 从主服务器 copy Binlog 到 从服务器然后再同步,类似这样,但感觉太复杂,不方便自动化: http://blog.csdn.net/jesseyoung/article/details/37106035

我想到的方案

http://jojodiff.sourceforge.net

因为 MyISAM 引擎本质上就是文件,所以我想用 diff 的方式来做:

a) 主服务器上 copy 一份原始数据库 base 文件 (table.FRM, table.MYD, table.MYI),并传递到从服务器

b) 一天后停主服务器,跟原始文件生成 patch 文件

c) 传递 patch 到从服务器,跟原始文件 merge,生成新的数据库文件,重启 mysql 服务

d) 以后每天半夜同样处理

e) 视 patch 文件大小,可以一个月一次或几个月一次更新 base 文件

这一切可以通过 bash 和 Cron 自动执行,简单可靠,只要主服务器不出错,从服务器没有出错的理由。主服务器可以用 Digital Ocean 的备份服务。

大家讨论一下这个方法有没有什么明显问题,或者有什么更可靠的简单方法。方法要简单,类似这种高雅范的我真有点吃不消: https://github.com/alibaba/otter

谢谢!

什么东西经常断? 主从我跑了好久了还没坏过,VPS 被服务商重启了都还在正常同步呢。

如果用 diff, 可以先停机,然后直接用数据库文件和 base 作比较,这个生成的过程应该比较短。

难道不用再重新读取一次整个数据库文件? I/O 上看,本体+base 需要两倍的 I/O 量。 CPU 上看,单纯的读取比做 diff 快得多。 理论上看只会更慢不会更快,不知道你怎么得出过程比较短这样结论的。

对了,说到diffbinlog就是diff

a) 主服务器上 copy 一份原始数据库 base 文件 (table.FRM, table.MYD, table.MYI),并传递到从服务器

b) 一天后停主服务器,跟原始文件生成 patch 文件 -> 一天后取出binlog文件 c) 传递 patch 到从服务器,跟原始文件 merge,生成新的数据库文件,重启 mysql 服务 -> 传递binlog到从服务器,mysqlbinlog xxx.binlog | mysql 跟原始库 merge,不用停机也不用重启服务 d) 以后每天半夜同样处理

e) 视 patch 文件大小,可以一个月一次或几个月一次更新 base 文件 -> base一直在自动更新,不用手更

#2 楼 @msg7086 谢谢,我再研究一下 binlog

然后更悲伤的故事是,如果你要自动化 binlog 的话……

主从就是自动化 binlog……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号