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