java读取mysql配置文件_Linux运维:MySQL读写分离解决方案
一次性付費(fèi)進(jìn)群,長(zhǎng)期免費(fèi)索取教程,沒(méi)有付費(fèi)教程。
進(jìn)微信群回復(fù)公眾號(hào):微信群;QQ群:460500587
?教程列表?見(jiàn)微信公眾號(hào)底部菜單 |??本文底部有推薦書籍?微信公眾號(hào):計(jì)算機(jī)與網(wǎng)絡(luò)安全
ID:Computer-network
在MMM集群架構(gòu)中,通過(guò)提供虛擬的讀、寫IP地址,將數(shù)據(jù)庫(kù)的讀寫功能分離出來(lái),但是這僅僅設(shè)定了讀、寫的VIP地址,并沒(méi)有真正實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)中所說(shuō)的讀、寫分離功能,因?yàn)閼?yīng)用程序不可能在需要讀的時(shí)候就去找可讀的VIP,在寫的時(shí)候就去找可寫的VIP,要解決這個(gè)問(wèn)題,可由兩種方法來(lái)實(shí)現(xiàn)。
第一種實(shí)現(xiàn)讀、寫分離的方式是通過(guò)修改程序,將讀、寫操作提取出來(lái),并分別在程序的連接池中設(shè)定可讀、可寫的VIP地址,這種方法要修改業(yè)務(wù)系統(tǒng)的程序,實(shí)現(xiàn)起來(lái)相對(duì)比較困難,如果是新開(kāi)發(fā)的程序,可以在開(kāi)發(fā)時(shí)就預(yù)留這樣的接口,而如果程序已經(jīng)在運(yùn)行,修改的難度是相當(dāng)大的,采用這種方法基本行不通。
第二種實(shí)現(xiàn)讀、寫分離的方法是通過(guò)一個(gè)數(shù)據(jù)庫(kù)透明代理,也就是在業(yè)務(wù)系統(tǒng)和數(shù)據(jù)庫(kù)之間提供一個(gè)代理接口,由這個(gè)接口來(lái)完成業(yè)務(wù)系統(tǒng)讀、寫請(qǐng)求的分發(fā),將讀操作分發(fā)到后端只讀的數(shù)據(jù)庫(kù)服務(wù)器上,而將寫請(qǐng)求分發(fā)到后端可寫的數(shù)據(jù)庫(kù)服務(wù)器上。常見(jiàn)的讀、寫分離軟件有Amoeba和MySQL-Proxy。
MySQL-Proxy是MySQL官方推出的一個(gè)處在業(yè)務(wù)系統(tǒng)和MySQL數(shù)據(jù)庫(kù)之間的程序,這個(gè)代理可以用來(lái)分析、監(jiān)控和變換通信數(shù)據(jù),但是MySQL官方建議不要將MySQL-Proxy用于生產(chǎn)環(huán)境。事實(shí)上,MySQL-Proxy確實(shí)很不穩(wěn)定,它的讀、寫分離功能都是通過(guò)一個(gè)lua腳本來(lái)實(shí)現(xiàn)的,而這個(gè)腳本bug很多,所以不建議通過(guò)MySQL-Proxy來(lái)實(shí)現(xiàn)讀、寫分離功能,不過(guò)可以作為線下測(cè)試使用。
Amoeba是一個(gè)開(kāi)源項(xiàng)目,致力于MySQL的分布式數(shù)據(jù)庫(kù)前端代理層,它主要在應(yīng)用層訪問(wèn)MySQL的時(shí)候充當(dāng)SQL路由器功能,具有負(fù)載均衡、高可用性、SQL過(guò)濾、讀寫分離等功能,通過(guò)Amoeba可以實(shí)現(xiàn)數(shù)據(jù)源的高可用、負(fù)載均衡、數(shù)據(jù)切片等功能。本文介紹Amoeba作為MySQL讀、寫分離代理接口的實(shí)現(xiàn)過(guò)程。
1、通過(guò)Amoeba實(shí)現(xiàn)MySQL讀寫分離
(1)MMM整合Amoeba應(yīng)用架構(gòu)
在實(shí)際的應(yīng)用環(huán)境中,Amoeba可與簡(jiǎn)單的MySQL主從復(fù)制架構(gòu)進(jìn)行整合,實(shí)現(xiàn)讀與寫的分離操作。但是這樣存在安全性問(wèn)題,例如MySQL的Master節(jié)點(diǎn)出現(xiàn)故障或者任何一個(gè)Slave節(jié)點(diǎn)故障,那么Amoeba并不能自動(dòng)屏蔽這些故障的MySQL節(jié)點(diǎn),可能會(huì)導(dǎo)致前端應(yīng)用程序無(wú)法讀取數(shù)據(jù)庫(kù)的情況。為了解決這個(gè)問(wèn)題,Amoeba經(jīng)常與MMM集群架構(gòu)一起使用,這樣如果任意MySQL節(jié)點(diǎn)故障,MMM集群就能自動(dòng)屏蔽故障節(jié)點(diǎn),從而保證Amoeba一直能夠連接到正常的MySQL節(jié)點(diǎn)。這里要介紹的Amoeba應(yīng)用環(huán)境就是在MMM集群的基礎(chǔ)上構(gòu)建的,整個(gè)架構(gòu)如圖1所示。
圖1? MMM整合Amoeba應(yīng)用架構(gòu)
此架構(gòu)其實(shí)就是在MMM集群架構(gòu)的基礎(chǔ)上增加了Amoeba Server服務(wù)器,這樣前端所有應(yīng)用程序的請(qǐng)求都將提交到Amoeba Server上,然后Amoeba Server根據(jù)自身的讀、寫配置參數(shù)將讀請(qǐng)求分配到可讀的每個(gè)MySQL節(jié)點(diǎn),而將寫請(qǐng)求分配到可寫的MySQL節(jié)點(diǎn)上。這個(gè)架構(gòu)由于在底層使用了MMM集群,因此,Amoeba Server不用擔(dān)心會(huì)將請(qǐng)求分配到一個(gè)故障的MySQL節(jié)點(diǎn),因?yàn)镸MM集群會(huì)自動(dòng)轉(zhuǎn)移故障節(jié)點(diǎn)到健康節(jié)點(diǎn)上。
(2)Amoeba的安裝
這里下載的是amoeba-mysql-3.0.5-RC-distribution.zip。Amoeba的安裝非常簡(jiǎn)單,直接解壓即可使用,這里將Amoeba解壓到/usr/local/amoeba目錄下,這樣就完成安裝了。
Amoeba框架是基于Java SE1.5開(kāi)發(fā)的,因此,還需要安裝Java環(huán)境,建議使用Java SE1.5以上的JDK版本,這里使用的JDK版本為jdk1.6.0_25。將JDK安裝到/usr/local/目錄下,然后設(shè)置Java環(huán)境變量,信息如下:
export JAVA_HOME= /usrk/local/jdk1.6.0_25?
export? CLASSPATH=.:$JAVA_HOME/jre/lib//rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar?
export?PATH=$JAVA_HOME/bin:$PATH
將這些內(nèi)容添加到系統(tǒng)的/etc/profile文件中即可完成Java環(huán)境的設(shè)置。
(3)配置Amoeba
Amoeba的配置文件在本環(huán)境下位于/usr/local/amoeba/conf目錄。配置文件比較多,但是僅僅使用讀、寫分離功能,只需配置二個(gè)文件即可,分別是dbServers.xml和amoeba.xml,如果需要配置IP訪問(wèn)控制,還需要修改access_list.conf文件。下面首先介紹dbServers.xml文件的配置,內(nèi)容如下:
${defaultManager}64128
3306 #設(shè)置Amoeba要連接的mysql數(shù)據(jù)庫(kù)的端口,默認(rèn)是3306
testzhu #缺省數(shù)據(jù)庫(kù),當(dāng)連接amoeba時(shí),操作表必須顯式的指定數(shù)據(jù)庫(kù)名,即采用dbname.tablename的方式,不支持 use dbname指定缺省庫(kù),因?yàn)椴僮鲿?huì)調(diào)度到各個(gè)后端dbserver
test1 #設(shè)置amoeba連接后端數(shù)據(jù)庫(kù)服務(wù)器的賬號(hào)和密碼,因此需要在所有后端數(shù)據(jù)庫(kù)上創(chuàng)建該用戶,并授權(quán)amoeba服務(wù)器可連接
111111 #連接密碼
500 #最大連接數(shù),默認(rèn)500500 #最大空閑連接數(shù)1 #最新空閑連接數(shù)600000600000truetruetrue
#設(shè)置一個(gè)后端可寫的dbServer,這里定義為writedb,這個(gè)名字可以任意命名,后面還會(huì)用到
192.168.1.129 #設(shè)置后端可寫dbserver
#設(shè)置后端可讀dbserver
192.168.1.118 #后端可讀dbserver的IP
……
這樣Amoeba就配置完成了。
(4)設(shè)置Amoeba登錄數(shù)據(jù)庫(kù)權(quán)限
這里假定Amoeba服務(wù)器的IP地址為192.168.88.35,在MMM集群的所有MySQL節(jié)點(diǎn)上執(zhí)行如下操作,為Amoeba訪問(wèn)MMM集群中所有MySQL數(shù)據(jù)庫(kù)節(jié)點(diǎn)授權(quán):
mysql>GRANT ALL ON repldb.* TO 'ixdba'@'192.168.88.35' IDENTIFIED BY 'xxxxxx';
mysql>flush privileges;
(5)啟動(dòng)Amoeba
在Amoeba服務(wù)器上執(zhí)行如下命令,啟動(dòng)Amoeba:
[root@amoebaserver bin]# /usr/local/amoeba/bin/launcher
2019-10-24 18:46:37 [INFO] Project Name=Amoeba-MySQL, PID=22474, starting...
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2019-10-24 18:50:21,668 INFO context.MysqlRuntimeContext - Amoeba for Mysq ?current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2019-10-24 18:50:22,852 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.
[root@cloud0 bin]# netstat -unlpt | grep java
tcp 0 0 :::8066 :::*?LISTEN 22474/java
由此可知Amoeba啟動(dòng)正常。
(6)測(cè)試Amoeba實(shí)現(xiàn)讀、寫分離和負(fù)載均衡
要測(cè)試Amoeba實(shí)現(xiàn)讀、寫分離和負(fù)載均衡功能,需要在MMM集群的所有MySQL節(jié)點(diǎn)開(kāi)啟MySQL的查詢?nèi)罩尽2樵內(nèi)罩究梢杂涗洈?shù)據(jù)庫(kù)中建立的客戶端連接和執(zhí)行的語(yǔ)句。開(kāi)啟方法很簡(jiǎn)單,在MySQL配置文件/etc/my.cnf中添加如下內(nèi)容:
log=/var/log/mysql_query_log
當(dāng)然,mysql_query_log文件要事先存在,并且對(duì)MySQL用戶可寫。
為了測(cè)試方便,這里在每個(gè)MySQL節(jié)點(diǎn)的test庫(kù)中創(chuàng)建一張表,表的名字為mmm_test,例如在Master1節(jié)點(diǎn),創(chuàng)建表的過(guò)程如下:
mysql>use test;
mysql>create table mmm_test(id int,email varchar(60));
mysql>insert into?mmm_test(id,email) values(100,'this is 192.168.88.20');
上面的操作是在mmm_test表的email字段中插入一條記錄“this is 192.168.88.20”,而字符串“this is 192.168.88.20”就是個(gè)IP標(biāo)識(shí),這樣做的目的是區(qū)分多個(gè)MySQL節(jié)點(diǎn)不同IP地址的情況。接著在Master2節(jié)點(diǎn)同樣執(zhí)行上面的SQL操作,所不同的是mmm_test表email字段的內(nèi)容修改為“this is 192.168.88.21”。依此類推,分別在Slave1和Slave2節(jié)點(diǎn)執(zhí)行相同的操作。
接著,在遠(yuǎn)程MySQL客戶端通過(guò)Amoeba配置文件中指定的用戶名、密碼、端口以及Amoeba服務(wù)器的IP地址連接MySQL數(shù)據(jù)庫(kù),操作過(guò)程如圖2所示。
圖2? 測(cè)試Amoeba實(shí)現(xiàn)讀操作的負(fù)載均衡功能
從圖2可以看出,客戶端連接到的Server version為5.1.45-mysql-amoeba-proxy-3.0.4-BETA,可見(jiàn)客戶端連接的是Amoeba實(shí)例而不是MySQL實(shí)例,而從下面的查詢test庫(kù)中mmm_test表的內(nèi)容來(lái)看,Amoeba依次將4次select請(qǐng)求均衡地分配到MMM集群中4個(gè)可讀MySQL節(jié)點(diǎn)上,由此可知,Amoeba實(shí)現(xiàn)了讀操作的負(fù)載均衡。
下面繼續(xù)進(jìn)行SQL測(cè)試,創(chuàng)建兩個(gè)表mmm_test1和mmm_test2,操作過(guò)程如下:
mysql>create table mmm_test1(id int,email varchar(60));
Query OK,0 rows affected(0.04 sec)
mysql>create table mmm_test2(id int,email varchar(60));
Query OK,0 rows affected(0.04 sec)
mysql>insert into mmm_test1(id,email) values(101,'mmm_test1@126.com');
Query OK,1 rows affected(0.02 sec)
mysql>drop table mmm_test2;
Query OK,0 rows affected(0.10 sec)
為了確定創(chuàng)建的兩個(gè)表是否已經(jīng)正常同步到MMM集群的其他節(jié)點(diǎn),可分別登錄每個(gè)MySQL節(jié)點(diǎn)進(jìn)行查詢,接著還要確定MySQL的寫操作是否分配到可寫的節(jié)點(diǎn)Master1,可通過(guò)查看每個(gè)MySQL節(jié)點(diǎn)的查詢?nèi)罩尽aster1節(jié)點(diǎn)的MySQL查詢?nèi)罩拘畔⑷鐖D3所示。
圖3? Master1節(jié)點(diǎn)MySQL查詢?nèi)罩?/p>
Master2節(jié)點(diǎn)的MySQL查詢?nèi)罩拘畔⑷鐖D4所示。
圖4? Master2節(jié)點(diǎn)MySQL查詢?nèi)罩?/p>
其他節(jié)點(diǎn)的信息基本類似,這里不一一列出。從MySQL的查詢?nèi)罩局锌梢赃M(jìn)一步驗(yàn)證Amoeba實(shí)現(xiàn)了讀負(fù)載均衡,而寫操作在Master1節(jié)點(diǎn)執(zhí)行了。雖然Master2節(jié)點(diǎn)也有相關(guān)寫操作的日志,但這是MySQL的復(fù)制線程執(zhí)行的寫操作,因?yàn)槌薓aster1,其他MySQL節(jié)點(diǎn)都是read_only狀態(tài),是無(wú)法執(zhí)行寫操作的。
2、通過(guò)Keepalived構(gòu)建高可用的Amoeba服務(wù)
在上面介紹的MMM整合Amoeba應(yīng)用方案中,雖然通過(guò)Amoeba實(shí)現(xiàn)了MySQL的讀、寫分離,但是這個(gè)架構(gòu)并不完美,因?yàn)檫€存在Amoeba服務(wù)器單點(diǎn)故障,也就是說(shuō)當(dāng)Amoeba出現(xiàn)故障后,業(yè)務(wù)系統(tǒng)將無(wú)法訪問(wèn)MySQL服務(wù)。要解決這個(gè)問(wèn)題其實(shí)非常簡(jiǎn)單,通過(guò)Keepalived給Amoeba做高可用即可,通過(guò)Keepalived實(shí)現(xiàn)Amoeba高可用并實(shí)現(xiàn)MySQL集群讀、寫分離的架構(gòu)如圖5所示。
圖5? 通過(guò)Keepalived實(shí)現(xiàn)Amoeba高可用并實(shí)現(xiàn)MySQL集群讀、寫分離架構(gòu)
微信公眾號(hào):計(jì)算機(jī)與網(wǎng)絡(luò)安全
ID:Computer-network
【推薦書籍】總結(jié)
以上是生活随笔為你收集整理的java读取mysql配置文件_Linux运维:MySQL读写分离解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nfc卡模式与标准模式_渠道如何标准化管
- 下一篇: linux计算目录下wc,Linux w