LVS:linux virtual server(调度器)
是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,
它的官方网是 http://www.linuxvirtualserver.org
现在 LVS 已经是 Linux内核标准的一部分。使用 LVS 可以达到的技术目标是:
通过 LVS 达到的负载均衡技术和Linux 操作系统实现一个高性能高可用的 Linux服务器集群,它具有良好的可靠性、可扩展性和可操作性。
从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,
LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
一、集群概念
Cluster类型:集群,多个主机组合起来对外提供服务
LB:lodad balancing 均衡负载(均摊不严格),MYSQL主从复制(主宕机,从不能主动提升为主);LVS
HA:high高可用,MYSQL的MHA高可用(主服务器宕机,从自动提升为主解决单点失败)
A值(无故障比率)越高,可用性越高,按年计算
HPC:高性能
分布式系统:减少备份的冗杂和提高工作效率(raid)
集群和分布式区别:一堆全栈工程师和(前端工程师+后端工程师搭配)
Cluster分类:
基于设备
硬件几十万,长的像交换机
软件:lvs、nginx、haproxy....
基于协议:
传输层:只识别传输层以下协议,DPORT(公网---->私网);DNAT不支持访问道多个服务器端口
应用层:proxy功能多,性能强
Cluster相关:
会话:
1)对号入座,session绑定
2)session复制;
3)专有session服务器;Memcached、redis;
HA集群实现方案:
keepalived解决单点失败
二、LVS介绍(内核直接支持)
VS:Virtual Server,调度器/虚拟服务器
RS:Real Server,上游服务器nginx
CIP:Client Server IP
RIP:Real Server IP,一般为私网地址
VIP:Virtual Server IP,外网
DIP:Director Server IP,内网
流程:CIP<-->VIP==DIP<-->RIP
IPVS:IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。
LVS工具:
ipvsadm/ipvs
ipvsadm:用户空间的命令行工具,规则管理器
用于管理集群服务及RealServer
ipvs:工作于内核空间netfilter的INPUT钩子上的框架
LVS集群类型:
LVS-NAT:多IP多端口的DNAT,中间(LVS和SERVER)可以加路由器,一般是交换机
本质是替换多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络不是一定,且应使用私网地址,用公网地址会浪费资源;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director(lvs)转发,Director压力太大;
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
要启动ip_forward功能
★LVS-DR:直接路由
(1)Director和各RS都配置有VIP,回去不经过LVS
(2)确保前端路由器将目标IP为VIP的请求报文发往Director
(3)请求报文必须经过LVS,响应报文不用经过(NAT要经过,是因为要做IP地址转换)
★多个主机配置VIP地址避免冲突的手段:
思路:多台RS都拥有VIP的原理:ARP时,第一别人问RS不搭理,第二对外不宣称,RS默默拥有VIP的地址,所以ARP时才不会被收集也不会产生地址冲突;将VIP绑定在lo网卡上(eth0的RIP需要响应ARP)
1、在前端网关做静态绑定VIP和Director的MAC地址
2、在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
3、在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore 1 /proc/sys/net/ipv4/conf/all/arp_announce 2
(4)三次握手,第一次转发两次,第二次到client,第三次再到RS;抓包可以看到
(3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络; RIP的网关不能指向DIP,以确保响应报文不会经由Director
(4)RS和Director要在同一个物理网络;路由器有两个网卡(公和私)
(5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往 Client
(6)不支持端口映射(端口不能修败),全程只改了数据链路层头部(MAC)
(7)RS可使用大多数OS系
不用启动ip_forward功能
LVS-TUN:修改报文头部,跨异地机房,大企业使用,容错高
LVS-FULLNAT:源IP和目标IP都替换,而LVS-NAT只替换了目标IP,内核不支持
调度:ipvs scheduler,根据协议来
静态:只考虑本身算法
RR:轮询
WRR:按高低比例能者多劳
SH:源地址哈希,SIP和RIP一一对应,只认这一个客户端,相同源地址调度到始终认的主机
DH:目标地址哈希调度,正向代理(离客户端近),只认这一个主机,VIP,后端是缓存服务器;
动态:考虑RS负载,有权重
LC:负载值越小越被用来调度,但没有考虑到性能
WLC:默认,值小优先
SED:第一次连接权重大优先
NQ:第一次均匀分再SED
LBLC:动态DH,均衡
LBLCR:LBLC+复制,重-->轻
LVS基本原理图:

三、实现LVS
集群:-A/-D
集群服务:加入RS -a/-e
NAT模式实现HTTP集群均衡负载:相同端口:1、不加路由2、加路由
不同端口:
保存默认反向解析,-Sn
NAT模式实现HTTPS集群均衡负载:
实现单网络的DR的LVS:
★:SIP和回环网卡上添加VIP的操作;lvs的网关随便配;tcpdump和ip的用法
★实现跨网络的DR的LVS:
有可能出现单点失败问题,可用keepalived解决
四、FireWall Mark数据报文打标签;将不同集群服务统一调度
需要搭建HTTPS
持久连接 -p,但宕机还是会往指定服务上调度
默认360s在同一RS调度
端口:
防火墙:
ldirectord:解决lvs健康性检查问题,监控lvs运行状态,将故障规则清理,不用手写
需要在网上找资源下载安装,将配置模版文件复制给主配置文件并修改以下配置并重启服务
checktimeout=3 检查时间间隔
checkinterval=1
autoreload=yes 配置文件设置完是否自动加载
logfile=“/var/log/ldirectord.log“ #日志文件,启动
quiescent=no #down时yes权重为0,no为删除
virtual=5(防火墙标签) #指定VS的FWM或IP:port,用这一项要注释iprotocol项
real=192.168.32.7:80 gate 2 DR
real=192.168.32.17:80 gate 1 DR
fallback=127.0.0.1:80 gate #sorry server
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request="index.html"
receive=“Test Ldirectord"
LVS-NAT原理图:

LVS-DR原理图:

网络拓扑图:

原理思路:MAC替换过程:MACcip-->MACroute左;MACroute右-->MACvip;MACdip-->MACrip;MACrip-->MACroute右;MACroute左-->MACcip
拓扑图配置
client:bridge
cip:172.20.222.1;route add -net 10.0.0.0/8 gw 172.20.222.2
cip需要访问10.0.0.0网络需要加路由,直连的网络默认添加该网段路由,而它不是直连的
router:host
左口:172.20.222.2,右口:10.0.0.171/8、192.168.71.200/24,设置路由转发ip_forward=1
这里右口需要公网和私网两个地址是为了和后面的lvs使用公网通信,私网也可以但是意义不大
LVS配置及命令:host
vip:10.0.0.71/32,192.168.71.100/24,gw 192.168.71.200
运行下面的LVS脚本配置来生成VIP地址以及解决VIP地址多主机冲突问题
RS配置及命令:host
RS1:vip:10.0.0.71/32,192.168.71.7/24,gw 192.168.71.200
system start httpd echo RS1 > /var/www/html/index.html
RS2:vip:10.0.0.71/32,192.168.71.17/24,gw 192.168.71.200
system start httpd echo RS1 > /var/www/html/index.html
最后分别为RS1和RS2运行下面的RS脚本,用于执行lvs的策略
LVS脚本配置:
#!/bin/bash
vip=10.0.0.71
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='192.168.71.7'
rs2='192.168.71.17'
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
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
esac
vip掩码为32是因为该网段只有自己一个网络,这里不需要网关是行不通的,lvs不用再返回到route右口,但网络认为该网卡没有网关无法与它通信,192.168.71的网关随便配,
RS配置及命令:
rp1(eth0):192.168.71.7,gw 192.168.71.200;vip(lo):10.0.0.71
systemctl restart httpd vim /var/www/html/index.html rp1
rp2(eth0):192.168.71.17,gw 192.168.71.200;vip(lo)10.0.0.71
systemctl start httpd vim /var/www/html/index.html rp1
以上将rp的地址绑定在lo网卡是为了避免eth0网卡宕机下还能通过本地lo网卡继续使用
RS脚本配置:
#!/bin/bash
vip=10.0.0.71
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: $(basename $0) start|stop"
exit 1
;;
esac
最后在172.20.222.1主机上curl http://10.0.0.71的结果会显示出lvs的效果;该实验网络的连通是成功搭建LVS的关键!!
转载请注明:黑夜 » 均衡负载之LVS