1. 程式人生 > >LVS+Nginx(LVS + Keepalived + Nginx安裝及配置)

LVS+Nginx(LVS + Keepalived + Nginx安裝及配置)

dir address 不負責任 只需要 輸出 val keepalive 大型 守護

(也可以每個nginx都掛在上所有的應用服務器)

nginx大家都在用,估計也很熟悉了,在做負載均衡時很好用,安裝簡單、配置簡單、相關材料也特別多。

lvs是國內的章文嵩博士的大作,比nginx被廣泛接受還要早7年,並且已經被紅帽作為了系統內置軟件,可謂很牛了。lvs相對於nginx來說配置上就要相對復雜一些。

但是,有時候我們會看到大牛們分享的經驗裏面是lvs+nginx作為負載均衡了,一直想不明白這是個什麽道理。

為什麽會出現兩者被同時使用呢?其實,這要從兩者的各自優勢來說了。

nginx用來做http的反向代理,能夠upsteam實現http請求的多種方式的均衡轉發。由於采用的是異步轉發可以做到如果一個服務器請求失敗,立即切換到其他服務器,直到請求成功或者最後一臺服務器失敗為止。這可以最大程度的提高系統的請求成功率。

lvs采用的是同步請求轉發的策略。這裏說一下同步轉發和異步轉發的區別。同步轉發是在lvs服務器接收到請求之後,立即redirect到一個後端服務器,由客戶端直接和後端服務器建立連接。異步轉發是nginx在保持客戶端連接的同時,發起一個相同內容的新請求到後端,等後端返回結果後,由nginx返回給客戶端。

進一步來說:當做為負載均衡服務器的nginx和lvs處理相同的請求時,所有的請求和響應流量都會經過nginx;但是使用lvs時,僅請求流量經過lvs的網絡,響應流量由後端服務器的網絡返回。

也就是,當作為後端的服務器規模龐大時,nginx的網絡帶寬就成了一個巨大的瓶頸。

但是僅僅使用lvs作為負載均衡的話,一旦後端接受到請求的服務器出了問題,那麽這次請求就失敗了。但是如果在lvs的後端在添加一層nginx(多個),每個nginx後端再有幾臺應用服務器,那麽結合兩者的優勢,既能避免單nginx的流量集中瓶頸,又能避免單lvs時一錘子買賣的問題。

參考文章:
章文嵩:LVS項目介紹
moon:強大的nginx反向代理異步傳輸模式(原理)

yaoweibin:nginx健康檢查
追馬博客:LVS+keepalived+nginx+tomcat部署實現

補充(20160731 下午2:07):

在後續繼續了解這部分內容時,發現了這兩個帖子:
1. 有了LVS,還要apache,nginx有什麽用?
2.從一個開發的角度看負載均衡和LVS—–註意看最後一個lvs集群化的圖,nginx和rs是一對一連接的。

從以上文章來看,lvs+nginx組合使用的原因主要是用lvs來做負載均衡(因為工作在4層,效率高),nginx來做靜態文件的處理。

這裏第二篇文章,和lvs的後續維護者之一的[吳佳明_普空的ppt](http://velocity.oreilly.com.cn/2012/ppts/pukong.pdf
)中比章博士的文章中多出了一種轉發模式,也就是full_nat模式,這種模式下,所有的響應也要經過lvs服務器作為出口返回給客戶端。

lvs在full_nat的模式下,是否還是同步的模式呢?我猜想應該是的,因為lvs工作在4層,所以可能當前出錯的響應要映射到之前的那一次請求(因為沒有解析http包),所以也就做不到把錯誤轉發到其他的應用服務器上重新處理。

另外,這個補充是不是就完全的否定了昨天(也就是補充之前的那一大段)的內容呢?我覺得並沒有。昨天的理解可能不是正規大型互聯網在使用的模式(當然,這裏我不能確定,因為我沒有大型互聯網的經驗),但是理論應該是對的。

