在實際的生產環境中,若是對mysql數據庫的讀和寫都在一臺數據庫服務器中操做,不管是在安全性、高可用性,仍是高併發等各個方面都是不能知足實際需求的。所以,通常經過主從複製的方式來同步數據,再經過讀寫分離來提高數據庫的併發負載能力。 Mysql主從複製和讀寫分離 l 主從複製: Mysql的主從複製和mysql的讀寫分離二者有緊密的聯繫,首先要部署主從複製,只有主從複製完成了,才能再此基礎上進行數據的讀寫分離。 Mysql支持的複製類型: 一、 基於語句的複製:在主服務器上執行的sql語句,在從服務器上會執行一樣的語句。Mysql默認採用基於語句的複製,效率比較高,可是有時不能實現精準複製。 二、 基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍。 三、 混合類型的複製:默認採用基於語句的複製,一旦發現基於語句的複製不能精準複製時,就會採用基於行的複製。 l 主從複製的過程: 一、 在每一個事物更新數據完成以前,master在二進制日誌記錄這些改變,寫入二進制日誌完成後,master通知存儲引擎提交事物。 二、 Slave將master的binary log複製到其中的中繼日誌。首先從mysql服務器開始一個工做線程I/O線程,I/O線程在master上打開一個普通的鏈接,而後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,若是已經跟上master。他會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。 三、 Sql從線程處理該過程的最後一步。Sql線程從中繼日誌中讀取事件,並重放其中的事件而更新slave的數據,使其與master的數據一致。 l 讀寫分離 簡單的來講,讀寫分離就是隻在mysql主服務器上寫,只在mysql從服務器上讀。基本原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫複製被用來把事務性查詢致使的變動同步到集羣中的數據庫。 目前較爲常見的mysql讀寫分離有兩種: 一、 基於程序代碼的內部實現 在代碼中根據select、insert進行路由分類,這類方法也是目前生產環境中較爲經常使用的,優勢是性能較好,由於在程序代碼中實現,不須要增長額外的設備做爲硬件開支;缺點是須要研發人員來實現,運維人員無從下手。 二、 基於中間代理層實現 代理通常位於客戶端和服務器之間,代理服務器接收到客戶端請求後經過判斷後轉發到後端數據庫。以下有兩個經常使用代理: Mysql-proxy:其爲mysql的開源項目,經過其自帶的lua腳本進行sql判斷,雖然是mysql官方產品,可是mysql官方並不建議其使用到生產環境中。 Amoeba:由陳思儒開發,該程序由Java語言進行開發。這個軟件致力於mysql的分佈式數據庫前端代理層,它主要爲應用層訪問mysql的時候充當sql路由功能。Amoeba可以完成多數據源的高可用、負載均衡、數據切片等功能。 經常使用的mysql鏈接工具: phpMyAdmin phpMyAdmin是咱們經常使用的MySQL管理工具之一,它是用PHP開發的基於Web方式架構在網站主機上的MySQL管理工具,支持中文,管理數據庫也十分方便。主要缺點在對大數據庫的備份和恢復不是十分方便。 Navicat Navicat是一款桌面版MySQL管理工具,它和微軟的SQLServer的管理器很像,簡單易用。Navicat的優點在於使用圖形化的用戶界面,可讓用戶管理更加輕鬆。