LVS是Linux Virtual Server的簡寫社露,意即Linux虛擬服務器挟阻,是一個虛擬的服務器集
目前主流的負載均衡服務有以下三種:LVS、Haproxy峭弟、Nginx
LVS基于4層網(wǎng)絡層效率較高
Haproxy基于7層應用層附鸽,都適用于高并發(fā)網(wǎng)站,對機器要求高
特點
- 可伸縮網(wǎng)絡服務的幾種結構,它們都需要一個前端的負載調度器(或者多個進行主從備份)瞒瘸。我們先分析實現(xiàn)虛擬網(wǎng)絡服務的主要技術坷备,指出IP負載均衡技術是在負載調度器的實現(xiàn)技術中效率最高的。在已有的IP負載均衡技術中情臭,主要有通過網(wǎng)絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的省撑、高可用的虛擬服務器,我們稱之為VS/NAT技術(Virtual Server via Network Address Translation)
- 在分析VS/NAT的缺點和網(wǎng)絡服務的非對稱性的基礎上俯在,我們提出了通過IP隧道實現(xiàn)虛擬服務器的方法VS/TUN (Virtual Server via IP Tunneling)竟秫,和通過直接路由實現(xiàn)虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統(tǒng)的伸縮性VS/NAT朝巫、VS/TUN和VS/DR技術是LVS集群中實現(xiàn)的三種IP負載均衡技術
工作原理
- 用戶請求LVS VIP鸿摇,LVS根據(jù)轉發(fā)方式和算法,將請求轉發(fā)給后端服務器劈猿,后端服務器接受到請求,返回給用戶潮孽。-
對于用戶來說揪荣,看不到WEB后端具體的應用 - LVS轉發(fā)方式有三種,分別是NAT往史、DR仗颈、TUN模式,常用算法:RR(round-robin)椎例、LC(least_connection)挨决、W(weight)RR、WLC模式等(RR為輪詢模式订歪,LC為最少連接模式脖祈,WRR為權重模式)
NAT修改數(shù)據(jù)包的IP,DR修改MAC刷晋,TUN也是修改MAC但多列一層隧道加密 - LVS NAT原理:用戶請求LVS到達director,director將請求的報文的目標地址改成后端的realserver地址盖高,同時將報文的目標端口也改成后端選定的realserver相應端口慎陵,最后將報文發(fā)送到realserver,realserver將數(shù)據(jù)返給director喻奥,director再把數(shù)據(jù)發(fā)送給用戶席纽。(兩次請求都經(jīng)過director,所以訪問大的話撞蚕,director會成為瓶頸),realserver上需要配置網(wǎng)關,網(wǎng)關地址就是LVS的VIP
- LVS DR原理:用戶請求LVS到達director,director將請求的報文的目標MAC地址改成后端的realserver MAC地址润梯,目標IP為VIP(不變),源IP為用戶IP地址(保持不變)甥厦,然后Director將報文發(fā)送到realserver纺铭,realserver檢測到目標為自己本地IP,如果在同一個網(wǎng)段矫渔,然后將請求直接返給用戶彤蔽。如果用戶跟realserver不在一個網(wǎng)段,則通過網(wǎng)關返回用戶庙洼。(此種轉發(fā)效率最高),realserver和LVS上配置相同的VIP地址,但是realserver上會限制ARP響應,防止realserver直接向用戶提供服務,而是只接收LVS轉發(fā)的請求提供服務.
- LVS TUN原理:跟LVS DR類似顿痪,也是改變封裝MAC地址,多了一層隧道加密油够。實施環(huán)境復雜蚁袭,比LVS DR模式效率略低。
服務安裝
LVS技術是基于ip_vs內核模塊(ip虛擬技術),需要先安裝軟件包ipvsadm-1.2.4.tar.gz,注意軟件版本和內核版本的對應關系,內核2.6對應ipvs1.24版本
#查看系統(tǒng)內核版本是2.6.32
[root@localhost src]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
#下載ipvsadm-1.2.4
[root@localhost src]# wget -c http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
--2018-01-07 14:10:33-- http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
正在解析主機 www.linuxvirtualserver.org... 173.255.202.51, 2600:3c00::f03c:91ff:fe96:fcc2
正在連接 www.linuxvirtualserver.org|173.255.202.51|:80... 已連接石咬。
已發(fā)出 HTTP 請求揩悄,正在等待回應... 200 OK
長度:36598 (36K) [application/x-gzip]
正在保存至: “ipvsadm-1.24.tar.gz”
100%[=======================================================================>] 36,598 23.4K/s in 1.5s
2018-01-07 14:10:36 (23.4 KB/s) - 已保存 “ipvsadm-1.24.tar.gz” [36598/36598])
#解壓源碼包后切換到解壓目錄
[root@localhost src]# tar zxvf ipvsadm-1.24.tar.gz
[root@localhost src]# cd ipvsadm-1.24
[root@localhost ipvsadm-1.24]# ls
config_stream.c debian ipvsadm.8 ipvsadm-restore.8 ipvsadm.sh libipvs SCHEDULERS
config_stream.h dynamic_array.c ipvsadm.c ipvsadm-save ipvsadm.spec Makefile TAGS
contrib dynamic_array.h ipvsadm-restore ipvsadm-save.8 ipvsadm.spec.in README VERSION
ipvsadmin軟件包需要先做好軟鏈接編譯進內核然后直接進入解壓目錄安裝
#做軟鏈接
[root@localhost src]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux
[root@localhost src]# ll
總用量 10052
drwxr-xr-x. 2 root root 4096 9月 23 2011 debug
drwxr-xr-x 5 root root 4096 1月 7 14:15 ipvsadm-1.24
-rw-r--r-- 1 root root 36598 12月 11 2005 ipvsadm-1.24.tar.gz
drwxr-xr-x. 3 root root 4096 12月 16 20:10 kernels
lrwxrwxrwx 1 root root 39 1月 7 14:18 linux -> /usr/src/kernels/2.6.32-431.el6.x86_64/
#進入ipvsadmin解壓目錄后安裝
[root@localhost src]# cd ipvsadm-1.24
[root@localhost ipvsadm-1.24]# make
[root@localhost ipvsadm-1.24]# make install
查看安裝是否成功ipvasdm
[root@localhost ipvsadm-1.24]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096) #顯示ipvs版本信息及轉發(fā)表的大小
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
ipvs服務配置通過命令直接配置
- A 增加一臺虛擬服務器地址
- t 虛擬服務器提供的是tcp服務
- s 使用的調度算法
- a 在虛擬服務器中增加一臺后端真實服務器
- r 指定真實服務器地址
-m 設置當前轉發(fā)方式為NAT模式;-g為直接路由模式鬼悠;-i 為隧道模式 - w 后端真實服務器的權重
配置的步驟有兩步删性,第一步為定義端口服務,第二步為添加realserver后端服務
#添加虛擬的VIP192.168.15.202,端口80,調度算法rr輪詢
[root@localhost ~]# ipvsadm -A -t 192.168.15.202:80 -s rr
#添加后端服務器realserver192.168.15.172,直接路由模式,權重2
[root@localhost ~]# ipvsadm -a -t 192.168.15.202:80 -r 192.168.15.172 -g -w 2
#查看參數(shù)打印列表Ln
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.15.202:80 rr
-> 192.168.15.172:80 Local 2 0 0
-> 192.168.15.173:80 Local 2 0 0
#使用文件定向符保存ipvs配置
[root@localhost ~]# ipvsadm-save >/tmp/ipvs.txt
#加載恢復ipvs配置
[root@localhost ~]# ipvsadm-restore </tmp/ipvs.txt
在realserver后端真實服務器上配置VIP
#將VIP綁定到loopback本地回還地址上不會和其他網(wǎng)卡沖突
[root@localhost ~]# VIP=192.168.15.202
[root@localhost ~]# ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
[root@localhost ~]# ifconfig
lo:0 Link encap:Local Loopback
inet addr:192.168.15.202 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
#添加網(wǎng)關地址
[root@localhost ~]# /sbin/route add -host $VIP dev lo:0
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.15.202 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.15.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 192.168.15.1 0.0.0.0 UG 0 0 0 eth0
realserver不僅僅要綁定VIP焕窝,還要通過以下腳本抑止自己的arp響應
[root@localhost ~]# vim auto_realserver.sh
#!/bin/sh
#LVS Client Server
VIP=192.168.15.202 #定義VIP
case $1 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP #lo:0綁定vip
/sbin/route add -host $VIP dev lo:0 #添加網(wǎng)關地址
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore #下面4句就是抑止arp響應的語句
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 #恢復arp響應
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
#授予執(zhí)行權限并啟動腳本
[root@localhost ~]# chmod 0+x auto_realserver.sh
[root@localhost ~]# sh auto_realserver.sh start
RealServer Start OK
LVS服務器故障排查思路
- 1蹬挺、ping網(wǎng)站的域名www.jfedu.net,能解析到IP,證明域名服務器沒問題,nslookup、ping它掂、dig
- 2巴帮、登錄LVS服務器,查看ipvsadm -Ln信息以及日志信息tail -fn 100 /var/log/messages,看客戶端realserver的80端口是否啟動
- 3、看zabbix監(jiān)控服務器,有無異常報警
- 4虐秋、看keepalived.conf配置文件是否錯誤,進程
- 5榕茧、看客戶端的auto_realserver.sh腳本VIP是否啟動
- 6、使用tcpdump -nn port80 and host XXXXip抓包
LVS和keepalived綜合運用
所有操作都直接定義在keepalived的配置文件中即可
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
#######global conf#### 全局配置定義發(fā)送接受的郵箱及路由信息等保持不變
! Configuration File for keepalived
global_defs {
notification_email {
wgkgood@139.com
}
notification_email_from wgkgood@139.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
######## VIP1 VRRP CONF 第一個VRRP實例作為LVS的MASTER該部分也不變化
vrrp_instance VI_1 {
state MASTER
interface eth0 #通信端口
lvs_sync_daemon_inteface eth0 #lvs通信端口類似心跳線功能
virtual_router_id 151 #路由ID
priority 100 #優(yōu)先級
advert_int 5 #發(fā)送廣播時間間隔
nopreempt #設置為不搶占
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.15.201 #定義LVS的虛擬VIP
}
}
############虛擬服務器配置部分增加LVS配置代碼
virtual_server 192.168.15.201 80{
delay_loop 6 #健康檢查時間間隔
lb_algo wrr #LVS算法權重輪詢模式
lb_kind DR #LVS轉發(fā)方式為直接路由DR還可以是NAT/TUN
persistence_timeout 60 #60秒內會話保持在后端同一臺服務器
protocol TCP #v轉發(fā)協(xié)議tcp
real_server 192.168.15.172 80 { #這里的realserver是后端的服務器1
weight 100
notify_down /data/sh/mysql.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.15.173 80 { #這里的realserver是后端的服務器2
weight 100
notify_down /data/sh/mysql.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
- LVS及后端的realserver上都配置VIP,而realserver上配置腳本抑止arp響應是為了當路由器廣播時只有LVS主機響應,而LVS接到數(shù)據(jù)包后修改完目的MAC地址后能把數(shù)據(jù)包直接轉發(fā)到后端服務器
- 虛擬VIP綁定到本地回環(huán)地址lo上是為了防止虛擬的VIP在交換機端口上產(chǎn)生MAC地址表,而且lo上可綁定多個虛擬VIP
[root@localhost ~]# VIP=XXXX.XXXX.XXXX.XXXX
[root@localhost ~]# ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP