前言:咱們前面搭建過LAMP和LNMP,作過了web服務器羣集和熱備,web服務器壞了咱們是不怕了,可是咱們要知道,網站的數據有不少是存儲在數據庫裏面的,例如註冊的會員,發的文章,購物的訂單等信息。固然咱們能夠給數據庫作備份,可是若是天天00:00作一次備份,那麼若是在23:59數據丟失了,那麼就會丟失一天的數據,有沒有一種方法能實現實時備份,就是說有數據產生就當即備份,答案固然是有,也就是今天咱們要學習的mysql主從複製。有點相似於前面咱們學習過的rsync,可是不一樣的是rsync是對磁盤文件作備份,而mysql主從複製是對數據庫中的數據,語句作備份。另外讀寫分離主要是爲了優化數據庫。
1、mysql主從複製的工做原理
一、mysq支持的複製類型
1)基於語句的複製。在服務器上執行sql語句,在從服務器上執行一樣的語句,mysql默認採用基於語句的複製,執行效率高。
2)基於行的複製。把改變的內容複製過去,而不是把命令在從服務器上執行一遍。
3)混合類型的複製。默認採用基於語句的複製,一旦發現基於語句沒法精確複製時,就會採用基於行的複製。java
二、複製的工做過程
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緩存中,因此中繼日誌的開銷很小。mysql
三、mysql讀寫分離原理
讀寫分離就是在主服務器上修改,數據會同步到從服務器,從服務器只能提供讀取數據,不能寫入,實現備份的同時也實現了數據庫性能的優化,以及提高了服務器安全。
目前較爲常見的Mysql讀寫分離分爲兩種web
1)基於程序代碼內部實現
在代碼中根據select 、insert進行路由分類,這類方法也是目前生產環境下應用最普遍的。優勢是性能較好,由於程序在代碼中實現,不須要增長額外的硬件開支,缺點是須要開發人員來實現,運維人員無從下手。sql
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應用,若是在程序代碼中實現讀寫分離對代碼的改動就較大,因此,像這種應用通常會考慮使用代理層來實現。後端