利用mysqlbinlog进行集群备份的设想

9月 12th, 2010 | Posted by | Filed under 数据库

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/tech/database/backup_mysql_use_mysqlbinlog.html

实现MySQL热备份的最好方法,我一直都认为是Replication,xtrabackup等各种热备脚本,都没有Replication安全方便。
面对一个大规模集群的备份,由于实例太对,没办法创建这么多实例去Replication。之前我的想法一直是通过修改MySQL的源码,扩展MySQL Replication可以创建多个M-S复制,这对MySQL本身有入侵,没办法保证我的代码能有非常高的可靠性,更严重的是要改变MySQL的语法,来支持多Master的Change语句,对.yy文件的修改风险就更大了。

在这条路不断的碰壁之时,突然想到,mysqlbinlog不是一个很好的工具吗,为什么还要靠修改源码,一个利用mysqlbinlog进行大规模备份的想法就诞生了,但是是否可靠还要去验证下。

怎么做呢,首先了解下MySQL Replication怎么做的,首先一个Slave IO线程从Master读取binlog,然后解析到Relay-log,另一个Slave SQL线程异步的从Relay-log中读取SQL应用到本地。
mysqlbinlog有一个参数read-from-remote-server,可以从远程读取binlog,只要创建一个有Replication Client权限的用户即可,这就模拟了Slave IO线程的作用。
mysqlbinglog –read-from-remote-server -u repl -p -h target_node –start-datetime=’2010-09-01 00:00:00′ –stop-datetime=’2010-09-01 23:59:59′
通过这条命令就可以获取到2010-09-01这一天的全部SQL,这些SQL可以直接导入到数据库,也可以写到Relaylog,让SLave SQL线程去执行。

假设我们原来是每5分钟备份一次新产生的binlog,每天一次全备,所有备份都在一个备份机上,利用上述方法,就可以如下操作:

1. 在备份机启动一个实例,指向任意一个没有操作的Master,使Relay-log文件生成。
2. 每个要备份的实例从备份机每5分钟发起一次mysqlbinlog请求,获取上5分钟的binlog,写入到一个临时文件,然后等临时文件写完了,去touch一个锁,写Relaylog。
3. 每天Slave Start一次,Slave Start之前touch一个锁,让Relay-log的写阻塞,等待Slave start执行完毕,删除Relay-log的写锁。
4. 删除前一天产生的临时文件。

这样操作就可以保证,每五分钟产生的SQL都被分开记录,方便查找,每天的Slave start则消化掉这些SQL
如果想方便一点,不写Relay-log也是可以的,直接每天把SQL丢给MySQL执行一次就好,效果也一样。

具体这种方法靠谱不靠谱,我会去实践一下看看。

  1. laneovcc
    9月 27th, 201011:13

    基本靠谱,我们生产在用这种方法备份, 但是我们没有做消化这个步骤。

    要说明一点,就是这种备份依靠的是mysql replication,如果replication出错(这种情况并不少见),那么数据也是错的,也没有办法来做mk-table-checksum。

    ps:读binlog的时候sleep 1 。

    [回复]

  2. junsansi
    11月 3rd, 201018:03

    强大~~~
    果然是不怕做不到,就怕想不到 ~

    [回复]

  3. lyz
    2月 23rd, 201123:06

    good idea !
    不过备份个人使用xtrabackup更为安全简单,在集群环境下可以使用shell进行统一备份

    [回复]

  4. eric
    7月 4th, 201302:21

    您好,我想问下 写入到一个临时文件,然后等临时文件写完了,去touch一个锁,写Relaylog。

    这个锁如何 toouch

    [回复]