數據庫主從複製與讀寫分離(瞭解)

在實際的生產環境中,對數據庫的讀和寫都在同一個數據庫服務器中,是不能知足實際需求的。不管是在安全性、高可用性仍是高併發等各個方面都是徹底不能知足實際需求的。所以,經過主從複製的方式來同步數據,再經過讀寫分離來提高數據庫的併發負載能力。有點相似於前面咱們學習過的rsync,可是不一樣的是rsync是對磁盤文件作備份,而mysql主從複製是對數據庫中的數據、語句作備份。java

如圖所示:mysql

wKiom1ghsBnzeV_OAADmPGxhuAs725.png-wh_50

1、 案例前置知識點sql

一、 mysq支持的複製類型數據庫

1) 基於語句的複製。在服務器上執行sql語句,在從服務器上執行一樣的語句,mysql默認採用基於語句的複製,執行效率高。segmentfault

2) 基於行的複製。把改變的內容複製過去,而不是把命令在從服務器上執行一遍。後端

3) 混合類型的複製。默認採用基於語句的複製,一旦發現基於語句沒法精確複製時,就會採用基於行的複製。緩存

二、 複製的工做過程安全

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緩存中,因此中繼日誌的開銷很小。

 

如圖所示:

wKioL1ghsOWgXg3qAABv13ob7-Y071.png-wh_50

 

三、 mysql讀寫分離原理

讀寫分離就是在主服務器上修改,數據會同步到從服務器,從服務器只能提供讀取數據,不能寫入,實現備份的同時也實現了數據庫性能的優化,以及提高了服務器安全。

wKioL1ghsR7RxjR4AADEsMgjl00181.png-wh_50

前較爲常見的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應用,若是在程序代碼中實現讀寫分離對代碼的改動就較大,因此,像這種應用通常會考慮使用代理層來實現,那麼今天就使用Amoeba爲例,完成主從複製和讀寫分離。

 

MySQLProxy介紹

下面使用MySQL官方提供的數據庫代理層產品MySQLProxy搭建讀寫分離。
MySQLProxy其實是在客戶端請求與MySQLServer之間創建了一個鏈接池。全部客戶端請求都是發向MySQLProxy,而後經由MySQLProxy進行相應的分析,判斷出是讀操做仍是寫操做,分發至對應的MySQLServer上。對於多節點Slave集羣,也能夠起作到負載均衡的效果。

 

 

實驗圖:

 

 

mysql之主從複製

MySQL讀寫分離介紹及搭建

相關文章
相關標籤/搜索