Haproxy+Percona-XtraDB-Cluster 集群
生活随笔
收集整理的這篇文章主要介紹了
Haproxy+Percona-XtraDB-Cluster 集群
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Haproxy介紹
- Haproxy 是一款提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。 HAProxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會(huì)話保持或七層處理。HAProxy運(yùn)行在時(shí)下的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的 并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
- Haproxy 實(shí)現(xiàn)了一種事件驅(qū)動(dòng)、單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模型受內(nèi)存限制 、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動(dòng)模型因?yàn)樵谟懈玫馁Y源和時(shí)間管理的用戶端(User-Space) 實(shí)現(xiàn)所有這些任務(wù),所以沒有這些問題。此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴(kuò)展性較差。這就是為什么他們必須進(jìn)行優(yōu)化以 使每個(gè)CPU時(shí)間片(Cycle)做更多的工作。
- Haproxy 支持連接拒絕 : 因?yàn)榫S護(hù)一個(gè)連接的打開的開銷是很低的,有時(shí)我們很需要限制攻擊蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。 這個(gè)已經(jīng)為一個(gè)陷于小型DDoS攻擊的網(wǎng)站開發(fā)了而且已經(jīng)拯救
- 了很多站點(diǎn),這個(gè)優(yōu)點(diǎn)也是其它負(fù)載均衡器沒有的。
- Haproxy 支持全透明代理(已具備硬件防火墻的典型特點(diǎn)): 可以用客戶端IP地址或者任何其他地址來連接后端服務(wù)器. 這個(gè)特性僅在Linux?2.4/2.6內(nèi)核打了cttproxy補(bǔ)丁后才可以使用. 這個(gè)特性也使得為某特殊服務(wù)器處理部分流量同時(shí)又不修改服務(wù)器的地址成為可能。
性能:HAProxy借助于OS上幾種常見的技術(shù)來實(shí)現(xiàn)性能的最大化。
- 1,單進(jìn)程、事件驅(qū)動(dòng)模型顯著降低了上下文切換的開銷及內(nèi)存占用。
- 2,事件檢查器(event checker)允許其在高并發(fā)連接中對任何連接的任何事件實(shí)現(xiàn)即時(shí)探測。
- 3,在任何可用的情況下,單緩沖(single buffering)機(jī)制能以不復(fù)制任何數(shù)據(jù)的方式完成讀寫操作,這會(huì)節(jié)約大量的CPU時(shí)鐘周期及內(nèi)存帶寬;
- 4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系統(tǒng)調(diào)用,HAProxy可以實(shí)現(xiàn)零復(fù)制轉(zhuǎn)發(fā)(Zero-copy forwarding),在Linux 3.5及以上的OS中還可以實(shí)現(xiàn)零復(fù)制啟動(dòng)(zero-starting);
- 5,內(nèi)存分配器在固定大小的內(nèi)存池中可實(shí)現(xiàn)即時(shí)內(nèi)存分配,這能夠顯著減少創(chuàng)建一個(gè)會(huì)話的時(shí)長;
- 6,樹型存儲(chǔ):側(cè)重于使用作者多年前開發(fā)的彈性二叉樹,實(shí)現(xiàn)了以O(shè)(log(N))的低開銷來保持計(jì)時(shí)器命令、保持運(yùn)行隊(duì)列命令及管理輪詢及最少連接隊(duì)列;
- 7,優(yōu)化的HTTP首部分析:優(yōu)化的首部分析功能避免了在HTTP首部分析過程中重讀任何內(nèi)存區(qū)域;
- 8,精心地降低了昂貴的系統(tǒng)調(diào)用,大部分工作都在用戶空間完成,如時(shí)間讀取、緩沖聚合及文件描述符的啟用和禁用等;
- 所有的這些細(xì)微之處的優(yōu)化實(shí)現(xiàn)了在中等規(guī)模負(fù)載之上依然有著相當(dāng)?shù)偷腃PU負(fù)載,甚至于在非常高的負(fù)載場景中,5%的用戶空間占用率和95%的系統(tǒng)空間占用率也是非常普遍的現(xiàn)象,這意味著HAProxy進(jìn)程消耗比系統(tǒng)空間消耗低20倍以上。因此,對OS進(jìn)行性能調(diào)優(yōu)是非常重要的。即使用戶空間的占用率提高一倍,其CPU占用率也僅為10%,這也解釋了為何7層處理對性能影響有限這一現(xiàn)象。由此,在高端系統(tǒng)上HAProxy的7層性能可輕易超過硬件負(fù)載均衡設(shè)備。
- 在生產(chǎn)環(huán)境中,在7層處理上使用HAProxy作為昂貴的高端硬件負(fù)載均衡設(shè)備故障故障時(shí)的緊急解決方案也時(shí)長可見。硬件負(fù)載均衡設(shè)備在“報(bào)文”級(jí)別處理請求,這在支持跨報(bào)文請求(request across multiple packets)有著較高的難度,并且它們不緩沖任何數(shù)據(jù),因此有著較長的響應(yīng)時(shí)間。對應(yīng)地,軟件負(fù)載均衡設(shè)備使用TCP緩沖,可建立極長的請求,且有著較大的響應(yīng)時(shí)間。
- HAProxy目前主要有三個(gè)版本: 1.3 , 1.4 ,1.5,CentOS6.6 自帶的RPM包為 1.5 的。
1.1 搭建Haproy
[root@haproxy ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@haproxy ~]# systemctl stop firewalld [root@haproxy ~]# getenforce Disabled [root@haproxy ~]# yum install -y haproxy [root@haproxy ~]# haproxy -v HA-Proxy version 1.5.18 2016/05/10 Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>?
?1.2? 修改/etc/haproxy/haproxy.cfg
global # 全局參數(shù)的設(shè)置 log 127.0.0.1 local0 info # log語法:log <address_1>[max_level_1] # 全局的日志配置,使用log關(guān)鍵字,指定使用127.0.0.1上的syslog服務(wù)中的local0日志設(shè)備,記錄日志等級(jí)為info的日志 user haproxy group haproxy # 設(shè)置運(yùn)行haproxy的用戶和組,也可使用uid,gid關(guān)鍵字替代之 daemon # 以守護(hù)進(jìn)程的方式運(yùn)行 nbproc 16 # 設(shè)置haproxy啟動(dòng)時(shí)的進(jìn)程數(shù),根據(jù)官方文檔的解釋,我將其理解為:該值的設(shè)置應(yīng)該和服務(wù)器的CPU核心數(shù)一致,即常見的2顆8核心CPU的服務(wù)器,即共有16核心,則可以將其值設(shè)置為:<=16 ,創(chuàng)建多個(gè)進(jìn)程數(shù),可以減少每個(gè)進(jìn)程的任務(wù)隊(duì)列,但是過多的進(jìn)程數(shù)也可能會(huì)導(dǎo)致進(jìn)程的崩潰。這里我設(shè)置為16 maxconn 4096 # 定義每個(gè)haproxy進(jìn)程的最大連接數(shù) ,由于每個(gè)連接包括一個(gè)客戶端和一個(gè)服務(wù)器端,所以單個(gè)進(jìn)程的TCP會(huì)話最大數(shù)目將是該值的兩倍。 #ulimit -n 65536 # 設(shè)置最大打開的文件描述符數(shù),在1.4的官方文檔中提示,該值會(huì)自動(dòng)計(jì)算,所以不建議進(jìn)行設(shè)置 pidfile /var/run/haproxy.pid # 定義haproxy的pid defaults # 默認(rèn)部分的定義 mode http # mode語法:mode {http|tcp|health} 。http是七層模式,tcp是四層模式,health是健康檢測,返回OK log 127.0.0.1 local3 err # 使用127.0.0.1上的syslog服務(wù)的local3設(shè)備記錄錯(cuò)誤信息 retries 3 # 定義連接后端服務(wù)器的失敗重連次數(shù),連接失敗次數(shù)超過此值后將會(huì)將對應(yīng)后端服務(wù)器標(biāo)記為不可用 option httplog # 啟用日志記錄HTTP請求,默認(rèn)haproxy日志記錄是不記錄HTTP請求的,只記錄“時(shí)間[Jan 5 13:23:46] 日志服務(wù)器[127.0.0.1] 實(shí)例名已經(jīng)pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很簡單。 option redispatch # 當(dāng)使用了cookie時(shí),haproxy將會(huì)將其請求的后端服務(wù)器的serverID插入到cookie中,以保證會(huì)話的SESSION持久性;而此時(shí),如果后端的服務(wù)器宕掉了,但是客戶端的cookie是不會(huì)刷新的,如果設(shè)置此參數(shù),將會(huì)將客戶的請求強(qiáng)制定向到另外一個(gè)后端server上,以保證服務(wù)的正常。 option abortonclose # 當(dāng)服務(wù)器負(fù)載很高的時(shí)候,自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接 option dontlognull # 啟用該項(xiàng),日志中將不會(huì)記錄空連接。所謂空連接就是在上游的負(fù)載均衡器或者監(jiān)控系統(tǒng)為了探測該服務(wù)是否存活可用時(shí),需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監(jiān)聽或開放等動(dòng)作被稱為空連接;官方文檔中標(biāo)注,如果該服務(wù)上游沒有其他的負(fù)載均衡器的話,建議不要使用該參數(shù),因?yàn)榛ヂ?lián)網(wǎng)上的惡意掃描或其他動(dòng)作就不會(huì)被記錄下來 option httpclose # 這個(gè)參數(shù)我是這樣理解的:使用該參數(shù),每處理完一個(gè)request時(shí),haproxy都會(huì)去檢查http頭中的Connection的值,如果該值不是close,haproxy將會(huì)將其刪除,如果該值為空將會(huì)添加為:Connection: close。使每個(gè)客戶端和服務(wù)器端在完成一次傳輸后都會(huì)主動(dòng)關(guān)閉TCP連接。與該參數(shù)類似的另外一個(gè)參數(shù)是“option forceclose”,該參數(shù)的作用是強(qiáng)制關(guān)閉對外的服務(wù)通道,因?yàn)橛械姆?wù)器端收到Connection: close時(shí),也不會(huì)自動(dòng)關(guān)閉TCP連接,如果客戶端也不關(guān)閉,連接就會(huì)一直處于打開,直到超時(shí)。 contimeout 5000 # 設(shè)置成功連接到一臺(tái)服務(wù)器的最長等待時(shí)間,默認(rèn)單位是毫秒,新版本的haproxy使用timeout connect替代,該參數(shù)向后兼容 clitimeout 3000 # 設(shè)置連接客戶端發(fā)送數(shù)據(jù)時(shí)的成功連接最長等待時(shí)間,默認(rèn)單位是毫秒,新版本haproxy使用timeout client替代。該參數(shù)向后兼容 srvtimeout 3000 # 設(shè)置服務(wù)器端回應(yīng)客戶度數(shù)據(jù)發(fā)送的最長等待時(shí)間,默認(rèn)單位是毫秒,新版本haproxy使用timeout server替代。該參數(shù)向后兼容 listen status # 定義一個(gè)名為status的部分 bind 0.0.0.0:1080 # 定義監(jiān)聽的套接字 mode http # 定義為HTTP模式 log global # 繼承g(shù)lobal中l(wèi)og的定義 stats refresh 30s # stats是haproxy的一個(gè)統(tǒng)計(jì)頁面的套接字,該參數(shù)設(shè)置統(tǒng)計(jì)頁面的刷新間隔為30s stats uri /admin?stats # 設(shè)置統(tǒng)計(jì)頁面的uri為/admin?stats stats realm Private lands # 設(shè)置統(tǒng)計(jì)頁面認(rèn)證時(shí)的提示內(nèi)容 stats auth admin:password # 設(shè)置統(tǒng)計(jì)頁面認(rèn)證的用戶和密碼,如果要設(shè)置多個(gè),另起一行寫入即可 stats hide-version # 隱藏統(tǒng)計(jì)頁面上的haproxy版本信息 frontend http_80_in # 定義一個(gè)名為http_80_in的前端部分 bind 0.0.0.0:80 # http_80_in定義前端部分監(jiān)聽的套接字 mode http # 定義為HTTP模式 log global # 繼承g(shù)lobal中l(wèi)og的定義 option forwardfor # 啟用X-Forwarded-For,在requests頭部插入客戶端IP發(fā)送給后端的server,使后端server獲取到客戶端的真實(shí)IP acl static_down nbsrv(static_server) lt 1 # 定義一個(gè)名叫static_down的acl,當(dāng)backend static_sever中存活機(jī)器數(shù)小于1時(shí)會(huì)被匹配到 acl php_web url_reg /*.php$ #acl php_web path_end .php # 定義一個(gè)名叫php_web的acl,當(dāng)請求的url末尾是以.php結(jié)尾的,將會(huì)被匹配到,上面兩種寫法任選其一 acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$ #acl static_web path_end .gif .png .jpg .css .js .jpeg # 定義一個(gè)名叫static_web的acl,當(dāng)請求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結(jié)尾的,將會(huì)被匹配到,上面兩種寫法任選其一 use_backend php_server if static_down # 如果滿足策略static_down時(shí),就將請求交予backend php_server use_backend php_server if php_web # 如果滿足策略php_web時(shí),就將請求交予backend php_server use_backend static_server if static_web # 如果滿足策略static_web時(shí),就將請求交予backend static_server backend php_server #定義一個(gè)名為php_server的后端部分 mode http # 設(shè)置為http模式 balance source # 設(shè)置haproxy的調(diào)度算法為源地址hash cookie SERVERID # 允許向cookie插入SERVERID,每臺(tái)服務(wù)器的SERVERID可在下面使用cookie關(guān)鍵字定義 option httpchk GET /test/index.php # 開啟對后端服務(wù)器的健康檢測,通過GET /test/index.php來判斷后端服務(wù)器的健康情況 server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2 server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1 server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup # server語法:server [:port] [param*] # 使用server關(guān)鍵字來設(shè)置后端服務(wù)器;為后端服務(wù)器所設(shè)置的內(nèi)部名稱[php_server_1],該名稱將會(huì)呈現(xiàn)在日志或警報(bào)中、后端服務(wù)器的IP地址,支持端口映射[10.12.25.68:80]、指定該服務(wù)器的SERVERID為1[cookie 1]、接受健康監(jiān)測[check]、監(jiān)測的間隔時(shí)長,單位毫秒[inter 2000]、監(jiān)測正常多少次后被認(rèn)為后端服務(wù)器是可用的[rise 3]、監(jiān)測失敗多少次后被認(rèn)為后端服務(wù)器是不可用的[fall 3]、分發(fā)的權(quán)重[weight 2]、最為備份用的后端服務(wù)器,當(dāng)正常的服務(wù)器全部都宕機(jī)后,才會(huì)啟用備份服務(wù)器[backup] backend static_server mode http option httpchk GET /test/index.html server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3?
轉(zhuǎn)載于:https://www.cnblogs.com/so-cool/p/8194526.html
總結(jié)
以上是生活随笔為你收集整理的Haproxy+Percona-XtraDB-Cluster 集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Kotlin撸一个图片压缩插件-实战篇
- 下一篇: 用不同显卡训练gan的区别_面霜质地这么