1. 程式人生 > >MySQL的主從復制與讀寫分離原理

MySQL的主從復制與讀寫分離原理

訂單 中繼 運維 提交 磁盤 com 引擎 庫服務器 文件

前言:我們前面搭建過LAMP和LNMP,做過了web服務器群集和熱備,web服務器壞了我們是不怕了,但是我們要知道,網站的數據有很多是存儲在數據庫裏面的,例如註冊的會員,發的文章,購物的訂單等信息。當然我們可以給數據庫做備份,但是如果每天00:00做一次備份,那麽如果在23:59數據丟失了,那麽就會丟失一天的數據,有沒有一種方法能實現實時備份,就是說有數據產生就立即備份,答案當然是有,也就是今天我們要學習的mysql主從復制。有點類似於前面我們學習過的rsync,但是不同的是rsync是對磁盤文件做備份,而mysql主從復制是對數據庫中的數據,語句做備份。另外讀寫分離主要是為了優化數據庫。
一、mysql主從復制的工作原理
1、mysq支持的復制類型
1)基於語句的復制。在服務器上執行sql語句,在從服務器上執行同樣的語句,mysql默認采用基於語句的復制,執行效率高。
2)基於行的復制。把改變的內容復制過去,而不是把命令在從服務器上執行一遍。
3)混合類型的復制。默認采用基於語句的復制,一旦發現基於語句無法精確復制時,就會采用基於行的復制。

2、復制的工作過程
技術分享圖片
1)在每個事務更新數據完成之前,master在二進制日誌記錄這些改變。寫入二進制日誌完成後,master通知存儲引擎提交事務。
2)Slave將master的binary log復制到其中繼日誌。首先slave開始一個工作線程(I/O),I/O線程在master上打開一個普通的連接,然後開始binlog dump process。binlog dump process從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件,I/O線程將這些事件寫入中繼日誌。

3)Sql slave thread(sql從線程)處理該過程的最後一步,sql線程從中繼日誌讀取事件,並重放其中的事件而更新slave數據,使其與master中的數據一致,只要該線程與I/O線程保持一致,中繼日誌通常會位於os緩存中,所以中繼日誌的開銷很小。

3、mysql讀寫分離原理
讀寫分離就是在主服務器上修改,數據會同步到從服務器,從服務器只能提供讀取數據,不能寫入,實現備份的同時也實現了數據庫性能的優化,以及提升了服務器安全。
技術分享圖片
目前較為常見的Mysql讀寫分離分為兩種

1)基於程序代碼內部實現
在代碼中根據select 、insert進行路由分類,這類方法也是目前生產環境下應用最廣泛的。優點是性能較好,因為程序在代碼中實現,不需要增加額外的硬件開支,缺點是需要開發人員來實現,運維人員無從下手。

2)基於中間代理層實現
代理一般介於應用服務器和數據庫服務器之間,代理數據庫服務器接收到應用服務器的請求後根據判斷後轉發到,後端數據庫,有以下代表性的程序。
(1)mysql_proxy。mysql_proxy是Mysql的一個開源項目,通過其自帶的lua腳本進行sql判斷。
(2)Atlas。是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas運行的mysql業務,每天承載的讀寫請求數達幾十億條。支持事物以及存儲過程。
(3)Amoeba。由阿裏巴巴集團在職員工陳思儒使用序java語言進行開發,阿裏巴巴集團將其用戶生產環境下,但是他並不支持事物以及存數過程。

不是所有的應用都能夠在基於程序代碼中實現讀寫分離,像一些大型的java應用,如果在程序代碼中實現讀寫分離對代碼的改動就較大,所以,像這種應用一般會考慮使用代理層來實現。

MySQL的主從復制與讀寫分離原理