HAProxy+KeepAlived實現web服務高可用、動靜分離等

來源:互聯網
上載者:User

標籤:haproxy   keepalived   高可用   動靜分離   負載平衡   

大致規劃:

主機 IP 描述
VIP 192.168.0.222 對外提供高可用IP
haproxy+keepalived (node1) 192.168.0.111

haproxy為後端兩台WEB服務的做動靜分離;keepalived為haproxy做高可用。

haproxy+keepalived (node2) 192.168.0.112
WEB                (node3) 192.168.0.113 提供靜態請求響應
Apache+PHP+MySQL   (node4) 192.168.0.114 提供動態請求響應

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/25/8B/wKioL1NjUnCD4CJDAAErkscIJt4586.jpg" title="映像 055.jpg" alt="wKioL1NjUnCD4CJDAAErkscIJt4586.jpg" />

一、KeepAlived的簡介以原理

Keepalived的作用是檢測web伺服器的狀態,如果有一台web伺服器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的只是修複故障的web伺服器。

Layer3,4&7工作在IP/TCP協議棧的IP層,TCP層,及應用程式層,原理分別如下:

  • Layer3:Keepalived使用Layer3的方式工作式時,Keepalived會定期向伺服器群中的伺服器發送一個ICMP的資料包(既我們平時用的Ping程式),如果發現某台服務的IP地址沒有啟用,Keepalived便報告這台伺服器失效,並將它從伺服器群中剔除,這種情況的典型例子是某台伺服器被非法關機。Layer3的方式是以伺服器的IP地址是否有效作為伺服器工作正常與否的標準。在本文中將採用這種方式。

  • Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP連接埠的狀態來決定伺服器工作正常與否。如web server的服務連接埠一般是80,如果Keepalived檢測到80連接埠沒有啟動,則Keepalived將把這台伺服器從伺服器群中剔除。

  • Layer7:Layer7就是工作在具體的應用程式層了,比Layer3,Layer4要複雜一點,在網路上佔用的頻寬也要大一些。Keepalived將根據使用者的設定檢查伺服器程式的運行是否正常,如果與使用者的設定不相符,則Keepalived將把伺服器從伺服器群中剔除。

--引用百度百科

二、安裝相關軟體

WEB和LAMP搭建這裡不做贅述;安裝完成後可以測試是否正常訪問。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/25/8A/wKiom1NjVRfRlDxfAADl932OBRk864.jpg" title="映像 056.jpg" alt="wKiom1NjVRfRlDxfAADl932OBRk864.jpg" />

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/25/8B/wKioL1NjVPrgCghMAAEjpXxWvrQ427.jpg" title="映像 057.jpg" alt="wKioL1NjVPrgCghMAAEjpXxWvrQ427.jpg" />

測試兩台機器正常訪問。

為node1和node2各自安裝keepalived和haproxy;為了簡便;yum安裝即可

[[email protected] ~]# rpm -q keepalived haproxykeepalived-1.2.7-3.el6.x86_64haproxy-1.4.24-2.el6.x86_64                                                                                                                                                                                                                                      -----------------------------------------------                                                                                                                                                                                                                                    [[email protected] ~]# rpm -q keepalived haproxykeepalived-1.2.7-3.el6.x86_64haproxy-1.4.24-2.el6.x86_64[[email protected] ~]#

三、配置haproxy實現動靜分離

這裡在node1上示範;node2同樣的配置:

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg#這裡對應global段和default段不做任何修改;但是日誌需要在global段開啟;#其餘的全部注釋;任何重新添加以下內容;#具體含義上一篇以做解釋;這裡就不做詳細介紹frontend  web    bind *:80    acl url_static       path_beg       -i /static /images /javascript /stylesheets    acl url_static       path_end       -i .jpg .gif .png .css .js .html .htm    acl url_dynamic      path_end       -i .php                                                                                                                                                                                             use_backend static          if url_static    use_backend dynamic         if url_dynamic    default_backend             staticbackend static     balance    roundrobin     server  node3 192.168.0.113:80 checkbackend dynamic     balance    roundrobin     server  node4 192.168.0.114:80 checklisten stats     mode http     bind *:1234     stats enable     stats refresh 3s     stats hide-version     stats uri  /admin?stats     stats realm HAProxy\ Statistics     stats auth admin:haproxy     stats admin if TRUE                                                                                                                                                                                          -------------------------------------------------------------------#複製一份到node2即可;各自啟動haproxy  [[email protected] ~]# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/haproxy.cfg                                                          100% 3896     3.8KB/s   00:00  [[email protected] ~]#

查看stats資訊:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/25/8B/wKioL1NjZLvyNBcUAATw7yxWOH4863.jpg" title="映像 058.jpg" alt="wKioL1NjZLvyNBcUAATw7yxWOH4863.jpg" />

如後端有多台機器;則可以實現負載平衡;這裡未做執行個體。

四、配置keepalived實現haproxy的高可用

同樣在node1上配置;但是node2需要更改兩個地方:

