MySQL的BlackHole引擎在主從架構中的作用

OldBoy~發表於2017-12-22

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

相關文章