LVS+keepalived-DR模式

 下面一張圖 其實就是企業的集羣架構圖  結合前面的技術加上今天的lvs+keepalived負載均衡nginxde技術就能夠搭建出來  前面的實驗累積一塊兒就是這張圖 只不過她的web服務器比咱們實驗的機器要多 其實理論是同樣的 那麼結合之前的實驗 今天我們能夠作一個完整的網絡圖前端

 

集羣圖大概上這樣的 ,可是條件有限我這裏就開3臺機器 其實還要加一臺lvs從,防止主掛機能夠切到從上面,vs從就不作了,後面會給你們一些配置文件,其實從和主同樣,就是keepalived的優先級不同,下面有lvs從的配置文件 安裝和主同樣.mysql

實驗環境:(環境你們能夠參照其它筆記搭建)linux

192.168.1.120   lvs+keepalived負載nginx服務器(主)nginx

192.168.1.116   nginx負載均衡服務器web

192.168.1.118   nginx負載均衡服務器算法

192.168.1.117   lap+tomcat1+tomcat2 WEB服務器(通常每臺web服務器只配一個網站 tomcat能夠配置多個)sql

192.168.1.18    mysql主也是keepalived數據庫

(這裏咱們用5臺就能夠演示出來 固然你的機器好的話 也能夠把我們前面兩臺數據庫和兩臺web服務器均可以開起來 也能夠在配置一臺lvs從,這樣效果更明顯)後端

 今天的內容是lvs+keepalived 來負載前端nginx服務器  作到這裏那麼咱們上一張的nginx+keepalived 就能夠不用了 若是說大家公司就兩臺nginx服務器 那麼nginx+keepalived就能夠的,可是 一旦nginx服務器多的話 keepalived沒有使用的價值了,今天的lvs+keepalived就是來解決前端多臺nginx負載均衡的問題。。。。。。。。。。。。tomcat

 

LVS 簡單工做原理:用戶請求LVS VIP,LVS根據轉發方式和算法,將請求轉發給後端服務器,後端服務器接受到請求,返回給用戶。對於用戶來講,看不到WEB後端具體的應用。

LVS轉發方式有三種,分別是NAT、DR、TUN模式,經常使用算法:RR、LC、WRR、WLC模式等(RR爲輪詢模式,LC爲最少鏈接模式)

 

假以下面就是1.116和1.118的nginx負載均衡的網站 兩個網站是同樣的要怎麼不用訪問這兩臺nginx的ip  lvs能夠解決負載nginx( 前端兩臺nginx  後端兩臺web服務器+兩臺數據庫)這裏條件有限就在兩臺nginx上配置兩個同樣的網站。 

步驟1.

  • LVS環境安裝配置192.168.1.120

下載LVS所需軟件ipvsadm-1.2.4.tar.gz軟件,編譯安裝:

wget -c  

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

ln -s /usr/src/kernels/2.6.*  /usr/src/linux  //IPVS模塊編譯進內核裏,須要作軟鏈接

(這裏寫的是本身機器的內內核 這裏記住若是內核Tab不出來, 那麼咱們就安裝內核擴展包 yum –y install kernel kernel-devel)

yum -y install gcc* openssl openssl-devel

tar xzvf ipvsadm-1.24.tar.gz &&cd ipvsadm-1.24 && make && make install

 

(下面的黃色標記的公司通常不會用這種方式來作 下面的keepalived的配置能夠來完成)

LVS安裝完畢以後,須要進行配置,配置的步驟有兩步,第一步爲定義端口服務,第二步爲添加realserver後端服務。

ipvsadm -A -t 192.168.1.199:80 -s rr

ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.116 -g -w 2

ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.118 -g -w 2

能夠用腳本自動部署:server_lvs.sh

#!/bin/bash

SNS_VIP=192.168.1.199

SNS_RIP1=192.168.1.116

SNS_RIP2=192.168.1.118

echo 1 > /proc/sys/net/ipv4/ip_forward

. /etc/rc.d/init.d/functions