具體一點,lvs+nginx的組合nginx用來做靜態文件的處理的場景下,如果一次請求失敗了,那麽久不能被重新處理了,當然你的nginx也可以後掛1個以上的應用服務器(這樣的話nginx實質上也是起到了lvs均衡補充的效果)。另外就是,nginx不是單單的作為靜態文件的處理,而是作為lvs的一個補充,互相彌補均衡上的不足。

那麽你可能會說lvs在4層上處理的高效就不復存在了,確實是的,這點要承認,但是,我們提高了系統請求的成功率,兩者需要各自去選擇和權衡。

另外,需要說的一點是,靜態內容其實我們還可以借助cdn去處理,而不是單單的依靠nginx或者apache去處理。

補充(2016年12月17日 上午11:24)

現在到了比較大一些的互聯網公司,也看了京東的用法(可以看開濤的nginx+lua系列http://www.iteye.com/blogs/subjects/nginx-lua)。

lvs+nginx的使用中,nginx還可以作為一個中間環節來減小後端tomcat的服務壓力,以及做一些業務切換、分流、前置緩存的功能。

LVS + Keepalived + Nginx安裝及配置

1、概述

上篇文章《架構設計:負載均衡層設計方案(6)——Nginx + Keepalived構建高可用的負載層》(http://blog.csdn.net/yinwenjie/article/details/47130609) 我們講解了Nginx的故障切換,並且承諾各位讀者會盡快講解 LVS + Keepalived + Nginx的安裝和配置。在中間由於工作的原因,我又插寫了三篇關於zookeeper的原理使用的文章。今天這邊文章我們回歸主題,為各位讀者講解 LVS + Keepalived + Nginx的安裝及配置。

2、安裝計劃和準備工作

下圖,我們表示了本篇文章要搭建的整個集成架構的抽象結構:

技術分享

我們采用兩個LVS節點(141和142),但是一個時間工作的只有一個LVS節點,另一個始終處於熱備standby狀態,由keepalived監控這兩個節點的工作狀態並完成切換。

在LVS節點下,我們采用LVS-DR工作模式掛載了兩個Nginx節點(131、132)。並最終將外網請求交由這兩個節點進行處理。註意:在實際工作中,Nginx下面一般就是訪問靜態資源、動態資源的配置了。

2-1、準備兩個keepalived節點

首先我們在將要安裝LVS的兩個節點上,先安裝keepalived,並保證這兩個keepalived節點能夠正常工作(監控批次的狀態)。當然,您也可以先準備LVS,在準備keepalived。

我想準備keepalived節點,大家應該輕車熟路了吧,在《架構設計:負載均衡層設計方案(6)——Nginx + Keepalived構建高可用的負載層》這篇文章中詳細介紹了keepalived的最簡配置方式。為了大家閱讀方便,我們在這裏再進行依次簡要說明。準備keepalived的整個過程包括:

  1. 安裝必要的支撐組件,源碼安裝keepalived
  2. 將keepalived註冊成節點的服務,以便保證keepalived在節點啟動時就開始工作
  3. 更改keepalived的配置文件,讓其可以正常工作
  4. 驗證準備工作

=============安裝keepalived

[root@lvs1 ~]# yum install -y zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh
[root@lvs1 ~]# tar -zxvf keepalived-1.2.17.tar.gz
[root@lvs1 ~]# cd keepalived-1.2.17
[root@lvs1 ~]# ./configure --perfix=/usr/keepalived-1.2.17
[root@lvs1 ~]# make & make install 

=============將keepalived註冊成服務(如果您使用的默認路徑安裝,就不需要cp命令了)

[root@lvs1 ~]# cp /usr/keepalived-1.2.17/etc/sysconfig/keepalived  /etc/sysconfig/keepalived 
[root@lvs1 ~]# cp /usr/keepalived-1.2.17/sbin/keepalived /usr/sbin/keepalived
[root@lvs1 ~]# cp /usr/keepalived-1.2.17/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/keepalived
[root@lvs1 ~]# mkdir /etc/keepalived
[root@lvs1 ~]# cp /usr/keepalived-1.2.17/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
[root@lvs1 ~]# 可以做成服務了(不要拷貝,沒用的)
[root@lvs1 ~]# chkconfig keepalived on

這裏我們先設置浮動ip

設置VIP的信息

ifconfig eth0:0 192.168.220.140 broadcast 192.168.220.140 netmask 255.255.255.255 up route add -host 192.168.220.140 dev eth0:0     

做成服務後,先不要急著啟動,因為配置文件還沒有改好。
========配置keepalived(配置文件在:/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@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 {
    #141節點設置為MASTER,142或者還有其他的節點設置為BACKUP
    #還記得我們前面文章講到的無搶占設置嗎?這裏也可以用哦。
    state MASTER
    #網絡適配器名稱
    interface eth0
    virtual_router_id 51
    #所有的SLAVE節點的優先級都要比這個設置值低
    priority 120
    advert_int 1
    #真實ip,142要改成相應的lvs節點真實ip
    mcast_src_ip=192.168.220.141
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虛擬/浮動IP
    virtual_ipaddress {
        192.168.220.140
    }
}

以上配置還是最簡單的keepalived配置,因為我們還沒有加上配合LVS使用的虛擬ip監測設置和下層真實ip監測的設置。最簡配置主要是為了保證keepalived節點是工作正常的。

將以上的配置分別對應到LVS的兩個節點(註意要改動的地方哦)

==========進行keepalived工作狀態的檢查:

[root@lvs1 ~]# /etc/init.d/keepalived start

現在設置為MASTER的keepalived節點(或者在非搶占模式下,優先級最高的那個節點),已經綁定了140這個虛擬ip了:

[root@lvs2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:39:75:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.220.141/24 brd 192.168.220.255 scope global eth0
    inet 192.168.220.140/32 scope global eth0
    inet6 fe80::20c:29ff:fe39:759f/64 scope link 
       valid_lft forever preferred_lft forever

當然您也可以通過 /var/log/message的日誌進行keepalived是否正常工作的驗證。

2-2、繼續兩個keepalived節點上準備LVS

準備lvs的工作就太簡單了,因為centos6.4、6.5、6.6都已經集成了LVS的核心,我們只需要安裝LVS的管理工具就行了:

(1)如果要源碼安裝的話:

這裏源碼安裝ipvsadm(http://www.linuxidc.com/Linux/2016-03/129232.htm)
yum install kernel-devel -y
yum -y install popt popt-devel libnl libnl-devel popt-static(我嘗試過要是不安裝的話就會報錯)
ln -s /usr/src/kernels/2.6.32-642.4.2.el6.x86_64/ /usr/src/linux
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar xf ipvsadm-1.25.tar.gz
cd ipvsadm-1.25
make && make install
然後我們檢測一下
ipvsadm 是否有內容輸出
(2)如果yum安裝的話

兩個LVS節點都執行:

yum -y install ipvsadm

還記得lvs管理工具怎麽使用嗎?請參見我介紹LVS單節點安裝的博文:《架構設計:負載均衡層設計方案(5)——LVS單節點安裝》。這裏為了方便閱讀,給出主要參數的含義列表:

-A –add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增加一臺新的虛擬服務器。
-E –edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。
-D –delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。
-C –clear 清除內核虛擬服務器表中的所有記錄。
-R –restore 恢復虛擬服務器規則
-S –save 保存虛擬服務器規則,輸出為-R 選項可讀的格式
-a –add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增加一臺新的真實服務器
-e –edit-server 編輯一條虛擬服務器記錄中的某條真實服務器記錄
-d –delete-server 刪除一條虛擬服務器記錄中的某條真實服務器記錄
-L –list 顯示內核虛擬服務器表
-Z –zero 虛擬服務表計數器清零(清空當前的連接數量等)
–set tcp tcpfin udp 設置連接超時值
–start-daemon 啟動同步守護進程。他後面可以是master 或backup,用來說明LVS Router 是master 或是backup。在這個功能上也可以采用keepalived 的VRRP 功能。
–stop-daemon 停止同步守護進程
-t –tcp-service service-address 說明虛擬服務器提供的是tcp 的服務[vip:port] or [real-server-ip:port]
-u –udp-service service-address 說明虛擬服務器提供的是udp 的服務[vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 說明是經過iptables 標記過的服務類型。
-s –scheduler scheduler 使用的調度算法,選項:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, 默認的調度算法是: wlc.
-p –persistent [timeout] 持久穩固的服務。這個選項的意思是來自同一個客戶的多次請求,將被同一臺真實的服務器處理。timeout 的默認值為300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真實的服務器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式為直接路由模式DR模式(也是LVS默認的模式)
-i –ipip 指定LVS 的工作模式為隧道模式
-m –masquerading 指定LVS 的工作模式為NAT 模式
-w –weight weight 真實服務器的權值
–mcast-interface interface 指定組播的同步接口
–connection 顯示LVS 目前的連接 如:ipvsadm -L -c
–timeout 顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 顯示同步守護進程狀態
–stats 顯示統計信息
–rate 顯示速率信息
–sort 對虛擬服務器和真實服務器排序輸出
–numeric -n 輸出IP 地址和端口的數字形式

到後面正式啟動LVS的時候,就不要問我參數含義咯。^_^

2-3、準備兩個Nginx節點並保證可用

在《架構設計:負載均衡層設計方案(5)——LVS單節點安裝》(http://blog.csdn.net/yinwenjie/article/details/47010569) 這篇文章中,我們詳細講解了Nginx節點的準備工作,但是為了方便各位讀者閱讀,這裏我們大致再講一下。

Nginx節點的準備工作主要由以下步驟構成(這個不是本文的重點,點到即可):

  1. 安裝Nginx(當然,正式系統中,還涉及到Nginx的參數調優,可以參見《架構設計:負載均衡層設計方案(2)——Nginx安裝》這篇文章)
  2. 打開Nginx所在服務器的“路由”功能、關閉“ARP查詢”功能
  3. 將VIP:192.168.220.140 設置成Nginx所在節點的回環IP

=============安裝Nginx

[root@vm1 ~]# yum -y install make zlib zlib-devel gcc gcc-c++ ssh libtool pcre*
[root@vm1 ~]# 下載nginx(別拷貝,不能執行的)
[root@vm1 ~]# 解壓nginx(別拷貝,不能執行的)
[root@vm1 ~]# ./configure –prefix=/usr/nginx-1.8.0 
[root@vm1 ~]# make && make install 
[root@vm1 ~]# 設置環境變量(別拷貝,不能執行的)
[root@vm1 ~]# 啟動nginx

=============打開Nginx所在服務器的“路由”功能、關閉“ARP查詢”功能

[root@vm1 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@vm1 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@vm1 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@vm1 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

=============設置回環IP

[root@vm1 ~]# ifconfig lo:0 192.168.220.140 broadcast 192.168.220.140 netmask 255.255.255.255 up
[root@vm1 ~]# route add -host 192.168.220.140 dev lo:0

兩臺Nginx的節點都按照這樣的方法去設置。然後使用瀏覽器,看看這兩個節點的Nginx是否工作正常:

我這裏在做實驗的時候忘了把防火墻和selinux關了,所以瀏覽器訪問不了。不要忘了關哦

我們可以把nginx的首頁改一下以便分辨區別

技術分享

=====

技術分享

2-4、其他說明

keepalived和LVS是天生配合完美的一對,LVS負責進行請求轉發不負責任何節點的健康監測;keepalived負責監控整個環境中,包括虛擬ip,真實ip對應的下層節點的健康狀態監測

3、開始配置:LVS-DR工作模式

3-1、keepalived的更改——健康監測

首先我們要更改之前配置的“最簡keepalived”配置,讓keepalived能夠對結構中所有節點和虛擬ip的健康狀態進行監測。更改配置和含義如下:

! Configuration File for keepalived

global_defs {
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@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 {
    #141節點設置為MASTER,142或者還有其他的節點設置為BACKUP
    #還記得我們前面文章講到的無搶占設置嗎?這裏也可以用哦。
    state MASTER
    #網絡適配器名稱
    interface eth0
    virtual_router_id 51
    #所有的SLAVE節點的優先級都要比這個設置值低
    priority 120
    advert_int 1
    #真實ip,142要改成相應的lvs節點真實ip
    mcast_src_ip=192.168.220.141
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虛擬/浮動IP
    virtual_ipaddress {
        192.168.220.140
    }
}

virtual_server 192.168.220.140 80 {
    #健康時間檢查,單位秒
    delay_loop 6
    #負載均衡調度算法wlc|rr,和您將使用的LVS的調度算法保持原則一致
    lb_algo rr
    #負載均衡轉發規則 DR NAT TUN。和您將啟動的LVS的工作模式設置一致
    lb_kind DR
    #虛擬地址的子網掩碼
    nat_mask 255.255.255.0
    #會話保持時間,因為我們經常使用的是無狀態的集群架構,所以這個設置可有可無
    #persistence_timeout 50
    #轉發協議,當然是TCP
    protocol TCP

    #真實的下層Nginx節點的健康監測
    real_server 192.168.220.131 80 {
        #節點權重,
        weight 10
        #設置檢查方式,可以設置HTTP_GET | SSL_GET
        HTTP_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            #超時時間,秒。如果在這個時間內沒有返回,則說明一次監測失敗
            connect_timeout 3
            #設置多少次監測失敗,就認為這個真實節點死掉了
            nb_get_retry 3
            #重試間隔
            delay_before_retry 3
        }
    }

    real_server 192.168.220.132 80 {
        weight 10
        HTTP_GET {
            url {
              path /
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

這樣一來,keepalived就可以檢查整個架構中的所有節點狀態了。另外要說明的是,這個檢查過程並不是必須的,您使用keepalived的最簡配置也是可以的,不過您就需要自己寫監測腳本了(道理是一樣的)

3-2、啟動兩個LVS節點

啟動LVS的過程就太簡單了(兩個節點都是一樣的啟動方式):

[root@lvs2 ~]# ipvsadm -C
[root@lvs2 ~]# ipvsadm -At 192.168.220.140:80 -s rr 
[root@lvs2 ~]# ipvsadm -at 192.168.220.140:80 -r 192.168.220.131 -g
[root@lvs2 ~]# ipvsadm -at 192.168.220.140:80 -r 192.168.220.132 -g
[root@lvs2 ~]# 然後我們可以使用ipvsadm 監控目前LVS的狀態
[root@lvs2 ~]# ipvsadm

註意:處於standby的lvs1節點也要這樣進行設置。
還有,以上的LVS的設置,和real server上的設置,在重啟後都會消失,所以一定要做成腳本哦。

4、驗證工作

這樣LVS + Keepalived + Nginx方式的配置就做完了。現在我們進行搭建效果的監測:

4-1、驗證Master-LVS節點的工作

我們使用兩個不同的瀏覽器,驗證Master-LVS節點的工作:

=========瀏覽器1:
技術分享

=========瀏覽器2:
技術分享

看來140這個VIP下的LVS工作是正常的。

4-2、驗證Master-LVS節點停止後的效果

下面我們停止Master-LVS1:

[root@lvs2 ~]# service keepalived stop

在經歷了一些訪問停頓後,瀏覽器1顯示的效果如下(這就是為什麽keepalived最好設置為非搶占模式):

技術分享

5、後文介紹

好了,到這裏負載均衡層所使用的幾個標準工具就介紹完了。下一篇文章我們將進行總結,然後進入架構設計:業務層設計方案 的系列文章。在下一個系列文章中,我們將介紹至少兩套SOA的實現、至少兩套系統間通信使用的消息隊列。哦,應我朋友的要求,我會專門寫幾篇文章,介紹Java中線程的基礎知識和進階知識。

文章轉自:http://blog.csdn.net/yinwenjie/article/details/47211551

LVS+Nginx(LVS + Keepalived + Nginx安裝及配置)