負載均衡解決方案(HA)之---LVS(Linux Virtual Server)

       在Discuz!NT的最新版本(企業版)中,支持目前主流LINUX平臺上的負載均衡解決方案,比如NGINX,HAPROXY,LVS等。本文與其說是解決方案,倒不如說是介紹如何搭建Discuz!NT負載均衡解決方案:)

       因爲我們的產品運行的主流平臺是WINDOWS+IIS+SQLSERVER(2000以上版本),而LVS+KEEPALIVED是LINUX下的四層負載均衡軟件。其有如下特點:

      LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率(在DR模式下),將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。一般來說,LVS集羣採用三層結構,其主要組成部分爲:

  A、負載調度器(load balancer),它是整個集羣對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址(我們可稱之爲虛擬IP地址)上的。

  B、服務器池(server pool),是一組真正執行客戶請求的服務器,即realserver,執行的服務有WEB、MAIL、FTP和DNS等。

  C、共享存儲(shared storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。

 

     LVS的IP負載均衡技術實現:
  目前IP負載均衡技術是在負載調度器的實現技術中效率最高的。LVS集羣中實現的三種IP負載均衡技術,分別是:
     Virtual Server via Network Address Translation (VS/NAT): 也有說端口映射的,其目標是將一組服務器構成一個高性能的、高可用的虛擬服務器。因爲這種技術容易形成單點故障,從而造成網路無法訪問,並且存在帶寬瓶頸。所以LVS又提供了下面兩種實現。

     Virtual Server via IP Tunneling (VS/TUN ): 通過IP隧道實現虛擬服務。
     Virtual Server via Direct Routing (VS/DR) :直接路由實現虛擬服務器的方法(負載能力最強),本文搭建的就是DR模式。

 

      我們的產品目前如果要作用負載均衡技術,則需要在管理後臺開啓遠程附件(FTP)和分佈式緩存服務(MEMCACHED),有關這兩個功能可以參見我之前寫的這兩篇文章。    
     http://www.cnblogs.com/daizhj/archive/2010/02/08/discuznt_memcache_syncdata.html 
     http://www.cnblogs.com/daizhj/archive/2008/07/28/1254648.html

 

      這樣我們的產品配置就完成了,下面介紹一下相應的服務器環境搭建。首先是IIS配置站點(要求在一個物理網段上) 

 RealServer 1:10.0.8.13:80
 RealServer 2:10.0.8.12:80

 VIP(虛擬IP):10.0.8.9

 兩臺虛擬機安裝Centos5.4(採用DHCP安裝模式),地址:
 Centos1: 10.0.8.25 (keepalived:MASTER)
 Centos2: 10.0.8.55 (keepalived:BACKUP)

 

 

      首先要說明的是,因爲這裏使用的是LVS的VS/DR模式(上面提到),也就是要求REALSERVER會直接將結果返回到客戶端,即下面圖中(右側)描述:

  

 

      所以我們還需要在windows 服務器上配置VIP,可以使用下面的方法 :
      1.在控制面板裏添加一個硬件設備, Microsoft Loopback Adapter ,如下圖:
     

          

 

     2.設置ip爲vip,掩碼隨意:
           

   

      3.進註冊表編輯器,搜索這個vip,把掩碼改成255.255.255.255,然後禁用啓用網卡即可(在window server 2003系統中有三處)。
            

 

      這樣在‘網上鄰居’上看相應Microsoft Loopback Adapter 的IP MASK就變成了255.255.255.255。然後在IIS的相應站點下配置IP地址,可使用VIP地址或使用‘全部未分配選項’。如下圖:
       


      這樣配置就完成了,之後用:
      c:/>telnet 10.0.8.13 80和c:/>telnet 10.0.8.12 80  看一下配置是否已正常啓用。

 

      這樣就完成了windows服務器的配置工作。在介紹如何如何安裝配置LVS和KEEPALIVED之前,先要說明一下在虛擬機安裝CENTOS時要注意的幾個問題,如下:

    1.因爲Keepalived需要gcc工具來編譯所以要在安裝時定製一下安裝組件,如下:

      

     

 

 

 

      然後安裝程序會檢驗相應組件依賴性

 

  

    2.之後安裝防火牆時選擇禁用:

 

   

      3.selinux也是禁用:
      

 

     下面開始介紹一下linux下如何安裝配置LVS和KEEPALIVED.

     1.首先安裝lvs的管理工具ipvsadm(直接使用yum安裝即可),啓用Centos1虛擬機(10.0.8.25),進入終端模式,鍵入      

# yum –y install ipvsadm

    
     2.然後安裝keepalived,因爲Keepalived需要gcc工具來編譯,所以請安裝它(前文已做介紹),在編譯時,keepalived倚賴openssl和內核源代碼 

# yum –y install openssl-devel  kernel-devel 

  

     3.去官方下載最新的keepalived,解壓縮,然後編譯: 

#wget http://www.keepalived.org/software/keepalived-1.1.18.tar.gz
#tar zxvf keepalived-1.1.18.tar.gz
#cd keepalived-1.1.18
#./configure --with-kernel-dir=/usr/src/kernels/2.6.18-164.15.1.el5-i686 
--prefix=/usr/local/keepalived #將其佈署在LVS的目錄下
#上面的with-kernel-dir是和lvs集成必須的編譯參數

 

  注:with-kernel-dir是和lvs集成必須的編譯參數,因爲keepalived要被放到/usr/local/keepalived下進行編譯,另外kernels內核源碼會因linux版本不同而有所變化。

    顯示結果:
    ------------------------
 ....
 Compiler                 : gcc
 Compiler flags           : -g -O2
 Extra Lib                : -lpopt -lssl -lcrypto
 Use IPVS Framework       : Yes   (這裏必須爲yes)
 IPVS sync daemon support : Yes   (這裏必須爲yes)
 Use VRRP Framework       : Yes   (這裏必須爲yes)
 Use LinkWatch            : No 

    # make && make install  #編譯

 
       4.做成啓動服務 

 #ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
 #ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
 #mkdir /etc/keepalived
 #ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
 #ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
 #service keepalived start #關閉:stop

      

       5.綁定虛擬IP(該步驟在某些安裝環境下可以忽略,因爲keepalived會自動維護vip,並根據設置,自動在系統裏添加vip,所以該步驟可能用途不大) 

    #/sbin/ifconfig eth0:0 10.0.8.9 broadcast 10.0.8.9 netmask 255.255.255.255 up  #這樣的設置可防止IP衝突
    #/sbin/route add -host 10.0.8.9 dev eth0:0

 

       6.配置network(/etc/sysconfig/network )文件,內容如下(注:該步驟在網上某些文章中提到,這裏也就隨手多做了一步):    

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    GATEWAY=10.0.8.1

     

       7.LVS 在3 種方式下均需要打開ip forward 功能,這可以配置/etc/sysctl.conf. 文件,保證其中有如下一行(注:該步驟在網上某些文章中提到,這裏也就隨手多做了一步):    
         #net.ipv4.ip forward = 1
         #sysctl -p  #然後執行下面命令使配置生效:    

 

         備註:因爲KEEPALIVED要使用80端口(稍後配置文件中會做設置),所以如果要馬上啓用80端口,可以啓動Apache,用下面命令(這一步並不在安裝步驟中):

    #service httpd start (或restart)

          

 

         完成了環境配置之後,下面就是打開並修改Keepalived.conf文件了,我們可以從下面地址打開並編輯它:
         /usr/local/keepalived/etc/keepalived.conf
         或:
         /etc/keepalived/keepalived.conf (之前的ln指令指向)

         這裏將10.0.8.25這臺虛擬機設置爲MASTER,配置文件如下(相應配置信息詳見這篇文章):

 

! 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
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0   #HA監測網絡接口
    virtual_router_id 51 #主、備機的virtual_router_id必須相同
    priority 100   #主、備機取不同的優先級,主機值較大,備份機值較小,值越大優先級越高
    advert_int 1   #VRRP Multicast廣播週期秒數
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       10.0.8.9
    }
}