[[email protected] ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalived                                                                                                                                              global_defs {                 #全域配置   notification_email {        [email protected]        #接受郵件方   }   notification_email_from [email protected]  #寄件者   smtp_server 127.0.0.1                   #郵件伺服器   smtp_connect_timeout 30                 #逾時時間長度   router_id LVS_DEVEL                     #ID;隨意即可}                                                                                                                                              vrrp_script chk_down {                     #添加監控規則    script "[[ -f /root/down ]] && exit 1 || exit 0"#上面說明如果在/roo/下有down檔案;就失敗;轉移到從上;否則正常    interval 1             #多久監控一次    weight 2               #權重}                                                                                                                                              vrrp_script chk_haproxy {  #監控haproxy服務的    script "pidof haproxy &> /dev/null && exit 0 || exit 1"    interval 1    weight 2}                                                                                                                                              vrrp_instance VI_1 {        #添加一個執行個體    state MASTER            #定義主從    #注意node2從的上為BACKUP    interface eth0          #網路介面    virtual_router_id 222   #虛擬路由ID;根據該ID產生虛擬MAC;保證其唯一性    priority 100            #優先順序別;BACKUP要低於MASTER    advert_int 1            #心跳廣播間隔    authentication {        #認證        auth_type PASS      #明文認證        auth_pass 1111      #password    }    virtual_ipaddress {     #虛擬IP        192.168.0.222    }    track_script {          #指令碼追蹤;生效上述定義指令碼        chk_down        chk_haproxy    }    notify_master "/etc/keepalived/notify.sh master"   #郵件通知    notify_backup "/etc/keepalived/notify.sh backup"    notify_fault "/etc/keepalived/notify.sh fault"}#更改以上資訊;其餘設定檔中的資訊全部注釋即可---------------------------------------------------------#複製一份到node2;根據上述描述變更

提供haproxy指令碼:

[[email protected] ~]# vim /etc/keepalived/notify.sh#!/bin/bash# Author: MageEdu <[email protected]># description: An example of notify script#vip=192.168.0.222contact=‘[email protected]‘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                                                                                                                                  #完成後複製一份到node2即可#啟動keepalived即可

五、測試haproxy的高可用

[[email protected] ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000    link/ether 00:0c:29:5e:1e:4f brd ff:ff:ff:ff:ff:ff    inet 192.168.0.111/16 brd 192.168.255.255 scope global eth0    inet 192.168.0.222/32 scope global eth0    inet6 fe80::20c:29ff:fe5e:1e4f/64 scope link       valid_lft forever preferred_lft forever                                                                                                                              #查看虛擬IP目前在node1上;

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/25/8B/wKioL1NjcfPQuN2hAAIaatxUA24321.jpg" title="映像 059.jpg" alt="wKioL1NjcfPQuN2hAAIaatxUA24321.jpg" />

測試訪問正常;下面down掉node1看下;

#由於設定檔定義了一個down的指令碼;直接建立檔案即可[[email protected] ~]# touch down[[email protected] ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000    link/ether 00:0c:29:5e:1e:4f brd ff:ff:ff:ff:ff:ff    inet 192.168.0.111/16 brd 192.168.255.255 scope global eth0    inet6 fe80::20c:29ff:fe5e:1e4f/64 scope link       valid_lft forever preferred_lft foreverYou have new mail in /var/spool/mail/root    #這裡也提示有郵件資訊                                                                                                           ------------------------------------------------------------------                                                                                                           [[email protected] ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 00:0c:29:df:70:b6 brd ff:ff:ff:ff:ff:ff    inet 192.168.0.112/16 brd 192.168.255.255 scope global eth0    inet 192.168.0.222/32 scope global eth0                                                                                                           #測試已轉移到node2上

同時測試頁面也是正常的。

測試haproxy指令碼是否能夠執行

[[email protected] ~]# service haproxy stopStopping haproxy:                                          [  OK  ][[email protected] ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000    link/ether 00:0c:29:5e:1e:4f brd ff:ff:ff:ff:ff:ff    inet 192.168.0.111/16 brd 192.168.255.255 scope global eth0    inet6 fe80::20c:29ff:fe5e:1e4f/64 scope link                                                                                  ----------------------------------------------------------------------                                                                                  [[email protected] ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 00:0c:29:df:70:b6 brd ff:ff:ff:ff:ff:ff    inet 192.168.0.112/16 brd 192.168.255.255 scope global eth0    inet 192.168.0.222/32 scope global eth0                                                                                  ---------------------------------------------------------------------                                                                                  [[email protected] ~]# tail -5 /var/log/messagesMay  2 18:25:10 node1 Keepalived_vrrp[5331]: VRRP_Script(chk_haproxy) failedMay  2 18:25:10 node1 Keepalived_vrrp[5331]: VRRP_Instance(VI_1) Received higher prio advertMay  2 18:25:10 node1 Keepalived_vrrp[5331]: VRRP_Instance(VI_1) Entering BACKUP STATEMay  2 18:25:10 node1 Keepalived_vrrp[5331]: VRRP_Instance(VI_1) removing protocol VIPs.May  2 18:25:10 node1 Keepalived_healthcheckers[5330]: Netlink reflector reports IP 192.168.0.222 removed                                                                                  #可以查看系統日誌也記錄詳細資料#測試啟動haproxy後;虛擬IP會自動轉回。

到此;HAProxy+KeepAlived配置以全部完成;相關功能也都已測試成功。




如有錯誤;懇請糾正。

本文出自 “Soul” 部落格,請務必保留此出處http://chenpipi.blog.51cto.com/8563610/1405554

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.