一键搭建blackhole从库

来自业务的驱动

前一段时间,微博的双向关注业务拆分,数据库实例增多了几倍,对应的,我们要为这些实例搭建很多blackhole从库,供后面的binlog分析程序分析binlog并最终导入到redis中。整个过程比较枯燥乏味,尤其blackhole从库的搭建,花费了我们较多的精力。所以我有了写个工具的想法。

按部就班的做法

之前我们搭建blackhole从库,都是先把线上主库或者备库的表结构dump出来,然后把主库的权限库、监控库等整个拷贝过来,再change master。这种方法在采用语句级格式复制的情况下,基本可以很好的工作。但是当换成行格式复制后,blackhole从库经常卡库。追查了一下原因,发现问题出现在拷贝权限库、监控库[都是MyISAM表]的过程中。如果拷贝过程中不加锁,拷贝完毕后再在主库通过show master status记录下binlog pos点,并以此作为change master的pos点,这种方法可能存在隐患,并最终导致从库出现卡库。
在了解需求和之前方法的缺点后,我发现要非常严谨的给正在运行的主库搭建一个blackhole从库并非易事。经过和同事的一番讨论,参考了下percona xtrabackup热备数据库的方法,于是实现了这个工具。代码有兴趣的可以直接看,文章后面也有比较详细的说明。欢迎拍砖。

MySQL管理之使用XtraBackup进行热备

MySQL开源备份工具Xtrabackup备份部署

MySQL Xtrabackup备份和恢复

用XtraBackup实现MySQL的主从复制快速部署【主不锁表】

安装和使用 Percona 推出的 Xtrabackup 备份 MySQL

源代码下载见 用法说明

这个工具需要用户输入两个参数:一个主库的ip地址,一个是主库的数据库端口,这两个参数唯一的确定一个实例。

用法说明

Usage: example: blackhole_slave.py -f 10.66.10.10 -P 3307

Options:
  --version            show program's version number and exit
  -h, --help            show this help message and exit
  -f IP, --master-ip=IP
                        master ip address here
  -P PORT, --master-port=PORT
                        master port here

详细思路

按照标准的MySQL安装过程,安装好MySQL(其实就是从公司内部的源拷贝二进制文件,adduser、chown等,这些都已经自动化)。我们线上的MySQL数据库都默认安装到/data1/my${port}下。例如端口为3306,那么目录名称就是mysql3306。这主要是为了在单机启动多个实例,充分利用多核的cpu。

修改配置文件。blackhole从库的配置文件中,推荐加上skip-innodb,并把默认引擎修改为myisam。这样做的好处是:当主库上修改某些innodb表的时候,这些语句同步到从库,而从库禁用了innodb,就会被自动转化为blackhole,这正是我们需要的。要注意的是,如果主库的binlog采用的是statement,那么blackhole从库只能采用statement级别;主库是row format,从库也只能是row format。blackhole从库的配置文件已经包含在代码中,感兴趣的可以看看。

启动MySQL实例。调用的是我们自己的启动脚本。

获取线上的库表结构。为了安全,我们线上的root账号没有任何drop库和表的权限。所以这里drop数据库的方式比较怪异,采用的是rm 库文件夹的方法。这一步会从线上获取所有需要的库和表的结构,然后按照需要修改部分表的引擎为blackhole。当然,监控库和权限库的表不能被修改为blackhole。

获取权限库和监控库的数据。这个过程会先获取blackhole上需要的所有myisam表,然后用lock tables t1 read,t2 read, t3 read,… 的方式锁住主库上的所有相关表。导出这些被锁住的表的数据并导入到blackhole从库上,导完数据后,得到主库的pos点,然后释放锁。这里的导出不能采用简单的mysqldump —master-data 的方式。因为这种方式会给所有的表加上锁,这会导致线上业务受到影响。采用flush tables with read lock会面临同样的问题。

根据得到的主库pos点,在blackhole从库上change master to。检测同步状态。
至此,blackhole从库搭建完成。最后,总结一下blackhole从库的用途,期待你的新发现。

BlackHole的用途

用于binlog的备份

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7154cd54892d500dc7fbee249058a11a.html