下面一張圖 其實就是企業的集羣架構圖 結合前面的技術加上今天的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所需軟件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相應穩定版本:
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
接下來咱們域名解析在Windows上hosts文件裏 ,訪問網站看到以下效果,說明咱們成功了。