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集群,也可以起做到負載均衡的效果。