




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Haproxy+多臺MySQL從服務(wù)器(Slave)實現(xiàn)負(fù)載均衡2015-08-28本系統(tǒng)采用MySQL一主多從模式設(shè)計,即1臺 MySQL“主”服務(wù)器(Master)+多臺“從”服務(wù)器(Slave),“從”服務(wù)器之間通過Haproxy進行負(fù)載均衡,對外只提供一個訪問IP,當(dāng)程序需要訪問多臺從服務(wù)器時,只需要訪問Haproxy,再由Haproxy將請求分發(fā)到各個數(shù)據(jù)庫節(jié)點。我們的程序可以有倆個數(shù)據(jù)源(DataSourceA,DataSourceB),一個(DataSourceA)直接連接主庫,另外一個(DataSourceB)連接Haproxy,當(dāng)需要寫入操作時可以使用DataSourceA,
2、讀取時使用DataSourceB。設(shè)計圖如下:看到這里大家可能會有一個疑問,這個問題就是主從數(shù)據(jù)庫之間數(shù)據(jù)同步延時的問題!因為大多數(shù)使用MySQL主從同步數(shù)據(jù)都是異步的,也就是說當(dāng)主庫的數(shù)據(jù)發(fā)生變化時并不能立即的更新從庫,這么做的目的也是為了更好的性能,那么設(shè)想一下,當(dāng)用戶新增一條記錄后立刻去從庫查詢,可能并不能查到剛剛新增的數(shù)據(jù),這豈不是很腦裂的問題。然而實際情況并不應(yīng)該是這樣的,我們也不應(yīng)該這樣去設(shè)計程序,我們就拿一個類似于CSND博客管理的系統(tǒng)來說,假設(shè)一個“博客系統(tǒng)”只有倆部分,一部分是博客管理后臺,用戶可以在后臺新增,編輯,刪除博客。另一部分是門戶網(wǎng)站,負(fù)責(zé)展示所有用戶的博客信息,相
3、對于這樣一個系統(tǒng)來說, 后臺管理模塊對數(shù)據(jù)庫的操作壓力不是很大,相反門戶網(wǎng)站讀取博客信息對數(shù)據(jù)庫的壓力很大,這也式一般互聯(lián)網(wǎng)產(chǎn)品的特點,而且最重要的一點是系統(tǒng)可以接受主從同步數(shù)據(jù)帶來的延遲,也就是說當(dāng)用戶在后臺新增一條博客時,前臺門戶網(wǎng)站并不能立即查詢到這條信息。一般都是再過一段時間后才會出現(xiàn)在首頁,因為大多數(shù)系統(tǒng)都有緩存設(shè)置,這樣正好給主從同步延遲帶來時間。接著說上面的問題,有的同學(xué)可能會有這樣的疑問,就是后臺用戶在新增一條記錄后,一般都是立即查詢返回博客列表,按照上面說的豈不是查詢不到,我覺得這個問題可以這么解決:1、后臺用戶在進行 新增,查詢,編輯,刪除等操作時直接連接主庫,這樣無論什么
4、操作都是實時的,因為后臺操作對數(shù)據(jù)庫的壓力不是很大,所以讀寫全部連接主庫應(yīng)該沒什么問題!2、門戶網(wǎng)站查詢博客列表時從 “從庫集群中查詢“,通過負(fù)載均衡技術(shù),解決了擴展性,高可用性等問題,同時門戶網(wǎng)站首頁也不需要實時查詢主庫中的數(shù)據(jù),因為網(wǎng)站本身一般都有緩存,也不是實時的。上面的架構(gòu)設(shè)計只是拋磚引玉,大家有什么好想法也可以相互交流本文重點介紹的內(nèi)容有二點:1、如何使用Haproxy給MySQL做負(fù)載均衡,提供相關(guān)的配置說明,健康檢查等等。2、當(dāng)程序通過連接Haproxy代理之后,如何解決程序中連接池長連接失效的問題。下面介紹如何安裝配置Haproxy1、首先進行負(fù)載均衡配置。假設(shè)兩臺MySQL(
5、slave)從服務(wù)器 A:91:3306 B:92:3306。首先在linxu上安裝Haproxy,安裝過程略。安裝完畢后打開配置文件在/etc/haproxy/haproxy.cfg,配置文件的路徑可能不用,別告訴我找不到!1. global2. maxconn40963. daemon4. chroot/var/lib/haproxy5. pidfile/var/run/haproxy.pid6. #debug7. #quiet8. userhaproxy9. grouphaproxy10. 11. defaults12. logglobal13
6、. mode http14. option httplog15. option dontlognull16. loglocal017. retries 318. optionredispatch19. maxconn200020. #contimeout500021. #clitimeout5000022. #srvtimeout5000023. timeouthttp-request 10s24. timeoutqueue1m25. timeoutconnect10s26. timeoutclient 1m27. timeoutserver 1m28. timeouthtt
7、p-keep-alive10s29. timeoutcheck10s30. 31. listenadmin_stats:888832. modehttp33. statsuri/dbs34. statsrealmGlobalstatistics35. statsauthadmin:admin36. 37. listenproxy-mysql:2330638. modetcp39. balanceroundrobin40. optiontcplog41. optionmysql-checkuserhaproxy#在mysql中創(chuàng)建無任何權(quán)限用戶haproxy,且無密碼
8、,這個在MySQL 5.7中需要一些技巧來規(guī)避無密碼的設(shè)置42. serverMySQL191:3306checkweight1maxconn200043. serverMySQL292:3306checkweight1maxconn200044. optiontcpkalistenadmin_stats:8888這個配置是監(jiān)控頁面,綁定到本機8888端口,賬號admin,密碼admin可以通過web的方式查看所有MySQL節(jié)點的使用情況, http:/你的IP:8888/dbs 即可登錄監(jiān)控后臺。如下圖:1. listenproxy-
9、mysql:233062. modetcp3. balanceroundrobin4. optiontcplog5. optionmysql-checkuserhaproxy#在mysql中創(chuàng)建無任何權(quán)限用戶haproxy,且無密碼6. serverMySQL191:3306checkweight1maxconn20007. serverMySQL292:3306checkweight1maxconn20008. optiontcpkaproxy-mysql:23306代理的端口。程序連接從庫集群時就訪問這個端口。bala
10、nceroundrobin負(fù)載均衡方式。optionmysql-checkuserhaproxy這里是配置健康檢查的,也是haproxy自帶的功能,需要在mysql中創(chuàng)建無任何權(quán)限用戶haproxy,且無密碼serverMySQL191:3306checkweight1maxconn2000配置MySQL從庫節(jié)點,有多少節(jié)點就配置多少server項。有的同學(xué)可能不知道如何在MySQL中創(chuàng)建用戶,這里也給你寫好了。用戶名為haproxy 且無密碼(重要) 否則haproxy無法檢測MySQL狀態(tài)。CREATE USER haproxy% IDENTIFIED BY ;配置完
11、成后啟動代理 service haproxy start 如果用過yum方式安裝,應(yīng)該就能啟動了,如果是其它方式安裝,可能啟動方式不同,需要編寫腳本啟動,應(yīng)該不難自己研究一下然后讓我們寫個demo測試一下代理是否配置成功了沒!1. publicstaticvoidmain(Stringargs)throwsException2. 3. 4. Class.forName();5. Connectionconn=DriverManager.getConnection(jdbc:mysql:/你的IP:23306/template?useUnicode=true,root,sql2008);6. 7
12、. for(inti=0;i+res.getInt(1);15. 16. catch(Exceptione)17. e.printStackTrace();18. res.close();19. pr.close();20. 21. 22. Thread.sleep(25000);23. 24. 25. conn.close();26. 輸出結(jié)果如下:可以看到代理MySQL成功了,這時你可以隨機關(guān)掉一個MySQL節(jié)點的服務(wù),程序依然能夠正常的執(zhí)行,說明負(fù)載均衡也成功了。1. 2015-8-2810:09:27-72. 2015-8-2810:09:52-73. 2015-8-2810:10:1
13、7-74. 2015-8-2810:10:42-75. 2015-8-2810:11:07-7小小的激動有沒有有沒有。于是乎我們就把程序中數(shù)據(jù)源的配置改造一下,讓它連接haproxy即可。是不是以為大功告成了,如果你就這樣配置的話,等程序運行起來它就會給你一個大大的surprise其實這里面是有坑的,且聽我細(xì)細(xì)道來。一般的情況下,我相信大家在直接連接MySQL的時候幾乎都用到了連接池。以我的配置為例:1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. lt;/bean其它的參數(shù)這里不解釋,大家可以查詢C3P0配置信息,網(wǎng)上很多。 這里只說一個:idle
14、ConnectionTestPeriod=30這個參數(shù)是配置連接池每隔多少時間去檢查池內(nèi)鏈接的有效性,單位秒。我這里設(shè)置成30秒,那么C3P0會每隔30秒把連接池內(nèi)所有的空閑連接拿出來挨個發(fā)一個測試SQL語句,已確定這個鏈接的有效性。以前我們的數(shù)據(jù)源是直接連接MySQL數(shù)據(jù)庫的,在正常的情況下MySQL是不會斷開這個鏈接的。但是我們現(xiàn)在連接的是haproxy,也就是說我們程序的連接(Connection)是與haproxy建立的,這里的坑在于這個連接是會被haproxy斷掉的,這樣的話你連接池內(nèi)的鏈接就變成了無效鏈接,在下次需要查詢數(shù)據(jù)庫時還需要重新創(chuàng)建連接,而且程序由于拿到的連接是無效鏈接,
15、還有可能報錯。那么haproxy與我們程序之間的連接超時時間在哪設(shè)置呢?timeoutclient1m#這個參數(shù)配置程序與haproxy的鏈接超時時間timeoutserver1m#這個參haproxy與mysql鏈接超時時間這里的超時時間不是指連接過程的超時時間,而是指連接上以后,多少時間內(nèi)沒有心跳,操作這個時間就認(rèn)為超時,然后斷開連接。 寫的可能有些啰嗦,我們看個例子開說明一下:1. publicstaticvoidmain(Stringargs)throwsException2. 3. 4. Class.forName();5. Connectionconn=DriverManager.
16、getConnection(jdbc:mysql:/IP:23306/template?useUnicode=true,root,sql2008);6. 7. for(inti=0;i+res.getInt(1);15. 16. catch(Exceptione)17. e.printStackTrace();18. res.close();19. pr.close();20. 21. 22. Thread.sleep(60000);23. 24. 25. conn.close();26. 我上面配置的是timeout client 1m ,也就是說客戶端連接到haproxy后 1分鐘之內(nèi)沒有數(shù)據(jù)請求即為超時,就會斷掉
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軍訓(xùn)旅行活動方案
- 初級軍訓(xùn)活動方案
- 減肥訓(xùn)練營活動方案
- 公司每周下午茶活動方案
- 公司環(huán)保節(jié)能活動方案
- 公司旅游攝影活動方案
- 公司程序員活動策劃方案
- 公司新年活動策劃方案
- 公司月休旅游活動方案
- 公司積分活動策劃方案
- 提高分級護理的巡視率
- 醫(yī)美行業(yè)營銷策劃方案模板
- 2025年遼寧省沈陽市中考一模道德與法治試題(原卷版+解析版)
- 《語文綜合實踐:走進傳統(tǒng)節(jié)日 探尋文化根脈》(教學(xué)設(shè)計)-2024-2025學(xué)年中職語文高教版(2023)基礎(chǔ)模塊下冊
- 男性生殖系統(tǒng)超聲
- 兒童學(xué)習(xí)習(xí)慣養(yǎng)成與學(xué)習(xí)能力提升
- 《建立合適邊界:親子教育課件》
- 課件:《教育強國建設(shè)規(guī)劃綱要(2024-2035年)》學(xué)習(xí)宣講
- 2023年遺傳學(xué)考試題庫(含答案)
- 課題申報參考:基于多模態(tài)大數(shù)據(jù)的大學(xué)生心理危機預(yù)警機制研究
- 個人征信培訓(xùn)
評論
0/150
提交評論