MySQL讀寫分離是在主從復制的基礎上進一步通過在master上執(zhí)行寫操作,在slave上執(zhí)行讀操作來實現(xiàn)的。通過主從復制,master上的數(shù)據改動能夠同步到slave上,從而保持了數(shù)據的一致性。實現(xiàn)數(shù)據的讀寫分離能帶來的好處有:
增加物理服務器,提升機器處理能力,也就是拿硬件換性能。
主從只負責各自的讀和寫,極大程度緩解X鎖和S鎖爭用。
slave可以配置myIasm引擎,提升查詢性能以及節(jié)約系統(tǒng)開銷。
master直接寫是并發(fā)的,slave通過主庫發(fā)送來的binlog恢復數(shù)據是異步。
slave可以單獨設置一些參數(shù)來提升其讀的性能。
增加冗余,提高可用性。
常見的實現(xiàn)數(shù)據庫讀寫分離的方案大致有兩種:應用層,代理層
在應用層也就是在代碼中進行操作,通過對數(shù)據庫操作類型的不同手動指定數(shù)據源,可以通過AOP的方式進行實現(xiàn),不過對于一個已經搭建起來并正在運行的系統(tǒng)來說,這個方案應該比較復雜。
另外一種實現(xiàn)方式是通過數(shù)據庫代理層,代理對應用層呢個是透明的,所有的讀寫分離操作由代理層來完成,好處就是對于開發(fā)應用層來說是透明的,不需要管理數(shù)據源,缺點在于應用原來直接訪問數(shù)據庫現(xiàn)在變成了通過代理訪問數(shù)據庫,性能上肯定會有影響,不過如果代理層實現(xiàn)的很優(yōu)秀的話這個影響應該不大。
通過代理層實現(xiàn)數(shù)據庫讀寫分離又有兩種方案可供選擇,其一是使用MySQL-Proxy,另一種是使用Amoeba。最開始找到的實現(xiàn)方案是基于MySQL-Proxy的,由于它沒有配置文件,所要完成的工作需要由Lua腳本來實現(xiàn),這對于一個Lua門外漢來說壓力不小。后來找到的Amoeba實現(xiàn)起來很簡單,只需要簡單地配置就能實現(xiàn)數(shù)據庫的讀寫分離,所以這里記錄我通過使用Amoeba來實現(xiàn)數(shù)據庫讀寫分離的過程。
Amoeba簡介:
Amoeba(變形蟲)致力于MySQL的分布式數(shù)據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專注于分布式數(shù)據庫代理層(Database Proxy)開發(fā)。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數(shù)據庫、可并發(fā)請求多臺數(shù)據庫合并結果。 通過Amoeba你能夠完成多數(shù)據源的高可用、負載均衡、數(shù)據切片的功能。
Amoeba使用:
一、準備工作
amoeba使用java編寫,所以運行amoeba的運行環(huán)境要安裝好java環(huán)境,并配置好環(huán)境變量,jdk版本要在1.5以上,因為amoeba就是用jdk1.5編寫的;我的服務器java版本為1.7。
amoeba是在主從同步的基礎上工作的,所以要先配置好MySQL的主從同步功能,我在另一篇日志中記錄了我實現(xiàn)Mysql主從同步的過程,可以參考:MySQL主從復制(Master-Slave)實