LVS
Linux Virtual Server —- Linux 虚拟服务器
作用:当有应用服务需要提供到外网进行访问时,当并发遇到瓶颈时可以用LVS此技术。
优势:灵活的调度,把提供统一服务的所有服务器集中在一起行成一个集成对外提供服务实现对服务器的负载均衡。
缺点:无法进行应用层的调度
Linux Cluster – 讲LVS前我们先说下Cluster
- LB :Load Balancing 负载均衡
- HA :High Availiablity 高可用
- MTBF:Mean Time Between Faiilure 平均无故障时间
- MTTR : Mean Time To Restoration ( repair ) 平均恢复前时间
- A=MTBF/( MTBF+MTTR)
- 99% , 99.9% , 99.99% , 99.999% , 99.9999%
- HPC:High-performance computing 高性能
LB Cluster:
硬件
- F5 Big-IP
- Citrix Netscaler
- A10 A10
软件
-Lvs : 本次讲的
-nginx: 比较流行,支持七层的调度
-haproxy:比较流行,支持七层的调度
... 等等
LVS
负载调度器,集成到Linux内核。
LVS中的术语:
- VS: Load balancing 负责调度的服务器
RS: Real Server 提供给用户访问的服务器
CIP: 客户IP Client IP
VIP:Virtual server IP 也就是VS的外网IP
DIP:Director IP VS内网的IP
RIP:Real Server IP 提供服务的服务器IP
访问流程:CIP <–> VIP <==>DIP <–>RIP
LVS集群可配置多种类型
- lvs-nat : 通过修改请求报文的目标地址为根据调度算法所挑选出的某RS的RIP来进行转发
- lvs-dr :每台RS都配置两个IP一个VIP地址一个RIP,请求报文通过MAC进行转发,回应报文通过RIP出去
- lvs-tun :
- lvs-fullnat :
调度算法
- 静态方法:
- RR — 轮询
- WRR – 权重轮询 如性能比较好的让它多负担点访问请求
- SH — 源IP地址相同的请求统一分配至第一次分配的RS
- DH —目票地址相同的请求统一分配至第一次分配的RS
- 动态方法 – 根据每个RS当前的负载状态及调度算法进行调度 Overhead值小的RS将被调度
- LC– least connections 最少连接算法 Overhead=activeconns*256+inactiveconns
- WLC – weighted LC 权重最少连接算法 Ovehead=(activeconns*256+inactiveconns)/weight (这算法是默认的)
- SED –初始连接高权重优先算法 Ovehead=(activeconns+1)*256/weight
- NQ – 第一次均匀分配,后续SED
- LBLC –动态的DH算法
- LBLCR – 带复制功能的LBLC解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
LVS的工具
- ipvsadm: 用户空间的命令行工具,规则管理器
- ipvsadm-save 保存命令 ipvsadm-save > /PATH/TO/IPVS_FILE
- ipvsadm-restore 加载命令 ipvsadm-restore < /PATH/TO/IPVS_FILE
ipvs:内核空间的组件
ipvsadm命令
- -A|E|D :应用在VS上的 A表示添加,E表示修改,D表示删除
- -t|u|f :VS 和添加RS都使用 t 是 TCP u是UDP f是打的标签(如iptables 的mangle表里打的标签)
- -s :指定调度算法,默认的是WLC
-a|e|d :应用在VS上用来添加修改或删除RS的
指定类型
- -g :指定为lvs-dr类型
- -i :指定为lvs-tun类型
- -m :指定为lvs-nat类型
- -w :设定权重数 越大负载分配越多
- -C :清空所有ipvsadm设定
- -Z :清空调度的计数器
- -L|l :查看调度配置 使用时必须放至前面 后面还可以添加扩展选项
- -(L|l)n :显示地址和端口号
- -(L|l) –exact : 查看精确的配置信息
- -(L|l) –connection|-c :查看当前RS的访问信息
- -(L|l)–stats :查看RS的访问统计信息
- -(L|l)–rate:查看当前访问的输出速率信息
lvs-nat
lvs-nat的工作模式 : 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目
标端口修改为某挑出的RS的RIP和PORT实现转发
下图做的一个简单的实验环境:
图中实验环境:
1.1 VS的网络配置
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@localhost network-scripts]# ipvsadm -A -t 172.18.6.50:80 -s rr
[root@localhost network-scripts]# ipvsadm -a -t 172.18.6.50:80 -r 192.168.3.4 -m
[root@localhost network-scripts]# ipvsadm -a -t 172.18.6.50:80 -r 192.168.3.5 -m
1.2 RS1和R2的路由指向DIP
[root@localhost ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.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
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
0.0.0.0 192.168.3.3 0.0.0.0 UG 0 0 0 eth0
1.3 Client的测试结果
[root@localhost ~]# curl 172.18.6.50
this is RS1 website
[root@localhost ~]# curl 172.18.6.50
this is RS2 website
[root@localhost ~]# curl 172.18.6.50
this is RS1 website
[root@localhost ~]# curl 172.18.6.50
this is RS2 website
[root@localhost ~]# curl 172.18.6.50
this is RS1 website
[root@localhost ~]# curl 172.18.6.50
this is RS2 website
[root@localhost ~]# curl 172.18.6.50
this is RS1 website
lvs-dr
vs的配置:
[root@VS ~]# cat lvs_vs.sh
#!/bin/bash
#
#
#
#############################################
vip='192.168.3.200'
iface='ens33:1'
mask='255.255.255.255'
port='80'
rs1='192.168.3.4'
rs2='192.168.3.5'
scheduler='wrr'
type='-g'
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
echo "The VS Server is Ready!"
;;
stop)
ipvsadm -C
ifconfig $iface down
echo "The VS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
RS1和RS的统一配置
[root@localhost ~]#route add default gw 192.168.3.2
[root@localhost ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth2
0.0.0.0 192.168.3.2 0.0.0.0 UG 0 0 0 eth2
统一配置路由指向192.168.3.2
[root@localhost ~]#cat lvs.sh
#!/bin/bash
#
#
#####################################
vip='192.168.3.200'
mask='255.255.255.255'
dev='lo:1'
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask broadcast $vip up
route add -host $vip dev $dev
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage:$(bosename $0)start|stop"
exit 1
;;
esac
ldirectord + lvs-dr
ldirectord的作用是当RS出现故障时,会自动将RS推出集群,做到故障机器的排除而且代替ipvsadm命令进行配置
这里我们做用到的包 ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
链接:http://pan.baidu.com/s/1i4YMhz3 密码:8dpn
搭建图
这里我们其它配置不做变动,只是稍微修改了下VS的配置
[root@ localhost ha.d]# rpm -ql ldirectord
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/init.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/sbin/ldirectord
/usr/share/doc/ldirectord-3.9.6
/usr/share/doc/ldirectord-3.9.6/COPYING
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz
[root@ localhost ha.d]# cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/ -->ldirectord的服务启动需要一个配置文件的,这边拷贝到/etc/ha.d/下的文件就是模板配置文件
[root@ localhost ha.d]# vim /etc/ha.d/ldirectord.cf
# Global Directives
checktimeout=3 -->这里是检测超时 3是3秒
checkinterval=1 -->这里是检测间隔时间
#fallback=192.168.3.3:80 -->这里是错误返回页面
#fallback6=[::1]:80
autoreload=yes -->这个是自动加载配置文件 开启后所配置的项将自动加载
#logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no
# Sample for an http virtual service
virtual=192.168.3.200:80 --> VIP地址及端口
real=192.168.3.4:80 gate --> RS地址及端口 gate是LVS-DR模式
real=192.168.3.5:80 gate
# real=192.168.6.6:80 gate
# fallback=127.0.0.1:80 gate
service=http
scheduler=wrr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80 --> 这里是检查RS的端口
request="index.html" --> 请求的RS默认HTML页面
receive="this" --> 检测页面包含此字符否,如果检测失败将会剔除失败的RS
virtualhost=www.x.y.z
[root@ localhost ha.d]#systemctl start ldirectord.service