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è)谂渲梦募?,就要定義動(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ù)端斷開連接 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 var ious 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)槭腔橹鲝模總€(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è)面
本文出自 “linux運(yùn)維” 博客,請(qǐng)務(wù)必保留此出處http://xz159065974.blog.51cto.com/8618592/1405812
聯(lián)系客服