virtual_server 10.0.8.9 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 10 !同一ip50秒內的請求都發送到同一realserver
    protocol TCP

    real_server 10.0.8.12 80 {
        weight 2
            TCP_CHECK {
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
             connect_port 80
            }
   }

    real_server 10.0.8.13 80 {
        weight 2
            TCP_CHECK {
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
             connect_port 80
            }
    }
}

 

      

        然後我們使用如下命令啓用keepalived:       

#keepalived #位於/usr/local/keepalived/sbin/

         或    

#service keepalived start

       

       我們可以通過下面指令來查看相應進程:   

#ps aux|grep keepalived

    ------------------------------

   sr/local/keepalived/etc/keepalived/keepalived.conf
 root     17670  0.0  0.2   4932   564 ?        Ss   19:03   0:00 keepalived -D
 root     17671  0.0  0.6   4976  1416 ?        S    19:03   0:02 keepalived -D
 root     17672  0.0  0.4   4976   928 ?        S    19:03   0:00 keepalived -D
 ....

         這裏注意keepalived要啓動一個主並fork兩個子進程,所以這裏顯示了三個進程。

         這裏我們可以下面指令檢查一下配置是否生效: 

 #ping 10.0.8.9 -c 4
 #telnet 10.0.8.9 80

         

        如果正常的話,就說明keepalived已啓用了我們的配置。

        注:之前本人配置過程中發現telnet經常無法正常訪問,可以使用下面指令查看80端口是否啓用: 

 #netstat -npl | grep :80  #windows下相應指令爲:netstat -an|findstr LISTEN

 

        也可以使用下面指令檢查LVS進程: 

 #lsmod | grep ip_vs

 

        到這裏就完成了10.0.8.25這臺虛擬機上的keepalived配置。然後重複1-7這些步驟,在10.0.8.55上也安裝並配置keepalived,這裏要注意的是在keepalived.conf文件中要將state MASTER改成state BACKUP

        接着,我們在IE上輸入下面地址: http://10.0.8.9/index.aspx

 

        如果能正常訪問,就說明負載均衡環境搭建完畢了       

        注:還可以配置HOST文件(/etc/hosts)和DNS域名解析的配置文件(/etc/resolv.conf)

      

        我們可以使用下面指令查看請求的轉發情況:

 [root@localhost ~]# ipvsadm -lcn|grep 10.0.8.9

  -------------------------------------------
                                          clientip                  vip                   realserver
