MySQL 主從分離(讀寫分離)原理

文章來源:https://www.cnblogs.com/php826291930/p/11242436.html

因爲看了覺得通俗易懂,就轉載了次文章,以做備份,如果侵犯原作者相應權利,請第一時間聯繫我進行刪帖

 

1、what 什麼是讀寫分離?
讀寫分離,基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。數據庫複製被用來把事務性操作導致的變更同步到集羣中的從數據庫。

2、why 爲什麼要讀寫分離呢?
因爲數據庫的“寫”(寫10000條數據到oracle可能要3分鐘)操作是比較耗時的。 
但是數據庫的“讀”(從oracle讀10000條數據可能只要5秒鐘)。 
所以讀寫分離,解決的是,數據庫的寫入,影響了查詢的效率。

3、when 什麼時候要讀寫分離?
數據庫不一定要讀寫分離,如果程序使用數據庫較多時,而更新少,查詢多的情況下會考慮使用,利用數據庫主從同步 。可以減少數據庫壓力,提高性能。當然,數據庫也有其它優化方案。memcache 或是 表折分,或是搜索引擎。都是解決方法。

4、主從複製與讀寫分離
在實際的生產環境中,對數據庫的讀和寫都在同一個數據庫服務器中,是不能滿足實際需求的。無論是在安全性、高可用性還是高併發等各個方面都是完全不能滿足實際需求的。因此,通過主從複製的方式來同步數據,再通過讀寫分離來提升數據庫的併發負載能力。有點類似於前面我們學習過的rsync,但是不同的是rsync是對磁盤文件做備份,而mysql主從複製是對數據庫中的數據、語句做備份。

4.1、 mysq支持的複製類型

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

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

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

4.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緩存中,所以中繼日誌的開銷很小。

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

6、前較爲常見的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集羣,也可以起做到負載均衡的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章