MYSQL中的BlackHole引擎
MYSQL中的BlackHole引擎
http://blog.csdn.net/ylspirit/article/details/7234021
http://blog.chinaunix.net/uid-22646981-id-3271711.html
MySQL在5.x系列提供了Blackhole引擎–“黑洞”.? 其作用正如其名字一樣:任何寫入到此引擎的數據均會被丟棄掉, 不做實際存儲;Select語句的內容永遠是空。 和Linux中的 /dev/null 文件完成的作用完全一致。
那么, 一個不能存儲數據的引擎有什么用呢?
Blackhole雖然不存儲數據,但是MySQL還是會正常的記錄下Binlog,而且這些Binlog還會被正常的同步到Slave上,可以在Slave上對數據進行后續的處理。 這樣對于在Master上只需要Binlog而不需要數據的場合下,balckhole就有用了。
BlackHole 還可以用在以下場景
Mysql復制架構
?
?
這是mysql主從復制最基本的原理圖,左邊是主master,右邊是從slave,從圖中可以清晰看到mysql的復制進程,master產生二進制日志binlog,輸出到binlog文件,然后slave主機請求日志文件,master主機發送二進制到slave主機,二進制到slave后,寫入中繼日志,realylog,然后slave主機調用sql進程讀取中繼日志內容,寫入到數據庫,從而維持服務器的數據同步。
?
和上面不同的是,這個架構是一個三級架構,三臺mysql服務器組成一個鏈式復制架構
,從左至右的master–slave–slave,前面兩個,即master–slave和第一個圖一樣,沒什么可說的,唯一的小變化是中間的slave主機也開啟了二進制日志,他把從master上更新到的信息寫入自身的logbin中,這樣的目的可以從圖中看到,為后面的slave主機提供二進制日志,此時這臺slave主機其實充當了master主機的作用。
?
這個圖中說明了mysql二進制日志的過濾,除非你想同步所有的數據庫(包括mysql數據庫,這會造成不必要的麻煩),二進制的日志過濾主要取決于master主機的設置binlog_do_db和binlog_ignore_db,他們決定了什么數據會記錄到二進制日志中,并傳送到slave主機,而slave主機也可以通過配置一些選項決定怎么利用這些數據,如replicate_do_db,replicate_do_table等
?
這個是一主多從的復制架構,實際應用也很多,可以用master來充當更新服務器,其他的幾臺slave充當只讀服務器,在一定程度上分擔了數據庫流 量,一定確保只在master上更新數據。
這個一個主主復制的架構,兩臺master互為主從,更新和讀取操作可以同時在兩臺上進行
這是一個反例,這種復制是不被允許的,一臺slave不可能同時接受兩臺master的數據,不過我們可以考慮其他的辦法來實現,比如后面的blackhole數據存儲引擎就可以實現。
這個則是在主主復制架構上的一個擴展,每臺master下面還有一層slave結構
這個其實也是主主復制結構的擴展(我的個人理解)只是master的結構組成了一個環狀結構
這個也就容易理解,在環狀結構的基礎上又延伸出slave層。
這個圖不太好理解,因為中間涉及到一個blackhole(黑洞)存儲引擎,blackhole其實就相當于 linux系統中的/dev/null
主 要意思就是一主N從的結構,這里這個N可能會有很多,幾十臺,百臺,那這樣master主機就會為每臺slave主機分配出一個binlog dump進程,這樣的話會嚴重影響master的性能,這樣可以考慮在主從之間添加一個分布式master,配置blackhole存儲引擎,他起到一個 中繼的作用,他接收數據但丟其他而不是存儲,只是會把master的二進制日志供下層的slave來讀取。
?
這里摘錄一段別人的解釋:
?
把blackhole引擎,用做slave,配置一些過濾規則,比如復制某些表、不復制某些表。然后也作為一個master,帶多個slave。這樣的好 處是省了一定的網絡帶寬,如果沒有blackhole做中間環節,那么就需要把第一個master的所有日志都傳遞到各個slave上去。經過 blackhole這一個slave兼master過濾后再傳遞給多個slave,減少了帶寬占用。而使用blackhole引擎的原因是它不占硬盤空 間,作為一個中轉,只負責記日志、傳日志。
?
BLACKHOLE?存儲引擎就像?“?黑洞?”?一樣,它接收數據但丟棄它而不是存儲它。查詢總是返回空集。
mysql>?CREATE?TABLE?test(i?INT,?c?CHAR(10))?ENGINE?=?BLACKHOLE;
Query?OK,?0?rows?affected?(0.01?sec)
mysql>?INSERT?INTO?test?VALUES(1,’record?one’),(2,’record?two’);
Query?OK,?2?rows?affected?(0.00?sec)
Records:?2?Duplicates:?0?Warnings:?0
mysql>?SELECT?*?FROM?test;
Empty?set?(0.00?sec)
雖然?BLACKHOLE?表不存儲任何數據,但是如果開啟二進制日志?(?Binary?Log?),SQL?語句將被寫入 日志,反之?SQL?語句會 被過濾掉。
BLACKHOLE?表的其他用途:
*??通 過對比開啟和關閉二進制日志?(?Binary?Log?)?時?BLACKHOLE?的性能,來計算二進制日志記錄的開銷。
*??BLACKHOLE?本質上是一個?“?no-op?”?存儲引擎,它可能被用來查找與存儲引擎自身不相關的性能瓶頸
下面這兩張圖也是跟blackhole存儲相關,等慢慢研究blackhole后再細細研究
最后這種情況大致的意思,有三臺mysql server,1,2和3,3做為復制從服務器,想同時復制1上的DB1和2上的DB2,這樣可以在2上引進一個blackhole的DB1來解決問題.
?
來源:http://blog.csdn.net/zhaohang1983/archive/2009/08/11/4432634.aspx
?
總結
以上是生活随笔為你收集整理的MYSQL中的BlackHole引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Oracle的resetlogs机制浅析
- 下一篇: 1609: [Usaco2008 Feb
