天天看點

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

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

安裝靜态緩存子產品的機器IP如下: 

192.168.85.91 

192.168.85.96 

1. 安裝repo源及軟體 

# rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-\ 

release-3.0-1.el6.noarch.rpm 

# yum install varnish 

# yum install httpd 

2. 修改配置檔案 

(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反向代理

安裝反向代理子產品的機器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負載均衡

安裝負載均衡子產品的機器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 {

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   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 "<?php phpinfo(); ?>" > /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負載均衡

首先,靜态資源伺服器中建立一個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

轉載于:https://my.oschina.net/alanlqc/blog/151395