Mysql主從復制和讀寫分離
在實際的生產環境中,如果對mysql數據庫的讀和寫都在一台數據庫服務器中操作,無論是在安全性、高可用性,還是高並發等各個方面都是不能滿足實際需求的。因此,一般通過主從復制的方式來同步數據,再通過讀寫分離來提升數據庫的並發負載能力。
Mysql主從復制和讀寫分離
一,主從復制:
Mysql的主從復制和mysql的讀寫分離兩者有緊密的聯系,首先要部署主從復制,只有主從復制完成了,才能再此基礎上進行數據的讀寫分離。
Mysql支持的復制類型:
1、 基於語句的復制:在主服務器上執行的sql語句,在從服務器上會執行同樣的語句。Mysql默認采用基於語句的復制,效率比較高,但是有時不能實現精准復制。
2, 基於行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍。
3、 混合類型的復制:默認采用基於語句的復制,一旦發現基於語句的復制不能精准復制時,就會采用基於行的復制。
二,主從復制過程:
1、 在每個事物更新數據完成之前,master在二進制日志記錄這些改變,寫入二進制日志完成后,master通知存儲引擎提交事物。
2、 Slave將master的binary log復制到其中的中繼日志。首先從mysql服務器開始一個工作線程I/O線程,I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master。他會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日志。
3、Sql從線程處理該過程的最后一步。Sql線程從中繼日志中讀取事件,並重放其中的事件而更新slave的數據,使其與master的數據一致。
三、讀寫分離
簡單的來說,讀寫分離就是只在mysql主服務器上寫,只在mysql從服務器上讀。基本原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中的數據庫。
目前較為常見的mysql讀寫分離有兩種:
1、 基於程序代碼的內部實現
在代碼中根據select、insert進行路由分類,這類方法也是目前生產環境中較為常用的,優點是性能較好,因為在程序代碼中實現,不需要增加額外的設備作為硬件開支;缺點是需要研發人員來實現,運維人員無從下手。
2、 基於中間代理層實現
代理一般位於客戶端和服務器之間,代理服務器接收到客戶端請求后通過判斷后轉發到后端數據庫。如下有兩個常用代理:
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的優勢在於使用圖形化的用戶界面,可以讓用戶管理更加輕松。