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,配置blackhole存儲引擎,他起到一個中繼的作用,他接收數據但丟其他而不是存儲,只是會把master的二進制日志供下層的slave來讀取。
第一,讓B服務器不再執行查詢操作;
第二,讓B服務器不再執行寫操作;
第三,負責多線程為每個從服務器提供數據,那么就不需要在B服務器存儲數據了,但是需要提供二進制日志和中繼日志,但B服務器又不需要數據庫;
把blackhole引擎,用做slave,配置一些過濾規則,比如復制某些表、不復制某些表。然后也作為一個master,帶多個slave。這樣的好 處是省了一定的網絡帶寬,如果沒有blackhole做中間環節,那么就需要把第一個master的所有日志都傳遞到各個slave上去。經過 blackhole這一個slave兼master過濾后再傳遞給多個slave,減少了帶寬占用。而使用blackhole引擎的原因是它不占硬盤空 間,作為一個中轉,只負責記日志、傳日志。
如何設置呢?
先查看一下當下mysql支持的引擎列表;

沒找到blackhole引擎,那么接下來安裝。
mysql> INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';

要設置 default_storage_engine=blackhole 就能實現主從 使用不一致的存儲引擎。
補充:如果使用blackhole引擎創建的表,在執行insert操作后,再查詢,是沒有數據的,因為創建的時候只有.frm表結構文件。
BLACKHOLE總結
- BLACKHOLE支持所有類型的索引
- BLACKHOLE 表不存儲數據,如果復制基於SBR,語句可以記錄並在從庫執行;如果復制為RBR、MBR,UPDATE及DELETE操作將會跳過,不會記錄也從庫不執行。
- Insert觸發器可以正常使用,Update、Delete觸發器因為不存儲數據不能觸發,FOR EACH ROW 也不能觸發。
- BLACKHOLE 表Auto Increment字段不會自動遞增,也不保留自增字段的狀態
- 結合復制replicate-do和replicate-ignore規則,可使用BLACKHOLE當做一個分發主服務器
- 可用來驗證轉儲文件語法
- 測試binlog的開銷量,通過對比 BLACKHOLE 與 不啟動 binlog的性能
- 可能被用來查找與存儲引擎自身不相關的性能瓶頸
