MySQL主從同步原理

2022-09-17 17:45:12 字數 3040 閱讀 8507

1.mysql主從複製與讀寫分離原理

首先,我們看乙個圖:

影響mysql-a資料庫的操作,在資料庫執行後,都會寫入本地的日誌系統a中。

假設,實時的將變化了的日誌系統中的資料庫事件操作,在mysql-a的3306埠,通過網路發給mysql-b。

mysql-b收到後,寫入本地日誌系統b,然後一條條的將資料庫事件在資料庫中完成。

那麼,mysql-a的變化,mysql-b也會變化,這樣就是所謂的mysql的複製,即mysql replication。

在上面的模型中,mysql-a就是主伺服器,即master,mysql-b就是從伺服器,即sl**e。

日誌系統a,其實它是mysql的日誌型別中的二進位制日誌,也就是專門用來儲存修改資料庫表的所有動作,即bin log。【注意mysql會在執行語句之後,釋放鎖之前,寫入二進位制日誌,確保事務安全】

日誌系統b,並不是二進位制日誌,由於它是從mysql-a的二進位制日誌複製過來的,並不是自己的資料庫變化產生的,有點接力的感覺,稱為中繼日誌,即relay log。

可以發現,通過上面的機制,可以保證mysql-a和mysql-b的資料庫資料一致,但是時間上肯定有延遲,即mysql-b的資料是滯後的。

【即便不考慮什麼網路的因素,mysql-a的資料庫操作是可以併發的執行的,但是mysql-b只能從relay log中讀一條,執行下。因此mysql-a的寫操作很頻繁,mysql-b很可能跟不上。】

2.主從複製的幾種方式

同步複製

所謂的同步複製,意思是master的變化,必須等待sl**e-1,sl**e-2,...,sl**e-n完成後才能返回。

這樣,顯然不可取,也不是mysql複製的預設設定。比如,在web前端頁面上,使用者增加了條記錄,需要等待很長時間。

非同步複製

如同ajax請求一樣。master只需要完成自己的資料庫操作即可。至於sl**es是否收到二進位制日誌,是否完成操作,不用關心。mysql的預設設定。

半同步複製

master只保證sl**es中的乙個操作成功,就返回,其他sl**e不管。

這個功能,是由google為mysql引入的。

3.主從複製分析

問題1:master的寫操作,sl**es被動的進行一樣的操作,保持資料一致性,那麼sl**e是否可以主動的進行寫操作?

假設sl**e可以主動的進行寫操作,sl**e又無法通知master,這樣就導致了master和sl**e資料不一致了。因此sl**e不應該進行寫操作,至少是sl**e上涉及到複製的資料庫不可以寫。實際上,這裡已經揭示了讀寫分離的概念。

問題2:主從複製中,可以有n個sl**e,可是這些sl**e又不能進行寫操作,要他們幹嘛?

可以實現資料備份。

類似於高可用的功能,一旦master掛了,可以讓sl**e頂上去,同時sl**e提公升為master。

異地容災,比如master在北京,**掛了,那麼在上海的sl**e還可以繼續。

主要用於實現scale out,分擔負載,可以將讀的任務分散到sl**es上。

【很可能的情況是,乙個系統的讀操作遠遠多於寫操作,因此寫操作發向master,讀操作發向sl**es進行操作】

問題3:主從複製中有master,sl**e1,sl**e2,...等等這麼多mysql資料庫,那比如乙個j**a web應用到底應該連線哪個資料庫?

當 然,我們在應用程式中可以這樣,insert/delete/update這些更新資料庫的操作,用connection(for master)進行操作,select用connection(for sl**es)進行操作。那我們的應用程式還要完成怎麼從sl**es選擇乙個來執行select,例如簡單的輪循演算法。

這樣的話,相當於應用程式完成了sql語句的路由,而且與mysql的主從複製架構非常關聯,一旦master掛了,某些sl**e掛了,那麼應用程式就要修改了。能不能讓應用程式與mysql的主從複製架構沒有什麼太多關係呢?可以看下面的圖:

mysql proxy並不負責,怎麼從眾多的sl**es挑乙個?可以交給另乙個元件(比如haproxy)來完成。

這就是所謂的mysql read write splite,mysql的讀寫分離。

問題4:如果mysql proxy , direct , master他們中的某些掛了怎麼辦?

**一般都會弄個副**,以防不測。同樣的,可以給這些關鍵的節點來個備份。

問題5:當master的二進位制日誌每產生乙個事件,都需要發往sl**e,如果我們有n個sl**e,那是發n次,還是只發一次?

如果只發一次,發給了sl**e-1,那sl**e-2,sl**e-3,...它們怎麼辦?

顯 然,應該發n次。實際上,在mysql master內部,維護n個執行緒,每乙個執行緒負責將二進位制日誌檔案發往對應的sl**e。master既要負責寫操作,還的維護n個執行緒,負擔會很重。可 以這樣,sl**e-1是master的從,sl**e-1又是sl**e-2,sl**e-3,...的主,同時sl**e-1不再負責select。 sl**e-1將master的複製執行緒的負擔,轉移到自己的身上。這就是所謂的多級複製的概念。

問題6:當乙個select發往mysql proxy,可能這次由sl**e-2響應,下次由sl**e-3響應,這樣的話,就無法利用查詢快取了。

應該找乙個共享式的快取,比如memcache來解決。將sl**e-2,sl**e-3,...這些查詢的結果都快取至mamcache中。

問題7:隨著應用的日益增長,讀操作很多,我們可以擴充套件sl**e,但是如果master滿足不了寫操作了,怎麼辦呢?

scale on ?更好的伺服器? 沒有最好的,只有更好的,太貴了。。。

scale out ? 主從複製架構已經滿足不了。

可以分庫【垂直拆分】,分表【水平拆分】。

mysql主從同步原理

主從同步 實際上,你讀的主庫和從庫都可以,但是寫的肯定是進入到主庫里,然後從庫在讀binlog,從庫同步 binlog檔案是以二進位制形式儲存的 主庫執行 sql 寫binglog 同步到從庫執行 什麼叫同步,就是insert 或者update或者delete 都會操作主庫,每執行一條語句,都會寫入...

mysql主從同步原理

mysql主從同步原理 mysql主從同步原理 1.主從同步機制 1.1 主從同步介紹和優點 在多台資料伺服器中,分為 主伺服器和從伺服器 一台主伺服器對應多台從伺服器。主伺服器只負責寫入資料 從伺服器只負責同步主伺服器的資料,並讓外部程式讀取資料。主伺服器寫入資料後,即刻將寫入資料的命令傳送給從伺...

mysql主從同步原理

1.master伺服器將資料的改變都記錄到二進位制binlog日誌中 2.salve伺服器會在一定時間間隔內對master二進位制日誌進行探測其是否發生改變,如果發生改變,則開始乙個i o thread請求master二進位制事件 3.同時主節點為每個i o執行緒啟動乙個dump執行緒,用於向其傳送...