HAProxy基于KeepAlived實現Web高可用及動靜分離

前言

軟件負載均衡一般通過兩種方式來實現:基于操作系統的軟負載實現和基于第三方應用的軟負載實現。LVS是基于Linux操作系統實現的一種軟負載,而HAProxy則是基于第三方應用實現的軟負載。HAProxy相比LVS的使用要簡單很多,但跟LVS一樣,HAProxy自己并不能實現高可用,一旦HAProxy節點故障,將會影響整個站點。本文帶來的是HAProxy基于KeepAlived實現Web高可用及動靜分離。

相關介紹

HAProxy

HAProxy是一款提供高可用性、負載均衡以及基于TCP和HTTP應用的代理軟件,HAProxy是完全免費的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP應用的代理解決方案。HAProxy適用于那些負載較大的web站點,這些站點通常又需要會話保持或七層處理。 HAProxy可以支持數以萬計的并發連接,并且HAProxy的運行模式使得它可以很簡單安全的整合進架構中,同時可以保護web服務器不被暴露到網絡上。

KeepAlived

Keepalived采用VRRP(virtual router redundancy protocol,虛擬路由冗余協議)熱備份協議,以軟件的方式實現linux服務器的多機熱備功能。VRRP是針對路由器的一種備份解決方案——由多臺路由器組成一個熱備組。通過共用的虛擬IP地址對外提供服務;每個熱備組內同一時刻只有一臺主服務器提供服務,其他服務器處于冗余狀態,若當前在線的服務器失敗,其他服務器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。

高可用解決方案

實驗拓撲

基于Keepalived實現Web高可用及動靜分離.jpg

#系統環境:CentOS6.6
#Static Server:httpd
#Dynamic Servicer:LAMP

配置過程

HA集群配置前提

時間同步、基于主機名互相通信、SSH互信

請確保兩個節點時間同步,可用ntpdate向時間服務器同步

[root@node1 ~]# ntpdate cn.pool.ntp.org

基于主機名互相通信

[root@node1 ~]# vim /etc/hosts
   
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
   
[root@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
   
[root@node1 ~]# uname -n
node1.scholar.com
   
#兩個節點都需如上操作

SSH互信

[root@node1 ~]# ssh-keygen -t rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~]# ssh-keygen -t rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~]# date; ssh node2 'date' #測試
Wed Jun 24 15:58:46 CST 2015
Wed Jun 24 15:58:46 CST 2015

安裝所需程序

[root@node1 ~]# yum install keepalived haproxy -y

#兩個節點都安裝

配置keepalived

[root@node1 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {        #定義VRRP實例,實例名自定義
    state MASTER            #指定Keepalived的角色,MASTER為主服務器,BACKUP為備用服務器
    interface eth0          #指定HA監測的接口
    virtual_router_id 51    #虛擬路由標識(1-255),在一個VRRP實例中主備服務器ID必須一樣
    priority 100            #優先級,數字越大越優先,主服務器優先級必須高于備服務器
    advert_int 1            #設置主備之間同步檢查時間間隔,單位秒
    authentication {        #設置驗證類型和密碼
        auth_type PASS      #驗證類型
        auth_pass ab007     #設置驗證密碼,同一實例中主備密碼要保持一致
    }
    virtual_ipaddress {     #定義虛擬IP地址
        192.168.12.21
    }
}
 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 61
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.12.22
    }
}

將配置文件同步給另一個節點

[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf                                        100%  787     0.8KB/s   00:00

修改另一個節點配置文件

[root@node2 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ab007
    }
    virtual_ipaddress {
        192.168.12.21
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.12.22
    }
}

配置HAProxy

[root@node1 ~]# vim /etc/haproxy/haproxy.cfg 

global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    log         127.0.0.1 local2      #日志將通過rsyslog進行歸檔記錄
    chroot      /var/lib/haproxy      #運行的安裝路徑
    pidfile     /var/run/haproxy.pid  #pid文件存放的位置
    maxconn     4000                  #最大連接
    user        haproxy               #運行haproxy的用戶
    group       haproxy               #運行haprixy的組
    daemon                            #以后臺模式運行haproxy
    # 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                #工作模式
    log                     global              #記錄日志
    option                  httplog             #詳細記錄http日志
    option                  dontlognull         #不記錄健康檢查的日志信息
    option http-server-close                    #啟用服務器端主動關閉
    option forwardfor       except 127.0.0.0/8  #傳遞客戶端IP
    retries                 3                   #請求重試次數
    timeout http-request    10s                 #http請求超時時間
    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  proxy *:80
    #定義ACL
    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 .jsp
    use_backend dynamic          if url_dynamic   #調用后端服務器并檢查ACL規則是否被匹配
    default_backend             static
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static           #后端調度
    balance     source   #調度算法
    server      s1 172.16.10.125:80 inter 1500 rise 2 fall 3  check 
#----------------------------------------
listen statistics
    mode http                           #http 7 層模式
    bind *:8080                         #監聽地址
    stats enable                        #啟用狀態監控
    stats auth admin:admin              #驗證的用戶與密碼
    stats uri /admin?status             #訪問路徑
    stats hide-version                  #隱藏狀態頁面版本號
    stats admin if TRUE                 #如果驗證通過了就允許登錄
    stats refresh 3s                    #每3秒刷新一次
    acl allow src 192.168.12.0/24       #允許的訪問的IP地址
    tcp-request content accept if allow #允許的地址段就允許訪問
    tcp-request content reject          #拒絕非法連接
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend dynamic
    balance     source
    server      s2 172.16.10.12:80 check inter 1500 rise 2 fall 3 
#check inter 1500是檢測心跳頻率
#rise2 2次正確認為服務器可用
#fall3 3次失敗認為服務器不可用

將配置文件同步至另一節點

[root@node1 ~]# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/
haproxy.cfg                                       100% 4471     4.4KB/s   00:00

web端配置

準備測試頁面

#static server
[root@scholar ~]# vim /var/www/html/index.html 

<h1>172.16.10.125</h1>

[root@scholar ~]# service httpd start
Starting httpd:                                            [  OK  ]

#dynamic server
[root@scholar ~]# vim /var/www/html/index.php

<h1>172.16.10.20</h>
<?php
     $link = mysql_connect('127.0.0.1','root','');
     if ($link)
       echo "Success...";
     else
       echo "Failure...";
     mysql_close();
     phpinfo();
?>

[root@scholar ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@scholar ~]# service mysqld start
Starting mysqld:                                           [  OK  ]

啟動服務

[root@node1 ~]# service haproxy start; ssh node2 'service haproxy start'
Starting haproxy:                                          [  OK  ]
Starting haproxy: [  OK  ]
[root@node1 ~]# service keepalived start; ssh node2 'service keepalived start'
Starting keepalived:                                       [  OK  ]
Starting keepalived: [  OK  ]

動靜分離及高可用測試

查看各節點IP情況

1.jpg

2.jpg

靜態頁面

3.jpg

動態頁面

3.1.jpg

靜態頁面

4.jpg

動態頁面

4.1.jpg

查看狀態頁面

5.jpg

模擬一個節點故障

[root@node1 ~]# service haproxy stop
Stopping haproxy:                                          [  OK  ]
[root@node1 ~]# service keepalived stop
Stopping keepalived:                                       [  OK  ]

查看各節點IP信息

6.jpg

7.jpg

VIP轉移了,繼續訪問測試

8.jpg

訪問不受任何影響,至此高可用及動靜分離目的實現

The end

HAProxy基于KeepAlived實現Web高可用及動靜分離實驗就先說到這里了,本次實驗因資源有限只提供了兩臺web服務器,如有多臺可設置輪詢實現負載均衡,這里就不做多介紹了,部署過程遇到問題可留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5659

(0)
書生書生
上一篇 2015-06-24
下一篇 2015-06-25

相關推薦

  • rsync+inotify實現數據實時備份

    rsync+inotify實現數據實時備份 §·rsync簡單介紹 1 §·什么是rsync 1 §·rsync的功能特性 1 §·rsync的優點和不足 2 §·初識inotify 2 §·rsync命令工作模式 2 §·rsync常用命令選項 3 §·配置rsync以守護進程的方式運行 3 ※·安裝并啟動 xinetd 3 ※·為rsync服務器提供配置…

    Linux干貨 2016-10-30
  • linux終端的類型與linux發展歷史

    一、linux console的類型與說明 說明:        1 由于虛擬終端的實現,人們可以多用戶多任務的在一臺計算機操作系統上工作             2 在80或90年代的舊電腦上,人們只能用分屏這樣的方法來實現多用戶,多任務的工作  …

    Linux干貨 2013-07-03
  • 馬哥教育網絡班21期+第六周課程練習

    第六周作業 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; cp /etc/rc.d/rc.sysinit /tmpvim /tmp/rc.sysinit # 命令模式下,輸入一下內容:%s@\(^[[:space:]]…

    Linux干貨 2016-10-17
  • Linux包管理:rpm/yum/編譯安裝

    rpm:安裝,查詢,升級,校驗,卸載   Topic: 程序包 rpm管理 yum管理   程序包:   什么是程序包管理器: 將編譯好的應用程序的各個組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作   程序包的組成清單: 文件清單 安裝或卸載時運行的腳本 數據庫(公共) …

    2017-09-14
  • linux特殊權限管理

    特殊權限:SUID, SGID, STICKY 正常情況下:  1、進程以某用戶的身份運行; 進程是發起此進程用戶的代理,因此以此用戶的身份和權限完成所有操作; 2、權限匹配模型: (1) 判斷進程的屬主,是否為被訪問的文件屬主;如果是,則應用屬主的權限;否則進入第2步; (2) 判斷進程的屬主,是…

    Linux干貨 2015-12-19
  • sed工具 vim編輯器

    sed工具:    用法:           sed [option]… 'script' inputfile…      常用選項:           &nbs…

    Linux干貨 2016-08-12

評論列表(4條)

  • stanley
    stanley 2015-06-25 10:07

    書生的圖已經設計出自我風格的logo了,哈~

    • 書生
      書生 2015-07-08 11:01

      @stanley呃呃 版權所有 嘿嘿

  • jy00278439
    jy00278439 2015-07-08 13:49

    請問你的拓撲圖用的是什么軟件?

    • 書生
      書生 2015-07-14 10:58

      @jy00278439一款在線編輯器 Cacoo

欧美性久久久久