手把手讓你實現開源企業級web高併發解決方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

 

此文凝聚筆者不少心血請尊重筆者勞動,轉載請註明出處。違法直接人肉出電話 寫大街上。

http://freeze.blog.51cto.com/
個人小站剛上線

http://www.linuxwind.com

有問題還可以來QQ羣89342115交流。

 


 

今兒網友朋友說:freeze黔驢技窮了,博客也不更新,也不跟網友互動了.

.
..
...
那好吧,我就來一篇重量級的..這篇就叫做
《手把手讓你實現開源企業級web高併發解決方案》
(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

本來想起個比較風趣點的標題,可想來思去,還是走常規路線,做一系列的手把手吧。
這樣一來,便於我的老朋友們識別,也讓我對這篇文章的粒度把我有個定位。
 
本篇博文主要介紹利用開源的解決方案,來爲企業搭建web高併發服務器架構花了一個多小時,畫了張圖片,希望能先幫你理解整個架構,之後我在一一介紹.linux的大型架構其實是一點點小架構拼接起來的,筆者從各個應用開始配置,最後在完全整合起來,以實現效果。
 

 

web開源高併發解決方案


筆者所使用的環境爲RHEL5.4 內核版本2.6.18 實現過程在虛擬機中,所用到的安裝包爲DVD光盤自帶rpm包

裝過 Development Libraries  Development Tools 包組 

 筆者虛擬機有限,只演示單邊varnish配置





 

一、配置前端LVS負載均衡

筆者選用LVS的DR模型來實現集羣架構,如果對DR模型不太了了解的朋友建議先去看看相關資料。 

本模型實例圖爲:

   現在director上安裝ipvsadm,筆者yum配置指向有集羣源所以直接用yum安裝。

yum install ipvsadm

下面是Director配置:

       DIP配置在接口上 172.16.100.10

        VIP配置在接口別名上:172.16.100.1

    varnish服務器配置:RIP配置在接口上:172.16.100.11 ;VIP配置在lo別名上

如果你要用到下面的heartbeat的ldirectord來實現資源轉換,則下面的# Director配置 不用配置

 

  1. # Director配置
  2. ifconfig eth0 172.16.100.10/16 
  3. ifconfig eth0:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up 
  4. route add -host 172.16.100.1 dev eth0:0 
  5. echo 1 > /proc/sys/net/ipv4/ip_forward 
  1. # varnish服務器修改內核參數來禁止響應對VIP的ARP廣播請求 
  2. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  4. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  5. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  1. # 配置VIP 
  2. ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up 
  3. # 凡是到172.16.100.1主機的一律使用lo:0響應 
  4. route add -host 172.16.100.1 dev lo:0  
  1. # 在Director上配置Ipvs,筆者虛擬機有限,只演示單臺配置
  2. ipvsadm -A -t 172.16.100.1:80 -s wlc 
  3. ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2 
  4. ipvsadm -Ln 

 

至此,前端lvs負載均衡基本實現,下面配置高可用集羣




 PS:如果用ldirectord把lvs定義爲資源的話,前面

二、heartbeat高可用集羣

本應用模型圖:

高可用則是當主服務器出現故障,備用服務器會在最短時間內代替其地位,並且保證服務不間斷。

 簡單說明:從服務器和主服務器要有相同配置,才能在故障遷移時讓***感受不到,從而保證服務不間斷運行。在你的兩臺機器(一臺 作爲主節點,另一臺爲從節點)上運行heartbeat, 並配置好相關的選項,最重要的是lvs資源一定要配置進去。那麼開始時主節點提供lvs服務,一旦主節點崩潰,那麼從節點立即接管lvs服務。

SO:

director主服務器和從服務器都有兩塊網卡,一塊eth0是和後面varnish服務器通信,另一塊eth1是彼此之間監聽心跳信息和故障遷移是資源轉移。筆者用的eth0是172.16.100.0網段 vip爲172.16.100.1 監聽心跳爲eth1網卡,主從的IP分別爲10.10.10.1(node1) 和10.10.10.2(node2)

 修改上面模型圖兩臺主從服務器的信息

  1. vim /etc/hosts 
  2. 10.10.10.1    node1.heartbeat.com         node1 
  3. 10.10.10.2    node2.heartbeat.com        node2 
  4. #用於實現兩臺director節點間域名解析,此操作node1、node2相同 
  1. vim /etc/sysconfig/network 
  2. #設置主機名 
  3. hostname node1.heartbeat.com  
  4. #修改主機名使之立即生效,node2也同樣修改爲node2.heartbeat.com

 爲了安全起見,node1和node2的通信需要加密進行

  1. ssh-keygen -t rsa 
  2. #生成密鑰 
  3. ssh-copy-id -i .ssh/id_rsa.pub root@node2.heartbeat.com
  4. #將公鑰複製給node2 
  5. ssh node2 -- ifconfig
  6. #執行命令測試,此時應該顯示node2的ip信息 

 準備工作完成,下面開始安裝heartbeat和ldirectord

所需要的安裝包爲

heartbeat安裝包

本人直接用yum來實現,能自動解決依賴關係node1和node2都需要安裝

  1. yum localinstall -y --nogpgcheck ./* 
  2. #安裝此目錄中的所有rpm包 

 安裝後配置:

  1. cd /usr/share/doc/heartbeat-2.1.4 
  2. cp authkeys /etc/ha.d/ 
  3. cp haresources /etc/ha.d/ 
  4. cp ha.cf /etc/ha.d/ 
  5. #拷貝heartbeat所需配置文件到指定目錄下 
  1. vim /etc/ha.d/ha.cf 
  2. bcast eth1 
  3. #定義心跳信息從那一塊網卡傳輸 
  4. node node1.heartbeat.com
  5. node node2.heartbeat.com
  6. #添加這兩行,用於指明心跳信號傳輸範圍 
  7. vim /etc/ha.d/authkeys 
  8. auth 2 
  9. 2 sha1 [鍵入隨機數] 
  10. chmod 400 authkeys 
  11. #保存退出並修改權限400 
  12. vim /etc/ha.d/haresource 
  13. node1.heartbeat.com         172.16.100.1/24/eth0/172.16.0.255 ldirectord::ldirectord.cf httpd
  14. #末行添加主節點域名,vip資源,廣播地址,ldirectord資源,以及用戶提供顯示錯誤頁面的httpd資源

同步配置文件到node2

  1. /usr/lib/heartbeat/ha_propagate 
  2. #腳本用來同步ha.cf和authkeys文件到node2 
  3. scp haresources node2:/etc/ha.d/ 
  4. #複製haresource到nod2 

 

 配置ldirectord,同步配置文件

  1. cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/ldirectord.cf 
  2. #複製ldirector的配置文件 

 內容如下配置

  1. checktimeout=5 
  2. #當DR收不到realserver的迴應,設定幾秒後判定realserver當機或掛掉了,預設5秒。 
  3. checkinterval=3 
  4. #查詢間隔,每個幾秒偵測一次realserver 
  5. autoreload=yes 
  6. #配置文件發生改變是否自動重讀 
  7. quiescent=yes 
  8. #靜態鏈接,yes:表示偵測realserver宕機,將其權值至零(如果開啓了persistent參數不要用yes);no:表示偵測到宕機realserver,隨即將其對應條目從ipvsadm中刪除。 
  9. virtual=172.16.100.1:80 
  10.         real=172.16.100.11:80 gate 4 
  11.         fallback=127.0.0.1:80 gate #realserver全部失敗,vip指向本機80端口。 
  12.         service=http 
  13.         request="test.html" #用於健康檢測的url,realserver的相對路徑爲var/www/html目錄
  14.         receive="ok"    #用於健康檢測的url包含的關鍵字 
  15.         scheduler=wlc 
  16.         #persistent=600 
  17.         #持久鏈接:表示600s之內同意ip將訪問同一臺realserver 
  18.         protocol=tcp 
  19.         checktype=negotiate 
  20.         #檢查類型:negotiate,表示DR發送請求,realserver恢復特定字符串才表示服務正常;connect,表示DR能夠連線realserver即正常。 
  21.         checkport=80 

啓動兩個節點上的heartbeat

  1. service heartbeat start 
  2. ssh node2 -- 'service heartbeat start' 
  3. #啓動兩節點heartbeat服務  

 啓動後查看/var/log/messages 可以看到啓動過程,並可以手動執行/usr/lib/heartbeat/下的hb_standby 來釋放資源hb_takeover來爭奪資源

還可以通過ipvsadm -Ln 在主節點上查看lvs的資源狀態

 

至此,帶狀態檢測的前端集羣已經佈置完畢,下面就是varnish緩存服務器和後端nginx的web應用配置

 

 

 


 


三:varnish緩存服務器

有些朋友可能對varnish不太熟悉,簡單做個介紹:

     今天寫的這篇關於Varnish的文章,已經是一篇可以完全替代Squid做網站緩存加速器的詳細解決方案了。網上關於Varnish的資料很少,中文資料更是微乎其微,希望本文能夠吸引更多的人研究、使用Varnish。

  在我看來,使用Varnish代替Squid的理由有三點:
1、Varnish採用了“Visual Page Cache”技術,在內存的利用上,Varnish比Squid具有優勢,它避免了Squid頻繁在內存、磁盤中交換文件,性能要比Squid高。
2、Varnish的穩定性還不錯,順便說一句,Varnish的性能的發揮關鍵在於Varnish配置文檔的優化.
3、通過Varnish管理端口,可以使用正則表達式快速、批量地清除部分緩存,這一點是Squid不能具備的
    4. 還有一點,應該算是Varnish的缺點了吧,就是Varnish的緩存基本上在內存中,如果Varnish進程停止再啓動,Varnish就會重新訪問後端Web服務器,再一次進行緩存.雖然Squid性能沒有Varnish高,但它停止、重啓的時候,可以直接先從磁盤讀取緩存數據。

    varnish是一款高性能的開源HTTP加速器,挪威最大的在線報紙 Verdens Gang (http://www.vg.no) 使用3臺Varnish代替了原來的12臺squid,性能比以前更好。

    varnish的作者Poul-Henning Kamp是FreeBSD的內核開發者之一,他認爲現在的計算機比起1975年已經複雜許多。在1975年時,儲存媒介只有兩種:內存與硬盤。但現在計算機系統的內存除了主存外,還包括了cpu內的L1、L2,甚至有L3快取。硬盤上也有自己的快取裝置,因此squid cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但操作系統可以得知這些情況,所以這部份的工作應該交給操作系統處理,這就是 Varnish cache設計架構.

 

    現在大多數網站都拋棄了 Apache,而選擇nginx是因爲前者能承受的併發連接相對較低;
拋棄了 Squid,因爲它在內存利用、訪問速度、併發連接、清除緩存等方面不如 Varnish;
拋棄了 PHP4,因爲 PHP5 處理面向對象代碼的速度要比 PHP4 快,另外,PHP4 已經不再繼續開發;
拋棄了 F5 BIG-IP 負載均衡交換機,F5 雖然是個好東西,但由於價格不菲,多個部門多個產品都運行在其之上,流量大、負載高,從而導致性能大打折扣;

  利用 Varnish cache 減少了90%的數據庫查詢,解決了MySQL數據庫瓶頸;
利用 Varnish cache 的內存緩存命中加快了網頁的訪問速度;
利用 Nginx + PHP5(FastCGI) 的勝過Apache 10倍的高併發性能,以最少的服務器數量解決了PHP動態程序訪問問題;
利用 Memcached 處理實時數據讀寫;
利用 HAProxy 做接口服務器健康檢查;

  經過壓力測試,每臺Web服務器能夠處理3萬併發連接數,承受4千萬PV完全沒問題。


 可以去varnish的官網下載最新的源碼包,筆者爲了便於演示,就用rpm包了,(別鄙視我)

varnish官網地址:http://www.varnish-cache.org/

我下的是最新的varnish-release-3.0-1.noarch.rpm

先rpm -ivh varnish-release-3.0-1.noarch.rpm

它的作用是給你yum生成varnish的倉庫,然後你在用yum安裝varnish

yum install varnish

 

安裝好後配置文件爲/etc/default.vcl 

本人只實現基本功能,沒有對varnish做優化,所以配置比較簡單

 

配置完成後保存退出,需手動啓動

varnishd -f /etc/varnish/default.vcl -s malloc,128m -T 127.0.0.1:2000

-f etc/varnish/default.vcl     -f 指定varnishd使用哪個配置文件。

-s malloc,1G                                                -s用來指定varnish使用的存儲類型和存儲容量。我使用的是 malloc 類型(malloc 是一個 C 函數,用於分配內存空間),  1G  定義多少內存被 malloced。

-T 127.0.0.1:2000                                        -T 指定varnish的管理端口。Varnish有一個基於文本的管理接口,啓動它的話可以在不停止 varnish 的情況下來管理 varnish。您可以指定管理軟件監聽哪個接口。

-a 0.0.0.0:8080                                             指定varnish所監聽所有IP發給80的http請求。如果不指定-a ,則爲默認監聽0.0.0.0:

ps:先配置nginx在配置varnish可以直接測試效果,本人爲了演示架構層次,所以就一層一層的配置了,建議如果按我的順序做的話,後端web服務器先用yum裝上apache方便測試。varnish到此就配置成功。到此我在幫各位順一下思路

 

 

目前,如果你完全按照本文章做實驗,我們用了5臺服務器。

一臺director 它的vip爲172.16.100.1  DIP爲172.16.100.10

與它實現高可用的從服務器vip爲172.16.100.1 DIP爲 172.16.100.12 

而這兩臺服務器都裝的有heartbeat和ipvsadm 並通過ldirectord把VIP定義爲資源,會自動流動,和自動添加ipvsadm分發條目

在ipvsadm中 定義的有一臺varnish服務器 地址爲172.16.100.11

varnish緩存服務器在做反向代理時後端是兩臺web服務器分別爲web1和web2

IP分別爲172.16.100.15和172.16.100.17 下圖幫你順下思路

 

 

 


 


 


四:nginx服務器+php+eAccelerator

(1)編譯安裝PHP 5.3.6所需的支持庫:

  1. tar zxvf libiconv-1.13.1.tar.gz 
  2. cd libiconv-1.13.1/ 
  3. ./configure --prefix=/usr/local 
  4. make 
  5. make install 
  6. cd ../ 
  1. tar zxvf libmcrypt-2.5.8.tar.gz  
  2. cd libmcrypt-2.5.8/ 
  3. ./configure 
  4. make 
  5. make install 
  6. /sbin/ldconfig 
  7. cd libltdl/ 
  8. ./configure --enable-ltdl-install 
  9. make 
  10. make install 
  11. cd ../../ 
  1. tar zxvf mhash-0.9.9.9.tar.gz 
  2. cd mhash-0.9.9.9/ 
  3. ./configure 
  4. make 
  5. make install 
  6. cd ../ 
  1. ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la 
  2. ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so 
  3. ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4 
  4. ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8 
  5. ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a 
  6. ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la 
  7. ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so 
  8. ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2 
  9. ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1 
  10. ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config 
  1. tar zxvf mcrypt-2.6.8.tar.gz 
  2. cd mcrypt-2.6.8/ 
  3. /sbin/ldconfig 
  4. ./configure 
  5. make 
  6. make install 
  7. cd ../ 

 

  1. cd php-5.3.6

    ./configure --prefix=/usr/local/php-fcgi --enable-fpm --with-config-file-path=/usr/local/php-fcgi/etc --enable-zend-multibyte  --with-libxml-dir=/usr/local/libxml2 --with-gd --with-jpeg-dir --with-png-dir --with-bz2 --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-curl --with-mhash --with-openssl --enable-bcmath --with-mcrypt=/usr/local/libmcrypt --enable-sysvsem --enable-inline-optimization --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-debug --disable-ipv6

    make

    make install

    cp php.ini-production /usr/local/php-fcgi/etc/php.ini

    mkdir /usr/local/php-fcgi/ext



 編譯安裝PHP5擴展模塊

 


字數滿了,餘下內容在下一篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章