LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集
目前主流的负载均衡服务有以下三种:LVS、Haproxy、Nginx
LVS基于4层网络层效率较高
Haproxy基于7层应用层,都适用于高并发网站,对机器要求高
特点
- 可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)
- 在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术
工作原理
- 用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。-
对于用户来说,看不到WEB后端具体的应用 - LVS转发方式有三种,分别是NAT、DR、TUN模式,常用算法:RR(round-robin)、LC(least_connection)、W(weight)RR、WLC模式等(RR为轮询模式,LC为最少连接模式,WRR为权重模式)
NAT修改数据包的IP,DR修改MAC,TUN也是修改MAC但多列一层隧道加密 - LVS NAT原理:用户请求LVS到达director,director将请求的报文的目标地址改成后端的realserver地址,同时将报文的目标端口也改成后端选定的realserver相应端口,最后将报文发送到realserver,realserver将数据返给director,director再把数据发送给用户。(两次请求都经过director,所以访问大的话,director会成为瓶颈),realserver上需要配置网关,网关地址就是LVS的VIP
- LVS DR原理:用户请求LVS到达director,director将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver检测到目标为自己本地IP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户。(此种转发效率最高),realserver和LVS上配置相同的VIP地址,但是realserver上会限制ARP响应,防止realserver直接向用户提供服务,而是只接收LVS转发的请求提供服务.
- LVS TUN原理:跟LVS DR类似,也是改变封装MAC地址,多了一层隧道加密。实施环境复杂,比LVS DR模式效率略低。
服务安装
LVS技术是基于ip_vs内核模块(ip虚拟技术),需要先安装软件包ipvsadm-1.2.4.tar.gz,注意软件版本和内核版本的对应关系,内核2.6对应ipvs1.24版本
#查看系统内核版本是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... 已连接。
已发出 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版本信息及转发表的大小
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
ipvs服务配置通过命令直接配置
- A 增加一台虚拟服务器地址
- t 虚拟服务器提供的是tcp服务
- s 使用的调度算法
- a 在虚拟服务器中增加一台后端真实服务器
- r 指定真实服务器地址
-m 设置当前转发方式为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
#查看参数打印列表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本地回还地址上不会和其他网卡冲突
[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
#添加网关地址
[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 #添加网关地址
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
#授予执行权限并启动脚本
[root@localhost ~]# chmod 0+x auto_realserver.sh
[root@localhost ~]# sh auto_realserver.sh start
RealServer Start OK
LVS服务器故障排查思路
- 1、ping网站的域名www.jfedu.net,能解析到IP,证明域名服务器没问题,nslookup、ping、dig
- 2、登录LVS服务器,查看ipvsadm -Ln信息以及日志信息tail -fn 100 /var/log/messages,看客户端realserver的80端口是否启动
- 3、看zabbix监控服务器,有无异常报警
- 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#### 全局配置定义发送接受的邮箱及路由信息等保持不变
! 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 #优先级
advert_int 5 #发送广播时间间隔
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转发方式为直接路由DR还可以是NAT/TUN
persistence_timeout 60 #60秒内会话保持在后端同一台服务器
protocol TCP #v转发协议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接到数据包后修改完目的MAC地址后能把数据包直接转发到后端服务器
- 虚拟VIP绑定到本地回环地址lo上是为了防止虚拟的VIP在交换机端口上产生MAC地址表,而且lo上可绑定多个虚拟VIP
[root@localhost ~]# VIP=XXXX.XXXX.XXXX.XXXX
[root@localhost ~]# ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP