基于LVS負載均衡的高性能Web站點設計與實現

jopen 11年前發布 | 78K 次閱讀 負載均衡 集群/負載均衡

1、部署環境架構設計


隨著Web站點訪問量的不斷提高,Web服務器處理請求的壓力將會日益增大,進而影響到Web站點的性能。當單臺Web服務器所能承受的壓力到達極限時, 就需要有更多的服務器來分擔工作,將流量合理轉移到更多的服務器上。本文主要介紹通過LVS來組建服務器集群,同時配置反向代理服務器實現Web頁面的動 靜分離,以滿足高并發、高可用的生產環境要求。

基于LVS負載均衡的高性能Web站點設計與實現

補充說明:Apache部分亦可以用Nginx替換,具體情況可結合實際生產環境考慮。

機器清單列表:
兩臺LVS服務器,兩臺反向代理服務器,兩臺靜態內容緩存服務器,兩臺動態請求處理服務器,具體用途說明詳見下表。

組件
IP地址
用途
虛擬Web服務器 192.168.85.10 虛擬IP,高性能Web站點的訪問入口
Master主服務器
192.168.85.80
均衡調度Web請求
Backup備份服務器
192.168.85.81
雙機熱備,保證LVS的可用性和穩定性
Nginx
192.168.85.90
zone A的反向代理,記錄接入訪問操作
Nginx
192.168.85.95
zone B的反向代理,記錄接入訪問操作
Varnish + Apache
192.168.85.91
緩存zone A的靜態頁面
Varnish + Apache
192.168.85.96
緩存zone B的靜態頁面
Apache + PHP-FPM
192.168.85.93
處理zone A的動態請求和跳轉規則
Apache + PHP-FPM
192.168.85.97
處理zone B的動態請求和跳轉規則

說明:

(1) zone(區域)可以代表為機柜、交換機甚至是數據中心,將站點架設在不同的zone上,是出于容災的考慮,以此減小Web站點因單點故障而造成無法訪問的風險;

(2) 使用nginx作為純粹的反向代理服務器,將靜態頁面的訪問請求交給Varnish,動態請求交給Apache處理,nginx本身只負責記錄請求訪問的接入狀況以及wap請求的跳轉; 

(3) 靜態資源模塊選用Varnish做cache緩存,與傳統的Squid相比,Varnish具有性能更高、速度更快、管理更方便等諸多優點,分析如下: 
第一, 穩定性更高,在同等負荷的壓力下,Squid發生故障的幾率要比Varnish高,Squid需要經常重啟; 
第二, 訪問速度更快,Varnish采用了“Visual Page Cache”技術,緩存數據直接從內存讀取,內存管理和回收的機制健全,當緩存內容超過內存閾值時,內核會自動將一部分緩存存入swap中讓出內存,從而 避免了頻繁地在內存和磁盤之間進行文件交換; 
第三, Varnish便提供了一個命令行的狀態監控程序varnishstat,從整體上了解Varnish的命中率和緩存狀態,對緩存性能調優有很大的幫助; 
第四, 相比Squid而言,Varnish可以通過管理端口,使用正則表達式快速、批量地清除部分緩存。 
然而,其弊端還是比較明顯的: 
第一, Varnish在高并發狀態下CPU、I/O和內存等資源開銷都高于Squid; 
第二, Varnish進程一旦掛起、崩潰或者重啟,緩存數據都會從內存中完全釋放,此時所有的請求都會被發送到后端服務器,在高并發情況下,這會給后端服務器造成很大壓力; 
第三, 重啟Varnish后,在上線前需要重新計算請求數據,預熱緩存。 

(4) 動態請求模塊,采用Apache和PHP-FPM相結合,以FastCGI模式運行PHP,其好處在于: 
第一, 具有靈活性和可擴展性,在Web服務器和具體CGI程序之間建立了一個智能可持續的中間層,把PHP動態語言和Web服務器分離開來,Web服務器只需將 請求提交到中間層,再由中間層分配到若干個可服用的CGI程序實例中,一方面便于大規模的擴展和改進安全性,另一方面避免了進程反復地fork,根據不同 的狀況fork或者回收實例,達到靈活性和穩定性兼得的目的; 
第二, 出現故障時,可以更好地定位到是Web服務器還是PHP的問題,當PHP出錯時不會搞垮Web服務器,將PHP進程kill掉以后便立即重新啟動一個新的PHP進程替代; 
第三, 可以通過中間層的控制和探測機制來監視實例的運行情況,根據實際的應用進行合理配置達到最佳效果。

2、安裝與配置說明

系統環境:CentOS6.4 x86_64,內核:Linux version 2.6.32-358.el6

2.1 Apache與PHP-FPM

安裝動態請求模塊的機器IP如下: 
192.168.85.93 
192.168.85.97 

1. 安裝編譯相關的依賴包 
# yum install httpd httpd-devel apr apr-devel libtool make gcc 
# /etc/init.d/httpd start  
這時,直接在瀏覽器中輸入服務器的IP地址,即可看到Apache2的默認頁面。 

2. 下載mod_fastcgi源代碼 
# cd /opt/ 
# wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz 

3. 解壓并進行編譯安裝 
# tar zxvf mod_fastcgi-2.4.6.tar.gz 
# cd mod_fastcgi-2.4.6 
# cp Makefile.AP2 Makefile 
# vim Makefile 
修改top_dir目錄,64位系統的路徑為lib64,32位系統的路徑為/usr/lib/httpd 

top_dir      = /usr/lib64/httpd
保存退出后,開始進行編譯安裝。 
# make 
# make install 

4. 加載模塊 
# vim /etc/httpd/conf/httpd.conf 
找到LoadModule部分,添加一行加載語句 
...
LoadModule fastcgi_module modules/mod_fastcgi.so
...

5. 重啟服務 
# /etc/init.d/httpd restart 

如果能正常啟動,則log里面將顯示以下信息  
# grep -i "FastCGI" /var/log/httpd/error_log 
[Mon Jul 29 06:54:27 2013] [notice] FastCGI: process manager initialized (pid 2098)  
[Mon Jul 29 06:54:27 2013] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fastcgi/2.4.6 configured -- resuming normal operations  

6. 安裝PHP-FPM(FastCGI進程管理器) 
PHP-FPM(FastCGI 進程管理器)用于替換 PHP FastCGI 的大部分附加功能,對于高負載網站是非常有用的。 
# yum install php-fpm 
# /etc/init.d/php-fpm start 
# chkconfig php-fpm on 
# netstat -anp |grep php 
tcp   0      0    127.0.0.1:9000     0.0.0.0:*        LISTEN  2575/php-fpm         
unix  3      [ ]         STREAM     CONNECTED     25812  2575/php-fpm         
unix  3      [ ]         STREAM     CONNECTED     25811  2575/php-fpm         

7. 修改配置 
新建一個配置文件/etc/httpd/conf.d/fastcgi.php.conf 
DirectoryIndex index.html index.shtml index.cgi index.php
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /var/www/cgi-bin/php5-fcgi
FastCgiExternalServer /var/www/cgi-bin/php5-fcgi -idle-timeout 60 -host 127.0.0.1:9000 -pass-header Authorization

重啟Apache和PHP-FPM:  
# service httpd restart  
# service php-fpm restart 

2.2 Varnish與Apache

</div>

安裝靜態緩存模塊的機器IP如下: 
192.168.85.91 
192.168.85.96 

<br />

<span style="font-weight:600;">1. 安裝repo源及軟件</span>  
<br />

<span style="background-color:#CCCCCC;"># rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-\</span>  
<br />

<span style="background-color:#CCCCCC;">release-3.0-1.el6.noarch.rpm</span>  
<br />

<span style="background-color:#CCCCCC;"># yum install varnish</span>  
<br />

<span style="background-color:#CCCCCC;"># yum install httpd</span>  
<br />