function IPVSADM(){

/sbin/ipvsadm --set 30 5 60

/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $SNS_VIP dev eth0:0

/sbin/ipvsadm -A -t $SNS_VIP:80 -s wlc -p 120

/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1

/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1

/etc/init.d/ipvsadm save

}

case "$1" in

start)

IPVSADM

echo "-----------------------------------------------------"

/sbin/ipvsadm -Ln

touch /var/lock/subsys/ipvsadm > /dev/null 2>&1

;;

stop)

/sbin/ipvsadm -C

/sbin/ipvsadm -Z

ifconfig eth0:0 down >>/dev/null 2>&1

route del $SNS_VIP >>/dev/null 2>&1

rm -rf /var/lock/subsys/ipvsadm > /dev/null 2>&1

echo "ipvsadm stopped!"

;;

status)

if [ ! -e /var/lock/subsys/ipvsadm ]

then

echo "ipvsadm stopped!"

exit 1

else

echo "ipvsadm started!"

fi

;;

*)

echo "Usage: $0 {start | stop | status}"

exit 1

esac

exit 0

參數說明:

-A 增長一臺虛擬服務器地址。

-t  虛擬服務器提供的是tcp服務。

-s  使用的調度算法

-a  在虛擬服務器中增長一臺後端真實服務器。

-r  指定真實服務器地址。

-m 設置當前轉發方式爲NAT模式;-g爲直接路由模式;-i  模式爲隧道模式

-w 後端真實服務器的權重。

ipvsadm -D -t 192.168.1.199:80

ipvsadm -d -t 10.143.130.106:80 -r 10.143.130.107:80

查看LVS轉發列表命令爲:ipvsadm –Ln

 咱們會發現,若是這臺LVS發生突發狀況,down機了,那後端全部的應用程序都訪問不了。如何避免這種問題呢,這裏須要用到故障切換,也就是若是有一臺備用的LVS就行了,主down了,自動切換到從,怎麼實現這個需求,接下來說解的keepalived軟件就是專門用來作故障檢測及切換的。

須要注意一點,若是使用了keepalived.conf配置,就不須要再執行ipvs –A命令去添加均衡的realserver命令了,全部的配置都會在keepalived.conf裏面,一個配置文件搞定全部,即只須要安裝ipvs模塊。

步驟2.

  • Keepalived安裝配置

官方下載keepalived相應穩定版本:

cd /usr/src ;wget -c  http://www.keepalived.org/software/keepalived-1.1.15.tar.gz 

tar -xzvf keepalived-1.1.15.tar.gz &&cd keepalived-1.1.15 && ./configure && make && make install

(這裏的keepalived安裝不須要編譯內核了 和前面mysql+keepalived安裝方法不同了 由於咱們安裝lvs的時候已經定義了)

 

這裏編譯出錯 就安裝yum install popt-devel)

安裝完畢,配置keepalived服務爲系統服務。

DIR=/usr/local/

cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ && cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p /etc/keepalived && cp $DIR/sbin/keepalived /usr/sbin/

 

MASTER上/etc/keepalived/目錄建立keepalived.conf配置文件,並寫入以下內容:

! Configuration File for keepalived

global_defs {

   notification_email {

      wgkgood@163.com

   }

   notification_email_from wgkgood@163.com

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

# VIP1

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    lvs_sync_daemon_inteface eth0

    virtual_router_id 51

    priority 100

    advert_int 5

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.199   

    }

}

virtual_server 192.168.1.199 80 {

    delay_loop 6    

    lb_algo wrr    

    lb_kind DR   

#    persistence_timeout 60    

    protocol TCP         

    real_server 192.168.1.116 80 {

        weight 100        

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 192.168.1.118 80 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80      

        }

    }

}

以上就是keepalived的配置文件 記住上面的vip的ip要保證沒有被使用 這裏是兩臺nginx服務器 若是還有多個nginx服務器就在配置文件裏面添加real_server 對應的配置段

下面能夠看到咱們的lvs+keepalived配置成功

 

 

Lvs從上安裝lvs和主安裝是同樣的  keepalived上配置以下就好了  我這裏就不演示了:

如上配置文件,紅色標記的地方須要注意,state狀態主服務器設置MASTER,從設置爲BACKUP,優先級備機設置比MASTER小,例如設置90,使用TCP端口檢測。

