keepalived + haproxy 实现web 双主模型的高可用负载均衡--转
1、本文的架構(gòu)圖:
?
?
闡述各服務(wù)器用途:
? ?1、haproxy在本構(gòu)架中實(shí)現(xiàn)的是:負(fù)載均衡
? ?2、keepalived實(shí)現(xiàn)對(duì)haproxy的高可用
? ?3、apache static 實(shí)現(xiàn)靜態(tài)頁(yè)面的訪問(wèn)
? ?4、aoache dynamic實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的訪問(wèn),圖中有兩個(gè)是實(shí)現(xiàn)負(fù)載均衡的
?
配置各功能模塊:
? ?一、配置haproxy和keepalived
?
驗(yàn)證:
? ? ? ? 1、當(dāng)一臺(tái)keepalived宕機(jī)后,VIP會(huì)不會(huì)轉(zhuǎn)移到另外一臺(tái)服務(wù)器
? ? ? ? 2、當(dāng)一臺(tái)haproxy服務(wù)出故障,VIP會(huì)不會(huì)轉(zhuǎn)移到另外一臺(tái)服務(wù)器
?
注意:
? ? ? ? 那如果keepalived宕機(jī)了,haproxy服務(wù)還正常運(yùn)行,我們要不要讓另外一臺(tái)服務(wù)器把VIP奪過(guò)去呢?
? ? ? ? 理論上來(lái)講:最好不要,但是我們的keepalived中的腳本監(jiān)控著haproxy的進(jìn)程,keepalived宕機(jī)之后,就無(wú)從得知haproxy的健康狀態(tài),也不能決定自己的優(yōu)先權(quán)priority降不降低了。所以,理論上來(lái)講最好不要,但是實(shí)際中光靠keepalived是做不到的。
?
?
配置:
?
1、給兩臺(tái)服務(wù)器分別安裝上keepalived
?
| 1 | [root@station139 ~]# yum -y install keepalived |
?
?
2、配置keepalived
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | [root@node2 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File?for?keepalived global_defs { ???notification_email { ????????root@localhost??? 配置服務(wù)狀態(tài)變化發(fā)送郵件到哪個(gè)地址 ???} ???notification_email_from kaadmin@localhost ???smtp_server?127.0.0.1????給哪個(gè)smtp服務(wù)器發(fā)郵件 ???smtp_connect_timeout?30????聯(lián)系上面smtp服務(wù)器30秒聯(lián)系不上,就超時(shí) ???router_id LVS_DEVEL } vrrp_script chk_haproxy {???? 本腳本是用來(lái)檢測(cè)該服務(wù)器上haproxy服務(wù)的健康狀態(tài)的 ????script?"killall -0 haproxy" ????interval?1 ????weight -2 } vrrp_instance VI_1 { ????state MASTER?? 這太服務(wù)器為主的keepalived ????interface?eth0??? 通過(guò)eth0網(wǎng)卡廣播 ????virtual_router_id?200??虛擬路由id要改,如果在一個(gè)局域網(wǎng)中有多個(gè)keepalived集群 ????priority?100???優(yōu)先級(jí) ????advert_int?1 ????authentication { ????????auth_type PASS ????????auth_pass?11112222 ????} ????track_script { ????????chk_haproxy ????} ????virtual_ipaddress { ????????192.168.1.200???本機(jī)的虛擬IP ???} ????notify_master?"/etc/keepalived/notify.sh master"?各不用狀態(tài)下運(yùn)行的腳本 ????notify_backup?"/etc/keepalived/notify.sh backup" ????notify_fault?"/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 {?? 另外一臺(tái)主keepalived的從 ????state BACKUP ????interface?eth0 ????virtual_router_id?57 ????priority?99???設(shè)置要比另外一臺(tái)主keepalived的優(yōu)先級(jí)低 ????advert_int?1 ????authentication { ????????auth_type PASS ????????auth_pass?1111 ????} ????track_script { ????????chk_mantaince_down ???} ????virtual_ipaddress { ????????192.168.1.201 ???} } |
3、寫keepalived處在不同狀態(tài)下所運(yùn)行的腳本
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #!/bin/bash # Author: MageEdu <linuxedu@foxmail.com> # description: An example of notify script # vip=192.168.1.200 contact='root@localhost' notify() { ????mailsubject="`hostname` to be $1: $vip floating" ????mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" ????echo $mailbody | mail -s?"$mailsubject"?$contact } ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? case?"$1"?in ????master) ????????notify master ????????/etc/rc.d/init.d/haproxy start ????????exit?0 ????;; ????backup) ????????notify backup ????????/etc/rc.d/init.d/haproxy stop ????????exit?0 ????;; ????fault) ????????notify fault ????????/etc/rc.d/init.d/haproxy stop ????????exit?0 ????;; ????*) ????????echo?'Usage: `basename $0` {master|backup|fault}' ????????exit?1 ????;; esac 給腳本以執(zhí)行權(quán)限: chmod? +x? /etc/keepalived/notify.sh |
?
4、配置haproxy
? ?因?yàn)橐獙?shí)現(xiàn)動(dòng)靜分離,那么我們?cè)谂渲梦募?#xff0c;就要定義動(dòng)態(tài)資源靜態(tài)資源轉(zhuǎn)移到不同的服務(wù)上去
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | [root@node2 ~]# yum -y install haproxy? 安裝haproxy [root@node2 ~]# vim /etc/haproxy/haproxy.cfg ????# ????log?????????127.0.0.1?local2 ????chroot????? /var/lib/haproxy ????pidfile???? /var/run/haproxy.pid ????maxconn?????4000 ????user??????? haproxy ????group?????? haproxy ????daemon ????# turn on stats unix socket ????stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the?'listen'?and?'backend'?sections will #?use?if?not designated?in?their block #--------------------------------------------------------------------- defaults ????mode??????????????????? http????? 指定haproxy工作模式為http ????log???????????????????? global ????option????????????????? httplog ????option????????????????? dontlognull ????option http-server-close?????? 當(dāng)客戶端超時(shí)時(shí),允許服務(wù)端斷開(kāi)連接 ????option forwardfor?????? except?127.0.0.0/8??在http的響應(yīng)頭部加入forwardfor ????option????????????????? redispatch??? #在使用了基于cookie的會(huì)話保持的時(shí)候,通常加這么一項(xiàng),一旦后端某一server宕機(jī)時(shí),能夠?qū)⑵鋾?huì)話重新派發(fā)到其它的upstream servers ????retries?????????????????3 ????timeout http-request??? 10s ????timeout queue?????????? 1m ????timeout connect???????? 10s ????timeout client????????? 1m ????timeout server????????? 1m ????timeout http-keep-alive 10s ????timeout check?????????? 10s ????maxconn?????????????????3000 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend? main *:80??前端代理 ????acl url_static?????? path_beg?????? -i /static?/images /javascript /stylesheets ????acl url_static?????? path_end?????? -i .jpg .gif .png .css .js ????acl url_dynamic????? path_end?????? -i .php ????use_backend?static??????????if?url_static ????default_backend?????????????dynamic #--------------------------------------------------------------------- #?static?backend?for?serving up images, stylesheets and such #--------------------------------------------------------------------- backend?static???后端的靜態(tài)請(qǐng)求響應(yīng) ????balance???? roundrobin ????server??????static?192.168.1.100:80?inter?3000?rise?2?fall?3?check maxconn?5000 #--------------------------------------------------------------------- # round robin balancing between the?various backends #--------------------------------------------------------------------- backend?dynamic???后端的動(dòng)態(tài)請(qǐng)求響應(yīng) ????balance???? roundrobin ????server? dynamic1?192.168.1.101:80?inter?3000?rise?2?fall?3?check maxconn?5000 ????server? dynamic2?192.168.1.102:80?inter?3000?rise?2?fall?3?check maxconn?5000 listen statistics ????????mode http ????????bind *:8080 ~?????? stats enable ????????stats auth admin:admin ????????stats uri /admin?stats?? 指定URI的訪問(wèn)路徑 ????????stats admin?if?TRUE ????????stats hide-version ????????stats refresh 5s ????????acl allow src?192.168.0.0/24???定義訪問(wèn)控制列表 ????????tcp-request content accept?if?allow ????????tcp-request content reject |
?
?
5、配置另外一臺(tái)haproxy服務(wù)器
? ?因?yàn)閮膳_(tái)服務(wù)器的配置大體相同,我們就直接講以上配置好的復(fù)制文件和腳本文件都傳到這臺(tái)haproxy服務(wù)器上,做下修就可以了
?
?
| 1 2 3 4 5 6 7 8 9 | [root@node2 ~]# scp /etc/keepalived/keepalived.conf root@192.168.1.121:/etc/keepalived/ root@192.168.1.121's password: keepalived.conf???????????????????????????????????????????????????????????????????????????????100%?4546?????4.4KB/s???00:00 [root@node2 ~]# scp /etc/keepalived/notify.sh root@192.168.1.121:/etc/keepalived/ root@192.168.1.121's password: notify.sh?????????????????????????????????????????????????????????????????????????????????????100%??751?????0.7KB/s???00:00 [root@node2 ~]# scp /etc/haproxy/haproxy.cfg root@192.168.1.121:/etc/haproxy/ root@192.168.1.121's password: haproxy.cfg???????????????????????????????????????????????????????????????????????????????????100%?3529?????3.5KB/s???00:00 |
?
? ? 傳輸完成,接著來(lái)配置 /etc/keepalived/keepalived.conf ?因?yàn)閮蓚€(gè)節(jié)點(diǎn)上的/etc/haproxy/haproxy.cfg相同不用更改
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | ????interface?eth0 ! Configuration File?for?keepalived global_defs { ???notification_email { ????????root@localhost ???} ???notification_email_from kaadmin@localhost ???smtp_server?127.0.0.1 ???smtp_connect_timeout?30 ???router_id LVS_DEVEL } vrrp_script chk_haproxy { ????script?"killall -0 haproxy" ????interval?1 ????weight -2 } vrrp_instance VI_1 { ????state BACKUP????? 這臺(tái)把master改成 backup ????interface?eth0 ????virtual_router_id?200 ????priority?99???????優(yōu)先級(jí)調(diào)的比上一個(gè)低 ????advert_int?1 ????authentication { ????????auth_type PASS ????????auth_pass?11112222 ????} ????track_script { ????????chk_haproxy ????} ????virtual_ipaddress { ????????192.168.1.200 ???} } vrrp_instance VI_2 { ????state MASTER????? 本臺(tái)的這個(gè)要調(diào)成MASTER,上個(gè)是backup ????interface?eth0 ????virtual_router_id?57 ????priority?100????這個(gè)優(yōu)先級(jí)也要高于上個(gè) ????advert_int?1 ????authentication { ????????auth_type PASS ????????auth_pass?1111 ????} ????virtual_ipaddress { ????????192.168.1.201 ???} ????notify_master?"/etc/keepalived/notify.sh master" ????notify_backup?"/etc/keepalived/notify.sh backup" ????notify_fault?"/etc/keepalived/notify.sh fault" } |
注意:
notify_master?"/etc/keepalived/notify.sh master" notify_backup?"/etc/keepalived/notify.sh backup"notify_fault?"/etc/keepalived/notify.sh fault"
?
3個(gè)狀態(tài)分別要執(zhí)行的腳本,只能放在 MASTER中,原因是:因?yàn)槭腔橹鲝?#xff0c;每個(gè)主的都會(huì)有個(gè)另外一個(gè)主的從,如果
把這 “3個(gè)狀態(tài)執(zhí)行腳本” 寫入到從的區(qū)域中,那么另外一個(gè)主的從狀態(tài)就會(huì)執(zhí)行這個(gè)腳本,因?yàn)榫蜁?huì)停掉所要高可用的
程序,這就造成了,兩個(gè)VIP全部轉(zhuǎn)移到其中一個(gè)服務(wù)器上去。
我們來(lái)驗(yàn)證下,如果keepalived和haproxy分別宕機(jī),vip會(huì)不會(huì)轉(zhuǎn)移:
? ?在兩個(gè)節(jié)點(diǎn)上都啟動(dòng) keepalived和haproxy服務(wù)
?
| 1 2 3 4 | [root@node2 ~]# service haproxy start Starting haproxy:????????????????????????????????????????? [? OK? ] [root@node2 ~]# service keepalived start Starting keepalived:?????????????????????????????????????? [? OK? ] |
?
?
以下為正常情況:
?
keepalived 1:
?
?
keepalived 2:
?
?
我們來(lái)模擬讓第一個(gè)haproxy停止掉,再看下,VIP會(huì)不會(huì)全到 keepalived 2上面去:
?
| 1 2 | [root@node2 ~]# service haproxy stop Stopping haproxy:????????????????????????????????????????? [? OK? ] |
?
查看keepalived 1 和 keepalived 2
?
?
?
? ?看,都過(guò)來(lái)了。。。。
?
?
?
驗(yàn)證負(fù)載均衡很動(dòng)靜分離
? ?我們給3個(gè)web服務(wù)不同的網(wǎng)頁(yè)
? ?1、給apache static一個(gè)靜態(tài)頁(yè)面,來(lái)驗(yàn)證如果請(qǐng)求的不是以 .php結(jié)尾的網(wǎng)頁(yè)文件都定向到這太服務(wù)器上來(lái)
? ?2、給apache dynamic 1 、2 分別兩個(gè) index.php ,實(shí)現(xiàn)對(duì)動(dòng)態(tài)網(wǎng)頁(yè)的負(fù)載均衡
?
我們給apache static 一個(gè)符合-i .jpg .gif .png .css .js的網(wǎng)頁(yè),就給個(gè)圖片網(wǎng)頁(yè)吧
?
apache static
?
| 1 | scp?1.png root@192.168.1.100:/var/www/html |
?
apache dynamic 1
?
| 1 2 3 4 5 | vim /var/www/html/index.php 192.168.1.101 <?php ????phpinfo(); ?> |
?
?apache dynamic 2?
?
| 1 2 3 4 5 | vim /var/www/html/index.php 192.168.1.102 <?php ????phpinfo(); ?> |
?
1、我們來(lái)請(qǐng)求 1.png 結(jié)尾的靜態(tài)文件
?
?
2、我們來(lái)請(qǐng)求 .php結(jié)尾的頁(yè)面
?
?
? ?如此看來(lái),已經(jīng)對(duì)以.php的動(dòng)態(tài)頁(yè)面做了負(fù)載均衡了
?
? ?我們?cè)偻ㄟ^(guò) 192.168.1.201 這個(gè)虛擬 ip 訪問(wèn)試試:
?
?
由此看來(lái),也實(shí)現(xiàn)了雙主模型了,兩個(gè)haproxy同時(shí)可以服務(wù)了。。。
?
3、我們來(lái)看看狀態(tài)頁(yè)面
?
?
?
?
?
本文出自 “l(fā)inux運(yùn)維” 博客,請(qǐng)務(wù)必保留此出處http://xz159065974.blog.51cto.com/8618592/1405812
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3718865.html
總結(jié)
以上是生活随笔為你收集整理的keepalived + haproxy 实现web 双主模型的高可用负载均衡--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CLOSE_WAIT状态的原因与解决方法
- 下一篇: sed命令详解--转