<br />
  1. 修改配置文件 
    (1) Apache的默認服務端口更改為8080 


    #Listen 12.34.56.78:80
    Listen 8080


    啟動Apache服務:  

    # service httpd start 


    (2) Varnish需要配置好后端服務器Apache的位置,以便找到需要緩存加速的文件。 
    # vim /etc/varnish/default.vcl 
    backend default {
          .host = "127.0.0.1";
          .port = "8080";
    }

    3. 啟動Varnish 
    # varnishd -f /etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:80 
    其中,-f指定的是Varnish配置文件位置,-s指定分配的緩存空間大小,-T為Varnish管理接口的監聽地址,-a指定對外接收HTTP請求的監聽地址。 

    2.3 Nginx反向代理

    </div> 安裝反向代理模塊的機器IP如下: 
    192.168.85.90 
    192.168.85.95 


    1. 安裝repo源及軟件 

    # rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 

    # yum install nginx 


    2. 修改配置文件 
    主配置文件/etc/nginx/nginx.conf無需做太大改動,只需將worker_processes設置成與機器CPU核數相等即可(如CPU數為1,則worker_processes  1;),以zone A為例: 

    # vim /etc/nginx/conf.d/virtual.conf 

    upstream backend {
        server 192.168.85.90;
    }
    server {
        listen           80;
        server_name     192.168.85.91;
    # 靜態緩存
        location / {
            proxy_pass http://backend;
        }
    # 動態請求
        location ~ \.(php)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http:// 192.168.85.93;
        }
    }

    3. 啟動nginx服務 
    # service nginx start 

    2.4 LVS負載均衡

    </div> 安裝負載均衡模塊的機器IP如下: 
    192.168.85.80 
    192.168.85.81 
    LVS有四種常見的工作模式:NAT、DR、TUNNEL、FNAT。本文選用的工作模式為DR(Direct Route),負載均衡器接收用戶的請求,然后根據負載均衡算法選取一臺realserver,將包轉發過去,最后由realserver直接回復給用 戶。 


    1. 下載所需軟件 

    #cd /opt/ 

    # wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz 

    # wget http://www.keepalived.org/software/keepalived-1.1.18.tar.gz 

    # yum install -y openssl openssl-devel* popt* 


    2. 安裝ipvsadm(master和backup都需要安裝) 
    首先,建立內核快捷方式 

    # ln -s /usr/src/kernels/2.6.32-358.14.1.el6.x86_64/ /usr/src/linux 
    如果沒有找到相關路徑或文件,則需要手動安裝內核 

    # yum -y install kernel-devel 
    然后,解壓并編譯ipvsadm 

    # cd /opt/ 

    # tar zxvf ipvsadm-1.24.tar.gz 

    # cd ipvsadm-1.24 

    # make 

    # make install 
    接下來,測試ipvsadm是否安裝成功 

    # /sbin/ipvsadm –v 
    ipvsadm v1.24 2005/12/10 (compiled with getopt_long and IPVS v1.2.1) 
    顯示上述信息則表示安裝成功。 


    3. 安裝keepalived(master和backup都需要安裝) 

    # cd /opt/ 

    # tar zxvf keepalived-1.1.18.tar.gz 

    # cd keepalived-1.1.18 

    # ./configure --prefix=/usr/local/keepalived 

    # make 

    # make install 

    # cd /usr/local/keepalived/ 

    # cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 

    # cp etc/sysconfig/keepalived /etc/sysconfig/ 

    # mkdir /etc/keepalived 

    # cp etc/keepalived/keepalived.conf /etc/keepalived/ 

    # cp sbin/keepalived /usr/sbin/ 
    啟動keepalived 

    # service keepalived start 


    4. 修改master和backup的配置文件 
    首先,開啟ip_forward轉發功能 

    # sysctl -w net.ipv4.ip_forward=1 
    然后,配置keepalived.conf文件 

    # vim /etc/keepalived/keepalived.conf 

    ! Configuration File for keepalived

    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }

    vrrp_instance VI_1 {
        state MASTER                           # 備份服務器上將MASTER改為BACKUP
        interface eth0                           # HA監測網絡接口
        virtual_router_id 51                      # 主、備機的virtual_router_id必須相同
        priority 30                              # 主、備機取不同的優先級,主機值較大,備份機值較小
        advert_int 1                             # VRRP Multicast廣播周期秒數
        authentication {
            auth_type PASS                      # VRRP認證方式
            auth_pass 1111                      # VRRP口令字
        }
        virtual_ipaddress {
            192.168.85.10                       # 如果有多個VIP,繼續換行填寫
        }
    }

    virtual_server 192.168.85.10 80 {
        delay_loop 2                            # 每隔2秒查詢realserver狀態
        lb_algo rr                               # lvs 算法
        lb_kind DR                              # Direct Route

        persistence_timeout 50                   # 同一IP的連接50秒內被分配到同一臺realserver
        protocol TCP                            # 用TCP協議檢查realserver狀態


        real_server 192.168.85.90 80 {
            weight 80
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }

        real_server 192.168.85.95 80 {
            weight 20
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }


    BACKUP服務器同上配置,先安裝lvs再按裝keepalived,仍后配置/etc/keepalived/keepalived.conf,只需將紅色標示的部分改一下即可。  5. 配置VIP 

    # vim /etc/sysconfig/network-scripts/ifcfg-lo:0 

    DEVICE=lo:0
    IPADDR=192.168.85.10
    NETMASK=255.255.255.255
    ONBOOT=yes
    NAME=loopback
    重啟網卡和keepalived服務即可。
    6. 配置ipvsad  m(master和backup都需要設置好) 
    添加負載均衡器 
    # /sbin/ipvsadm -A -t 192.168.85.10:80 -s rr 
    增加realserver 
    # /sbin/ipvsadm -a -t 192.168.85.10:80 -r 192.168.85.90:80 -g   # 192.168.85.90是真實機的ip 
    # /sbin/ipvsadm -a -t 192.168.85.10:80 -r 192.168.85.95:80 -g   # 192.168.85.95是真實機的ip 
    # route add -host 192.168.85.10 dev lo:0 

    7.配置realserver(所有的Proxy Server都要設置好) 
    配置vip地址 
    # /sbin/ifconfig lo:0 192.168.85.10 netmask 255.255.255.255 broadcast 192.168.85.10 up 
    # route add -host 192.168.85.10 dev lo:0 


    3、環境測試

    3.1 Apache與PHP-FPM

    創建phpinfo頁面,查看詳細配置信息。 
    # echo "" > /var/www/html/info.php 
    瀏覽器中訪問http://192.168.85.93/info.php,顯示頁面如下。 
    基于LVS負載均衡的高性能Web站點設計與實現 

    Server API顯示為通過FPM提供服務,使用FastCGI協議傳遞請求,配置成功。 

    3.2 Varnish與Apache

    輸入varnishstat指令查看varnish運行情況,最重要的是 cache_hit 和 cache_miss 這兩行。如果沒有任何命中,cache_hits 不會顯示。當越來越多的請求進來,計數器會不斷更新以反應新的命中數和未命中數。 
    基于LVS負載均衡的高性能Web站點設計與實現 

    另外,常用的還有varnishlog指令,當中有很多的選項可以在查詢時使用。因此,強烈推薦在排錯或測試時使用varnishlog。可以閱讀varnish的man page來查看這個命令的詳細使用情況。下面是一些使用的例子。 
    顯示varnish和客戶端之間的通信(忽略后端web服務器):
    # varnishlog -b
    顯示varnish接收到的HTTP頭信息(既有客戶端請求的,也有web服務器響應的):
    # varnishlog -c -i RxHeader
    只顯示web服務器響應的頭信息:
    # varnishlog -Dw /var/log/varnish.log
    從/var/log/varnish.log中讀取所有日志信息
    # kill `cat /var/run/varnish.pid`
    這個命令會從/var/run/varnish.pid中讀取varnish的主進程的PID,并給這個進程發送TERM信號,從而關閉varnish。


    3.3 Nginx

    通過分別訪問靜態頁面(.html)和動態頁面(.php),測試動靜分離是否生效,以zone A為例: 
    訪問靜態頁面: 
    # curl –I http://192.168.85.90/index.html 
    HTTP/1.1 200 OK
    Server: nginx/1.0.15
    Date: Tue, 30 Jul 2013 05:58:21 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Last-Modified: Sun, 28 Jul 2013 19:30:16 GMT
    ETag: "bff82-16-4e29767d7c8be"
    Content-Length: 22
    Accept-Ranges: bytes
    X-Varnish: 810334599
    Age: 0
    Via: 1.1 varnish

    訪問動態頁面: 
    # curl –I http://192.168.85.90/info.php 
    HTTP/1.1 200 OK
    Server: nginx/1.0.15
    Date: Tue, 30 Jul 2013 06:00:23 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    X-Powered-By: PHP/5.3.3

    3.4 LVS負載均衡

    </div> 首先,靜態資源服務器中新建一個index.html頁面,然后,再驗證LVS是否能提供服務。 
    Zone A:192.168.85.91 

    # echo " This is zone A! " > /var/www/html/index.html 
    Zone B:192.168.85.96 

    # echo " This is zone B! " > /var/www/html/index.html 


    在master機器上查看負載均衡器的運行狀況: 

    # ipvsadm -L -n 
    IP Virtual Server version 1.2.1 (size=4096) 
    Prot LocalAddress:Port Scheduler Flags 
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
    TCP  192.168.85.10:80 rr persistent 50 
      -> 192.168.85.90:80             Route   40     0          0  
      -> 192.168.85.95:80             Route   1       0          0  


    訪問Web站點,從瀏覽器頁面可知,訪問請求跳轉到了zone A 

    基于LVS負載均衡的高性能Web站點設計與實現 
    將zone A的Nginx反向代理關閉,重新訪問Web站點,從瀏覽器頁面可知,訪問請求跳轉到zone B 
    (注意清空瀏覽器緩存) 
    基于LVS負載均衡的高性能Web站點設計與實現 
    由此可見,LVS能夠按照預期設定,通過檢查綁定服務器的可用性,將Web站點的訪問請求跳轉到對應的反向代理服務器當中。


    參考資料

    http://my.oschina.net/alanlqc
    https://www.varnish-cache.org/installation/redhat
    https://www.varnish-cache.org/docs/3.0/
    http://blog.csdn.net/poechant/article/details/7256184
    http://blog.yunvi.com/html/797.html

    原文地址:http://my.oschina.net/alanlqc/blog/151395

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!