LVS介紹
LVS是Linux Virtual Server的簡寫,即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體項目之一。軟體名叫ipvsadm,後面有介紹安裝方式。
Keepalived介紹
Keepalived是用C語言編寫的路由軟體。該項目的主要目標是為Linux系統和基於Linux的基礎架構提供負載均衡和高可用性功能。負載均衡的實現依賴於Linux虛擬伺服器(IPVS)內核模塊提供的網絡協議第4層負載均衡。Keepalived實現了一系列的檢查,根據伺服器運行健康狀態,動態地維持伺服器之間的負載均衡。另一方面,keepalived通過VRRP協議實現高可用性。為了提供最快的網絡故障檢測,Keepalived採用BFD協議。VRRP狀態轉換可以通過BFD提示來驅動快速狀態轉換。
Keepalived環境搭建
https://www.keepalived.org/
wget https://www.keepalived.org/software/keepalived-2.1.4.tar.gz
tar -zxvf keepalived-2.1.4.tar.gz
yum install -y gcc openssl-devel libnl3-devel net-snmp-devel
./configure --prefix=/usr/local/keepalived
make && make install
安裝之後的路徑就在/usr/local
進入/usr/local/keepalived後執行./sbin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf
備註:通過-f參數指定配置文件不能使用相對路徑,要使用絕對路徑。另外也可以將keepalived.conf文件拷貝到/etc/keepalived路徑下,執行運行程序時就不用加上-f指定配置文件路徑(程序默認讀取配置文件路徑就是/etc/keepalived)。
keepalived運行日誌文件默認是/var/log/messages,啟動程序之後通過查看該日誌文件來確認是否啟動正常或查看錯誤信息。
基於keepalived可能需要開啟虛擬IP,日誌文件與系統日誌共用/var/log/messages,以及記錄進程號文件路徑等都是root用戶權限級別,所以keepalived只能以root用戶進行安裝和啟動。
方案一——Nginx+keepalived
Nginx+Tomcat+keepalived(MASTER)
IP位址:21.96.149.128
Nginx+Tomcat+keepalived(BACKUP)
IP位址:21.96.149.129
worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
gzip on; gzip_min_length 90; gzip_types *; gzip_comp_level 9;
upstream backend { server 192.168.149.128:8089 weight=5; server 192.168.149.129:8089 weight=5; }
server { listen 8080; server_name localhost;
location / { proxy_pass http://backend; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}1、修改server.xml中監聽埠為8089。
<Connector port="8089" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2、在webapps目錄下創建一個web項目。
這裡創建myweb項目,並在myweb目錄下新建一個index.html文件,為了在前端展示實際連接的是哪臺web伺服器分別在128伺服器的index.html加上128,129伺服器的index.html加上129。
配置文件在keepalived安裝目錄下的etc/keepalived目錄下,也就是啟動時指定的配置文件。
1、新增Nginx服務健康檢查及守護腳本
創建一個/etc/keepalived/nginx_check.sh腳本文件,內容如下:
#! /bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/home/appuser/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi需要對該腳本增加執行權限。
2、修改keepalived配置
修改vrrp_garp_interval、vrrp_gna_interval參數值為非0,這裡設置成1,單位是秒。
新增vrrp_script模塊,指定Nginx服務檢查腳本路徑及間隔時間。
state MASTER:表示本keepalived服務是主機,128機器配置成MASTER、129機器配置成BACKUP。
interface ens33:表示指定ens33網卡,根據自己電腦網卡進行修改。執行ip addr命令查看網卡信息。
Priority:設置keepalived的優先級別,數字越高級別越高,所以備機要比主機配置的級別低。
增加track_script模塊,指定vrrp_script模塊定義的腳本名稱。
virtual_ipaddress:指定我們前面規劃的虛擬IP,可以指定多個IP,也可以指定一個網段的地址。
3、啟動keepalived及驗證
啟動之後,如果/var/log/messages日誌文件沒有報錯,則系統會多出一個虛擬IP出來,通過ip addr命令查看。
然後就可以通過這個虛擬IP訪問我們的Nginx了。
我們如果把128機器(主機)的nginx關閉,nginx會被自動拉起來。
如果關閉128機器的keepalived,虛擬IP會被129機器註冊,這個時候如果有請求來,會轉發到129機器的nginx服務上。如果再把128機器的keepalived服務起起來,虛擬IP又會被128機器搶回去,客戶端請求又會轉發至128機器的nginx服務上去。
如果主機配置的priority級別比備機的級別低,那備機會成為主機並註冊虛擬IP。
如果不希望從故障恢復的主機立刻搶回MASTER提供服務,可以通過「nopreempt」參數設置為非搶佔模式。非搶佔模式下,即使高優先級別的服務從故障中恢復,原來佔有虛擬IP的服務仍然能保持虛擬IP並對外提供服務。
方案二——LVS+Nginx
1、LVS安裝
執行下面命令進行安裝:
yum install ipvsadm
執行完成之後檢查
敲ipvsadm命令看是否有IP Virtual Server相關的版本信息,有的話說明安裝成功了。
2、負載機配置(192.168.149.131)
ifconfig ens33:1 192.168.149.200 netmask 255.255.255.255 broadcast 192.168.149.200 #在ens33網卡上增加別名網卡ens33:1,別名網卡的地址是192.168.149.200route add -host 192.168.149.200 dev ens33:1ipvsadm -A -t 192.168.149.200:80 -s rr # A-增加,t-tcp,s-調度算法ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.128:80 -g #r-真實伺服器,g-DR模式ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.129:80 -g配置之後,會多出一個虛擬IP和lvs相關的轉發映射。
通過ip a查看虛擬IP
通過ipvsadm –Ln命令查看lvs的轉發映射
創建腳本文件,配置如下內容:
#! /bin/bashSNS_VIP=192.168.149.200/etc/rc.d/init.d/functionscase "$1" instart) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP /sbin/route add -host $SNS_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 "lvs Start OK" ;;stop) ifconfig lo:0 down route del $SNS_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 "lvs Stoped" ;;*) echo "Usage: $0 {start|stop}" exit 1esacexit 0啟動該腳本,啟動之後會多出一個虛擬IP的迴環地址:
arp_ignore參數解釋
本參數表示收到arp請求後的響應處理級別:
0表示arp請求的目標地址是本機中任意地址都響應(包括迴環地址)。
1表示arp請求的目標地址必須是接收網卡的地址才響應,也就是說ens33網卡接受到目標地址是本機lo網卡地址不會響應。
2表示arp請求的目標地址必須是接收網卡的地址且發送請求的IP要在本網卡地址的同一網段。
3表示arp請求的目標地址是本網卡IP且作用域是Global或者link地址才響應,作用域是本機則不響應。
4-7保留。
8全部不響應。
默認是0級別,如果all、具體網卡都配置了,則以其中值最大的為準。
arp_announce參數解釋
本參數表示發送arp請求時聲明本地原地址的級別:
0表示聲明本機所有網卡的所有地址。
1表示避免不是目標地址同網段的本地原地址,如果找不到這樣的原地址則按照級別2聲明原地址。
2表示忽略原地址,選擇直接與目標地址進行交互的網卡地址作為原地址,如果沒有這樣的地址則選擇第一個本地能出去的地址或者其他網卡的第一個地址。
默認是0級別,如果all、具體網卡都配置了,則以其中值最大的為準。
請參考之前的Nginx入門一文。
1、如果要去掉虛擬IP的配置,則在後面加上down,如下:
ifconfig ens33:1 192.168.149.200 netmask 255.255.255.255 broadcast 192.168.149.200 down2、如果要修改應用伺服器的分配權重,則ipvsadm相關配置如下:
ipvsadm -A -t 192.168.149.200:80 -s wrr ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.128:80 -g -w 1ipvsadm -a -t 192.168.149.200:80 -r 192.168.149.129:80 -g -w 2說明:-w 表示權重,後面跟權重值。3、ipvsadm的常用命令:
ipvsadm -D -t 192.168.149.200:80 --刪除IPVS的配置ipvsadm -C --清除配置信息ipvsadm -Ln --stats --查看轉發情況ipvsadm -Ln --timeout --查看連接維持的時間ipvsadm --set tcp tcpfin udp --設置tcp、tcp結束、udp連接維持的時間(維持的連接會導致請求重複發給一個後臺伺服器處理)
4、ipvsadm命令用法及說明
ipvsadm 的用法和格式如下:ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]ipvsadm -D -t|u|f virtual-service-addressipvsadm -Cipvsadm -Ripvsadm -S [-n]ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]ipvsadm -d -t|u|f service-address -r server-addressipvsadm -L|l [options]ipvsadm -Z [-t|u|f service-address]ipvsadm --set tcp tcpfin udpipvsadm --start-daemon state [--mcast-interface interface]ipvsadm --stop-daemonipvsadm -h命令選項解釋:
有兩種命令選項格式,長的和短的,具有相同的意思。在實際使用時,兩種都可
以。
-A -E -D -C -R -S -a -e -d -L|-l -Z -h
其他的選項:-t -u -f -s rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是:wlc.-p -M -r -g -i -m -w -c方案三——LVS+keepalived+Nginx
安裝ipvsadm與keepalived,步驟跟前面一樣。
1、192.168.149.131機器配置
! Configuration File for keepalivedglobal_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_skip_check_adv_addr}
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.149.200 }}
virtual_server 192.168.149.200 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP
real_server 192.168.149.128 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.149.129 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }}2、192.168.149.132機器配置
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_skip_check_adv_addr}
vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.149.200 }}
virtual_server 192.168.149.200 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP
real_server 192.168.149.128 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.149.129 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }}跟方案二中應用伺服器安裝的配置一致。
總結
方案一採用keepalived的路由模式,可以通過虛擬IP位址漂移來達到高可用模式,但是不具備負載功能。
方案二通過lvs的負載功能可以實現nginx的負載,但是不具備對nginx是否存活進行檢測的能力,在某臺nginx服務掛掉之後還是會分發請求給該故障服務,所以高可用性還不夠。
方案三通過keepalived+lvs+nginx組合達到負載且高可用的目的,keepalived本身具備地址漂移來避免單點故障,同時又可以調用lvs來實現負載分發給nginx服務,且keepalived能自動對nginx埠進行檢測,當nginx不可用時會移除,nginx恢復後又能自動加進來進行服務。
精選推薦:
*本文為IT技術棧原創文章,獨家版權歸於本平臺,受到原創保護。任何渠道的轉載請後臺留言聯繫授權,侵權必究。