TCP 14:44  ESTABLISHED 10.0.4.102:5244    10.0.8.9:80        10.0.8.12:80
TCP 14:44  ESTABLISHED 10.0.4.102:5232    10.0.8.9:80        10.0.8.12:80
TCP 07:35  ESTABLISHED 10.0.4.102:4875    10.0.8.9:80        10.0.8.13:80
TCP 14:44  ESTABLISHED 10.0.4.102:5249    10.0.8.9:80        10.0.8.12:80
TCP 14:46  ESTABLISHED 10.0.4.102:5246    10.0.8.9:80        10.0.8.12:80
TCP 08:40  ESTABLISHED 10.0.4.102:4913    10.0.8.9:80        10.0.8.12:80
TCP 08:40  ESTABLISHED 10.0.4.102:4927    10.0.8.9:80        10.0.8.12:80
TCP 14:44  ESTABLISHED 10.0.4.102:5247    10.0.8.9:80        10.0.8.12:80
TCP 08:40  ESTABLISHED 10.0.4.102:4929    10.0.8.9:80        10.0.8.12:80
TCP 07:35  ESTABLISHED 10.0.4.102:4872    10.0.8.9:80        10.0.8.13:80
TCP 14:47  ESTABLISHED 10.0.4.102:5243    10.0.8.9:80        10.0.8.12:80
TCP 08:40  ESTABLISHED 10.0.4.102:5011    10.0.8.9:80        10.0.8.12:80
TCP 14:56  ESTABLISHED 10.0.4.102:5245    10.0.8.9:80        10.0.8.12:80
TCP 00:44  NONE        10.0.4.102:0       10.0.8.9:80        10.0.8.12:80
TCP 00:34  NONE        10.0.4.102:0       10.0.8.9:65535     10.0.8.13:65535
TCP 07:35  ESTABLISHED 10.0.4.102:4848    10.0.8.9:80        10.0.8.13:80


        接着我們可以把10.0.8.12:80或10.0.8.13:80 站點停掉,看看訪問是否正常。
        然後我們將10.0.8.25或10.0.8.55 虛擬機上關掉keepalived (使用killall keepalived或serivce keepalived stop),再用IE訪問相應網址看看。
        另外那臺機器上的keepalived能否正常切換接管。如果正常,就說明這個環境是HA(高可用的)。


        最後再羅列一些常的指令,以便大家查看keepalived運行情況和網絡狀況:

   #tail -f /var/log/messages   #查看系統日誌
   #tcpdump src host 10.0.8.9 and port 80  #抓包
   #curl -I http://10.0.8.9/  #利用URL語法在命令行方式下的文件傳輸工具
   #ip addr  #IP地址信息或ip add show eth0 查看虛擬IP綁定情況
   #service iptables stop #關閉iptables防火牆
   #iptables –nvL  #列出防火牆進入數據信息
   #ipvsadm -ln #查看lvs服務是否正常,包括活動鏈接,weight(keepalived配置),內部鏈接等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章