日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java读取mysql配置文件_Linux运维:MySQL读写分离解决方案

發(fā)布時(shí)間:2025/3/12 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java读取mysql配置文件_Linux运维:MySQL读写分离解决方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一次性付費(fèi)進(jìn)群,長期免費(fèi)索取教程,沒有付費(fèi)教程。

進(jìn)微信群回復(fù)公眾號(hào):微信群;QQ群:460500587

?教程列表?見微信公眾號(hào)底部菜單 |??本文底部有推薦書籍?

微信公眾號(hào):計(jì)算機(jī)與網(wǎng)絡(luò)安全

ID:Computer-network

在MMM集群架構(gòu)中,通過提供虛擬的讀、寫IP地址,將數(shù)據(jù)庫的讀寫功能分離出來,但是這僅僅設(shè)定了讀、寫的VIP地址,并沒有真正實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)中所說的讀、寫分離功能,因?yàn)閼?yīng)用程序不可能在需要讀的時(shí)候就去找可讀的VIP,在寫的時(shí)候就去找可寫的VIP,要解決這個(gè)問題,可由兩種方法來實(shí)現(xiàn)。

第一種實(shí)現(xiàn)讀、寫分離的方式是通過修改程序,將讀、寫操作提取出來,并分別在程序的連接池中設(shè)定可讀、可寫的VIP地址,這種方法要修改業(yè)務(wù)系統(tǒng)的程序,實(shí)現(xiàn)起來相對(duì)比較困難,如果是新開發(fā)的程序,可以在開發(fā)時(shí)就預(yù)留這樣的接口,而如果程序已經(jīng)在運(yùn)行,修改的難度是相當(dāng)大的,采用這種方法基本行不通。

第二種實(shí)現(xiàn)讀、寫分離的方法是通過一個(gè)數(shù)據(jù)庫透明代理,也就是在業(yè)務(wù)系統(tǒng)和數(shù)據(jù)庫之間提供一個(gè)代理接口,由這個(gè)接口來完成業(yè)務(wù)系統(tǒng)讀、寫請(qǐng)求的分發(fā),將讀操作分發(fā)到后端只讀的數(shù)據(jù)庫服務(wù)器上,而將寫請(qǐng)求分發(fā)到后端可寫的數(shù)據(jù)庫服務(wù)器上。常見的讀、寫分離軟件有Amoeba和MySQL-Proxy。

MySQL-Proxy是MySQL官方推出的一個(gè)處在業(yè)務(wù)系統(tǒng)和MySQL數(shù)據(jù)庫之間的程序,這個(gè)代理可以用來分析、監(jiān)控和變換通信數(shù)據(jù),但是MySQL官方建議不要將MySQL-Proxy用于生產(chǎn)環(huán)境。事實(shí)上,MySQL-Proxy確實(shí)很不穩(wěn)定,它的讀、寫分離功能都是通過一個(gè)lua腳本來實(shí)現(xiàn)的,而這個(gè)腳本bug很多,所以不建議通過MySQL-Proxy來實(shí)現(xiàn)讀、寫分離功能,不過可以作為線下測(cè)試使用。

Amoeba是一個(gè)開源項(xiàng)目,致力于MySQL的分布式數(shù)據(jù)庫前端代理層,它主要在應(yīng)用層訪問MySQL的時(shí)候充當(dāng)SQL路由器功能,具有負(fù)載均衡、高可用性、SQL過濾、讀寫分離等功能,通過Amoeba可以實(shí)現(xiàn)數(shù)據(jù)源的高可用、負(fù)載均衡、數(shù)據(jù)切片等功能。本文介紹Amoeba作為MySQL讀、寫分離代理接口的實(shí)現(xiàn)過程。

1、通過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)讀與寫的分離操作。但是這樣存在安全性問題,例如MySQL的Master節(jié)點(diǎn)出現(xiàn)故障或者任何一個(gè)Slave節(jié)點(diǎn)故障,那么Amoeba并不能自動(dòng)屏蔽這些故障的MySQL節(jié)點(diǎn),可能會(huì)導(dǎo)致前端應(yīng)用程序無法讀取數(shù)據(jù)庫的情況。為了解決這個(gè)問題,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開發(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訪問控制,還需要修改access_list.conf文件。下面首先介紹dbServers.xml文件的配置,內(nèi)容如下:

${defaultManager}64128

3306 #設(shè)置Amoeba要連接的mysql數(shù)據(jù)庫的端口,默認(rèn)是3306

testzhu #缺省數(shù)據(jù)庫,當(dāng)連接amoeba時(shí),操作表必須顯式的指定數(shù)據(jù)庫名,即采用dbname.tablename的方式,不支持 use dbname指定缺省庫,因?yàn)椴僮鲿?huì)調(diào)度到各個(gè)后端dbserver

test1 #設(shè)置amoeba連接后端數(shù)據(jù)庫服務(wù)器的賬號(hào)和密碼,因此需要在所有后端數(shù)據(jù)庫上創(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ù)庫權(quán)限

這里假定Amoeba服務(wù)器的IP地址為192.168.88.35,在MMM集群的所有MySQL節(jié)點(diǎn)上執(zhí)行如下操作,為Amoeba訪問MMM集群中所有MySQL數(shù)據(jù)庫節(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)開啟MySQL的查詢?nèi)罩尽2樵內(nèi)罩究梢杂涗洈?shù)據(jù)庫中建立的客戶端連接和執(zhí)行的語句。開啟方法很簡(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庫中創(chuàng)建一張表,表的名字為mmm_test,例如在Master1節(jié)點(diǎn),創(chuàng)建表的過程如下:

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客戶端通過Amoeba配置文件中指定的用戶名、密碼、端口以及Amoeba服務(wù)器的IP地址連接MySQL數(shù)據(jù)庫,操作過程如圖2所示。

圖2? 測(cè)試Amoeba實(shí)現(xiàn)讀操作的負(fù)載均衡功能

從圖2可以看出,客戶端連接到的Server version為5.1.45-mysql-amoeba-proxy-3.0.4-BETA,可見客戶端連接的是Amoeba實(shí)例而不是MySQL實(shí)例,而從下面的查詢test庫中mmm_test表的內(nè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,操作過程如下:

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,可通過查看每個(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),是無法執(zhí)行寫操作的。

2、通過Keepalived構(gòu)建高可用的Amoeba服務(wù)

在上面介紹的MMM整合Amoeba應(yīng)用方案中,雖然通過Amoeba實(shí)現(xiàn)了MySQL的讀、寫分離,但是這個(gè)架構(gòu)并不完美,因?yàn)檫€存在Amoeba服務(wù)器單點(diǎn)故障,也就是說當(dāng)Amoeba出現(xiàn)故障后,業(yè)務(wù)系統(tǒng)將無法訪問MySQL服務(wù)。要解決這個(gè)問題其實(shí)非常簡(jiǎn)單,通過Keepalived給Amoeba做高可用即可,通過Keepalived實(shí)現(xiàn)Amoeba高可用并實(shí)現(xiàn)MySQL集群讀、寫分離的架構(gòu)如圖5所示。

圖5? 通過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读写分离解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。