vlambda博客
学习文章列表

MySQL的BlackHole引擎在主从架构中的作用

MySQL在5.X系列提供了Blackhole引擎“黑洞”,其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉,不做实际存储;select语句的内容永远是空的。和Linux中的/dev/null文件完成的作用完全一致。那么,一个不能存储数据的引擎有什么作用呢?

在大规模的MySQL服务器集群中,如果是存在一台主服务,多台从服务器,在繁忙的业务中,意味着主服务器每操作一个时间,都要往自己的二进制日志中写数据,同时还要往多台从服务器发一次,N台服务器指向一台主服务器,那么需要主服务器发送N次,会启动N个线程,每个线程各自从线程里读二进制日志,那么会有大量的IO,本来是为主服务器减轻负担的,那么这样只能造成压力越来越大,这样的master主机就会为每台slave主机分配出一个binlog dump进程,这样的话会严重影响master的性能。

解决这个问题可以采用多级复制,主服务器还是保持柱位置A,再拿一台服务器作为从服务器B,主服务器A只启动一个线程指向从服务器B,那么B服务器再作为其他N太服务器的主,那么B就启动了多线程,怎么给B服务器减轻压力呢?

在主从之间添加一个分布式master,配置balckhole存储引擎,他起到一个中继的作用,他接收数据但丢弃而不是存储,只是会把master的二进制日志供下层的slave来读取。

第一,让B服务器不再执行查询操作;

第二,让B服务器不再执行写操作;

第三,负责多线程为每个从服务器提供数据,那么就不需要在B服务器存储数据了,但是需要提供二进制日志和中继日志,但B服务器又不需要数据库;

把blackhole引擎,用作slave,配置一些过滤规则,比如复制某些表,不复制某些表。然后也作为一个master,带多个slave。这样的好处是省了一定的网络带宽,如果没有blackhole做中间环节,俺么就需要第一个master的所有日志都传递到各个slave上去。经过blackhole这一个slave兼master过滤后再传递给多个slave,减少带宽作用。而使用blackhole引擎的原因是它不占磁盘空间,作为一个中转,只负责记日志、传日志。

如何设置呢?

先查看一下当前mysql支持的引擎列表;

mysql> show engines;

+--------------------+---------+----------------------------------------------------------------+--------------+-----

| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |

+--------------------+---------+----------------------------------------------------------------+--------------+-----

| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |

| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |

| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES       |

| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |

| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |

| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |

| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |

| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |

| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |

+--------------------+---------+----------------------------------------------------------------+--------------+-----

9 rows in set (0.00 sec)

我的数据库已经支持blackhole,如果不支持就按照下列方法安装下

mysql>install plugin blackhole soname 'ha_blackhole.so';

设置default_storage_engine=blackhole就能实现主从使用不一致的存储引擎了。

补充:如果使用blackhole引擎创建的表,在执行insert操作后,再查询,是没有数据的,因为创建的时候只有.frm表结构文件