Haproxy多臺MySQL從服務(wù)器Slave實現(xiàn)負(fù)載均衡_第1頁
Haproxy多臺MySQL從服務(wù)器Slave實現(xiàn)負(fù)載均衡_第2頁
Haproxy多臺MySQL從服務(wù)器Slave實現(xiàn)負(fù)載均衡_第3頁
Haproxy多臺MySQL從服務(wù)器Slave實現(xiàn)負(fù)載均衡_第4頁
Haproxy多臺MySQL從服務(wù)器Slave實現(xiàn)負(fù)載均衡_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論