1.MySQl主從復制
-
原理:將主服務器的binlog日志復制到從服務器上執行一遍,達到主從數據的一致狀態。
-
過程:從庫開啟一個I/O線程,向主庫請求Binlog日志。主節點開啟一個binlog dump線程,檢查自己的二進制日志,並發送給從節點;從庫將接收到的數據保存到中繼日志(Relay log)中,另外開啟一個SQL線程,把Relay中的操作在自身機器上執行一遍
-
優點:
- 作為備用數據庫,並且不影響業務
- 可做讀寫分離,一般是一個寫庫,一個或多個讀庫,分布在不同的服務器上,充分發揮服務器和數據庫的性能,但要保證數據的一致性
2.主從復制的日志格式
這里的日志格式就是指二進制日志的三種格式:基於語句statement的復制、基於行row的復制、基於語句和行(mix)的復制。其中基於row的復制方式更能保證主從庫數據的一致性,但日志量較大,在設置時考慮磁盤的空間問題
show variables like ‘%binlog%format%’; #查看當前使用的binlog的格式
set binlog_format = ‘row’; #設置格式,這種方法只在當前session生效
set global binlog_format = ‘row’; #在全局下設置binlog格式,會影響所有的Session
3.復制架構
3.1、一主多從架構
在主庫的請求壓力非常大時,可通過配置一主多從復制架構實現讀寫分離,把大量對實時性要求不是很高的請求通過負載均衡分發到多個從庫上去讀取數據,降低主庫的讀取壓力。而且在主庫出現宕機時,可將一個從庫切換為主庫繼續提供服務
3.2、多級復制架構
因為每個從庫在主庫上都會有一個獨立的Binlog Dump線程來推送binlog日志,所以隨着從庫數量的增加,主庫的IO壓力和網絡壓力也會隨之增加,這時,多級復制架構應運而生。
多級復制架構只是在一主多從的基礎上,再主庫和各個從庫之間增加了一個二級主庫Master2,這個二級主庫僅僅用來將一級主庫推送給它的BInlog日志再推送給各個從庫,以此來減輕一級主庫的推送壓力。
但它的缺點就是Binlog日志要經過兩次復制才能到達從庫,增加了復制的延時。
我們可以通過在二級從庫上應用Blackhol存儲引擎(黑洞引擎)來解決這一問題,降低多級復制的延時。
“黑洞引擎”就是寫入Blackhole表中數據並不會寫到磁盤上,所以這個Blackhole表永遠是個空表,對數據的插入/更新/刪除操作僅在Binlog中記錄,並復制到從庫中去。
3.3、雙主復制/Dual Master架構
雙主復制架構適用於需要進行主從切換的場景
在只有一個主庫的架構下,當主庫宕機后,將其中一個從庫切換為主庫繼續提供服務。原來的主庫就沒有數據來源了,那么當這個新的主庫接收到新的數據時,原來的主庫卻沒有同步,因此他們的數據差異越來越大,那么原來的主庫就無法成為主從復制環境中的一員了。當原來的主庫恢復正常后,需要重新將其添加進復制環境中去。
那為了避免重復添加主庫的問題,雙主復制應運而生。兩個數據庫互為主從,當主庫宕機恢復后,由於它還是原來從庫(現在主庫)的從機,所以它還是會復制新的主庫上的數據。那么無論主庫的角色怎么切換,原來的主庫都不會脫離復制環境。
4.復制方式
MySQL的主從復制有兩種復制方式,分別是異步復制和半同步復制
4.1異步復制
1、邏輯上
MySQL默認的復制即是異步的,主庫在執行完客戶端提交的事務后會立即將結果返給給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能並沒有傳到從庫上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。
2、技術上
主庫將事務 Binlog 事件寫入到 Binlog 文件中,此時主庫只會通知一下 Dump 線程發送這些新的 Binlog,然后主庫就會繼續處理提交操作,而此時不會保證這些 Binlog 傳到任何一個從庫節點上。
4.2全同步復制
1、邏輯上
指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。
2、技術上
當主庫提交事務之后,所有的從庫節點必須收到、APPLY並且提交這些事務,然后主庫線程才能繼續做后續操作。但缺點是,主庫完成一個事務的時間會被拉長,性能降低。
4.3半同步復制
1、邏輯上
是介於全同步復制與全異步復制之間的一種,主庫只需要等待至少一個從庫節點收到並且 Flush Binlog 到 Relay Log 文件即可,主庫不需要等待所有從庫給主庫反饋。同時,這里只是一個收到的反饋,而不是已經完全完成並且提交的反饋,如此,節省了很多時間。
2、技術上
介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。