LVS BACKUP服務器寫入以下配置,須要注意的是客戶端的配置要修改優先級及狀態:

! Configuration Filefor keepalived

global_defs {

  notification_email {

   wgkgood@163.com

  }

  notification_email_from wgkgood@163.com

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id LVS_DEVEL

}

# VIP1

vrrp_instance VI_1 {

  state BACKUP

  interface eth0

  lvs_sync_daemon_inteface eth0

  virtual_router_id 51

  priority 90

  advert_int 5

  authentication {

    auth_type PASS

    auth_pass 1111

  }

  virtual_ipaddress {

    192.168.1.199

  }

}

virtual_server 192.168.1.199 80 {

  delay_loop 6

  lb_algo wrr

  lb_kind DR

# persistence_timeout 60

  protocol TCP

  real_server 192.168.1.116 80 {

    weight 100

    TCP_CHECK {

    connect_timeout 10

    nb_get_retry 3

    delay_before_retry 3

    connect_port 80

    }

}

  real_server 192.168.1.118 80 {

    weight 100

    TCP_CHECK {

    connect_timeout 10

    nb_get_retry 3

    delay_before_retry 3

    connect_port 80

    }

  }

}

如上設置,LVS 主備配置完畢,接下來須要在realserver配置LVS VIP,爲何要在realserver綁定VIP呢?

客戶端訪問director的VIP,director接收請求,將經過相應的算法將請求轉發給相應的realserver。在轉發的過程當中,會修改請求包的目的mac地址,目的ip地址不變。

Realserver接收請求,並直接響應客戶端。這時便出現一個問題,director此時與realserver位於同一個網絡中,當director直接將請求轉發給realserver時,realserver檢測到該請求包的目的ip是vip而並不是本身,便會丟棄,而不會響應。爲了解決這個問題,因此須要在全部Realserver上都配上VIP。

 

爲何必定要配置在lo接口上呢?

realserver上的lo口配置VIP,這樣限制了VIP不會在物理交換機上產生MAC地址表,從而避免IP衝突。

客戶端nginx服務器上啓動Realserver.sh腳本內容:

#!/bin/sh

#LVS Client Server

VIP=192.168.1.199 (這裏的vip 要和lvs上的keepalived配置文件裏面的vip是同樣的)

case  $1  in                                                                                                                                                                                                                                                    

start)                                                                                                                                                                                                                                            

    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

    /sbin/route add -host $VIP dev lo:0

    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

    sysctl -p >/dev/null 2>&1

    echo "RealServer Start OK"

    exit 0

;;                                                                                                                                                                                                                                         

stop)

    ifconfig lo:0 down

    route del $VIP >/dev/null 2>&1

    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

    echo "RealServer Stoped OK"

    exit 1

;;

*)

    echo "Usage: $0 {start|stop}"

;;

esac

在客戶端nginx服務器都要執行上面的腳本 執行方式以下 兩臺nginx都是同樣在lo上綁定虛擬ip 兩臺都要指定 有多少nginx服務器就指定多少

 

  

這是咱們來作個驗證  就是把其中一臺nginx服務關掉看看有什麼效果:

 

這裏咱們會發現那臺nginx服務關掉了 lvs就會從路由表裏面把它踢出去   固然nginx再起來的時候lvs就會自動把它加入路由表裏面

接下來就是驗證的時候了 在驗證前咱們要先把一些服務器添加到開機自動啓動,

chkconfig --add keepalived

chkconfig keepalived on

  1. lvs上 咱們要保證開機自動啓動keepalived執行命令: echo "/etc/init.d/keepalived restart">>/etc/rc.local 
  2. 在客戶端nginx服務器上保證vip開機自動添加 執行命令:echo "sh /root/realserver.sh start" >> /etc/rc.local
  3. 客戶端nginx服務器保證開機啓動nginx服務執行命令:echo "/usr/local/nginx/sbin/nginx">>/etc/rc.local

 

接下來咱們域名解析在Windows上hosts文件裏 ,訪問網站看到以下效果,說明咱們成功了。

相關文章
相關標籤/搜索