簡(jiǎn)介:這是高性能mysql(基于復(fù)制架構(gòu))(多圖)的詳細(xì)頁(yè)面,介紹了和mysql,有關(guān)的知識(shí)、技巧、經(jīng)驗(yàn),和一些mysql源碼等。
Mysql復(fù)制架構(gòu)
20090810 by chaohang
這是mysql 主從復(fù)制最基本的原理圖,左邊是主 master ,右邊是從 slave, 從圖中可以清晰看到 mysql 的復(fù)制進(jìn)程, master 產(chǎn)生二進(jìn)制日志 binlog, 輸出到 binlog 文件,然后 slave 主機(jī)請(qǐng)求日志文件, master 主機(jī)發(fā)送二進(jìn)制到 slave 主機(jī),二進(jìn)制到 slave 后,寫入中繼日志, realylog ,然后 slave 主機(jī)調(diào)用 sql 進(jìn)程讀取中繼日志內(nèi)容,寫入到數(shù)據(jù)庫(kù),從而維持服務(wù)器的數(shù)據(jù)同步。
和上面不同的是,這個(gè)架構(gòu)是一個(gè)三級(jí)架構(gòu),三臺(tái)mysql 服務(wù)器組成一個(gè)鏈?zhǔn)綇?fù)制架構(gòu)
,從左至右的master--slave--slave, 前面兩個(gè),即 master--slave 和第一個(gè)圖一樣,沒什么可說的,唯一的小變化是中間的 slave 主機(jī)也開啟了二進(jìn)制日志,他把從 master 上更新到的信息寫入自身的 logbin 中,這樣的目的可以從圖中看到,為后面的 slave 主機(jī)提供二進(jìn)制日志 , 此時(shí)這臺(tái) slave 主機(jī)其實(shí)充當(dāng)了 master 主機(jī)的作用。
這個(gè)圖中說明了mysql 二進(jìn)制日志的過濾,除非你想同步所有的數(shù)據(jù)庫(kù) ( 包括 mysql 數(shù)據(jù)庫(kù),這會(huì)造成不必要的麻煩 ) ,二進(jìn)制的日志過濾主要取決于 master 主機(jī)的設(shè)置 binlog_do_db 和 binlog_ignore_db, 他們決定了什么數(shù)據(jù)會(huì)記錄到二進(jìn)制日志中,并傳送到 slave 主機(jī) , 而 slave 主機(jī)也可以通過配置一些選項(xiàng)決定怎么利用這些數(shù)據(jù) , 如 replicate_do_db,replicate_do_table 等
這個(gè)是一主多從的復(fù)制架構(gòu),實(shí)際應(yīng)用也很多, 可以用 master 來充當(dāng)更新服務(wù)器,其他的幾臺(tái) slave 充當(dāng)只讀服務(wù)器,在一定程度上分擔(dān)了數(shù)據(jù)庫(kù)流 量 , 一定確保只在 master 上更新數(shù)據(jù)。
這個(gè)一個(gè)主主復(fù)制的架構(gòu),兩臺(tái)master 互為主從,更新和讀取操作可以同時(shí)在兩臺(tái)上進(jìn)行
這是一個(gè)反例,這種復(fù)制是不被允許的,一臺(tái)slave 不可能同時(shí)接受兩臺(tái) master 的數(shù)據(jù)。
這個(gè)則是在主主復(fù)制架構(gòu)上的一個(gè)擴(kuò)展,每臺(tái)master 下面還有一層 slave 結(jié)構(gòu)
這個(gè)其實(shí)也是主主復(fù)制結(jié)構(gòu)的擴(kuò)展(我的個(gè)人理解)只是master
的結(jié)構(gòu)組成了一個(gè)環(huán)狀結(jié)構(gòu)
這個(gè)也就容易理解,在環(huán)狀結(jié)構(gòu)的基礎(chǔ)上又延伸出slave 層。
這個(gè)圖不太好理解,因?yàn)橹虚g涉及到一個(gè)blackhole (黑洞)存儲(chǔ)引擎, blackhole其實(shí)就相當(dāng)于 linux系統(tǒng)中的/dev/null
主要意思就是一主N從的結(jié)構(gòu),這里這個(gè)N可能會(huì)有很多,幾十臺(tái),百臺(tái),那這樣master主機(jī)就會(huì)為每臺(tái)slave主機(jī)分配出一個(gè)binlog dump進(jìn)程,這樣的話會(huì)嚴(yán)重影響master的性能,這樣可以考慮在主從之間添加一個(gè)分布式master,配置blackhole存儲(chǔ)引擎,他起到一個(gè) 中繼的作用,他接收數(shù)據(jù)但丟其他而不是存儲(chǔ),只是會(huì)把master的二進(jìn)制日志供下層的slave來讀取。
這里摘錄一段別人的解釋:
把blackhole引擎,用做slave,配置一些過濾規(guī)則,比如復(fù)制某些表、不復(fù)制某些表。然后也作為一個(gè)master,帶多個(gè)slave。這樣的好 處是省了一定的網(wǎng)絡(luò)帶寬,如果沒有blackhole做中間環(huán)節(jié),那么就需要把第一個(gè)master的所有日志都傳遞到各個(gè)slave上去。經(jīng)過 blackhole這一個(gè)slave兼master過濾后再傳遞給多個(gè)slave,減少了帶寬占用。而使用blackhole引擎的原因是它不占硬盤空 間,作為一個(gè)中轉(zhuǎn),只負(fù)責(zé)記日志、傳日志。
BLACKHOLE 存儲(chǔ)引擎就像
“
黑洞
”
一樣,它接收數(shù)據(jù)但丟棄它而不是存儲(chǔ)它。查詢總是返回空集。
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
表不存儲(chǔ)任何數(shù)據(jù),但是如果開啟二進(jìn)制日志
( Binary Log ),SQL
語(yǔ)句將被寫入
日志,反之
SQL
語(yǔ)句會(huì)
被過濾掉。
BLACKHOLE 表的其他用途:
* 通
過對(duì)比開啟和關(guān)閉二進(jìn)制日志
( Binary Log )
時(shí)
BLACKHOLE
的性能,來計(jì)算二進(jìn)制日志記錄的開銷。
* BLACKHOLE 本質(zhì)上是一個(gè)
“ no-op ”
存儲(chǔ)引擎,它可能被用來查找與存儲(chǔ)引擎自身不相關(guān)的性能瓶頸
下面這兩張圖也是跟blackhole 存儲(chǔ)相關(guān),等慢慢研究 blackhole 后再細(xì)細(xì)研究
最后這種情況大致的意思,有三臺(tái)mysql server,1,2和3,3做為復(fù)制從服務(wù)器,想同時(shí)復(fù)制1上的DB1和2上的DB2,這樣可以在2上引進(jìn)一個(gè)blackhole的DB1來解決問題.