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,配置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的性能
  • 可能被用來查找與存儲引擎自身不相關的性能瓶頸


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM