lvs
一、负载均衡LVS基本介绍
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
LVS:
1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
2、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
3、应用范围比较广,可以对所有应用做负载均衡;
4、不支持正则处理,不能做动静分离。
5、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
6、配置 复杂,对网络依赖比较大,稳定性很高。
Ngnix:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
2、nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;
7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
8、不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
10、Nginx还能做Web服务器即Cache功能。
HAProxy的特点是:
1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
6、HAProxy可以对mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
10、不能做Web服务器即Cache。
二、LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
三、lvs的三种模式
VS/DR模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:
需要设置lo接口的VIP不能响应本地网络内的arp请求。
总结:
1、通过在调度器 LB 上修改数据包的目的 MAC 地址实现转发。注意源地址仍然是 CIP,目的地址仍然是 VIP 地址。
2、请求的报文经过调度器,而 RS 响应处理后的报文无需经过调度器 LB,因此并发访问量大时使用效率很高(和 NAT 模式比)
3、因为 DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和调度器 LB 只能在一个局域网里面
4、RS 主机需要绑定 VIP 地址在 LO 接口(掩码32 位)上,并且需要配置 ARP 抑制。
5、RS 节点的默认网关不需要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就可以。
6、由于 DR 模式的调度器仅做 MAC 地址的改写,所以调度器 LB 就不能改写目标端口,那么 RS 服务器就得使用和 VIP 相同的端口提供服务。
7、直接对外的业务比如WEB等,RS 的IP最好是使用公网IP。对外的服务,比如数据库等最好使用内网IP。
优点:
和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
DR模式的效率很高,但是配置稍微复杂一点,因此对于访问量不是特别大的公司可以用haproxy/nginx取代。日1000-2000W PV或者并发请求1万一下都可以考虑用haproxy/nginx。
缺点:
所有 RS 节点和调度器 LB 只能在一个局域网里面。
VS/TUN模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:
需要设置lo接口的VIP不能在公网上出现。
总结:
1.TUNNEL 模式必须在所有的 realserver 机器上面绑定 VIP 的 IP 地址
2.TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内
3.TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了
4.TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用。
优点:
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:
隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
VS/NAT模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
注意:
在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
特点:
1、NAT 技术将请求的报文和响应的报文都需要通过 LB 进行地址改写,因此网站访问量比较大的时候 LB 负载均衡调度器有比较大的瓶颈,一般要求最多之能 10-20 台节点
2、只需要在 LB 上配置一个公网 IP 地址就可以了。
3、每台内部的 realserver 服务器的网关地址必须是调度器 LB 的内网地址。
4、NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
优点:
集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:
扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
七、LVS的八种调度算法
1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
DR模式
direct_server:</span>192.168.254.17<span style="color: #000000;">
real_server:</span>192.168.254.18<span style="color: #000000;">
real_server:</span>192.168.254.19
<span style="color: #008000;">#</span><span style="color: #008000;">vip为虚拟服务ip</span>
vip:192.168.254.250<span style="color: #000000;">
direct_server:
yum install ipvsadm
老板
direct_server:
ipvsadm -C #清除配置信息
<span style="color: #008000;">#</span><span style="color: #008000;">添加对外提供的服务ip</span>
ipvsadm -A -t 192.168.254.250:80 -s rr <span style="color: #008000;">#</span><span style="color: #008000;">-A为ADD -t为tcp -s rr为设置算法为轮叫算法</span>
<span style="color: #008000;">#</span><span style="color: #008000;">添加2台real_server主机</span>
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18:80 -g <span style="color: #008000;">#</span><span style="color: #008000;">-a为add -t为tcp -r为realserver -g为DR路由模式</span>
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -g <span style="color: #008000;">#</span><span style="color: #008000;">-a为add -t为tcp -r为realserver -g为DR路由模式</span>
<span style="color: #008000;">#</span><span style="color: #008000;">配置网卡的子网口为vip,ip地址为192.168.254.250</span>
ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255<span style="color: #000000;"> up
</span><span style="color: #008000;">#</span><span style="color: #008000;">添加路由(访问192.168.254.250都走ens33:0这个网卡)</span>
route add -host 192.168.254.250<span style="color: #000000;"> dev ens33:0
员工1 | 员工2
real_server:
#在回环地址的子网口上配置服务ip(vip)
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
</span><span style="color: #008000;">#</span><span style="color: #008000;">添加路由</span>
route add -host 192.168.254.250<span style="color: #000000;"> dev lo:0
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
arp_ignore:定义接收到ARP请求时的响应级别
0:默认,只用本地配置的有响应地址都给予响应
</span>1<span style="color: #000000;">:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应
(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)
arp_announce:定义将自己的地址向外通告时的级别
0:默认,表示使用配置在任何接口的任何地址向外通告
</span>1<span style="color: #000000;">:尽量仅向目标网络通告与其网络匹配的地址
</span>2<span style="color: #000000;">:仅向与本地接口上地址匹配的网络进行通告
tun隧道模式
lvs-server
ifconfig tunl0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.0 up
route add -host 192.168.254.250 dev tunl0
ipvsadm -A -t 192.168.254.250:80 -s rr
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18 -i
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19 -i
real server
ifconfig tunl0 </span>192.168.254.250 netmask 255.255.255.255 broadcast 192.168.254.250<span style="color: #000000;"> up
route add </span>-host 192.168.254.250<span style="color: #000000;"> dev tunl0
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/tunl0/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/tunl0/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/tunl0/<span style="color: #000000;">rp_filter
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span> > /proc/sys/net/ipv4/conf/all/<span style="color: #000000;">rp_filter
0:不开启源地址校验。
</span>1<span style="color: #000000;">:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。
如果反向路径不是最佳路径,则直接丢弃该数据包。
</span>2<span style="color: #000000;">:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),
如果反向路径不同,则直接丢弃该数据包。
keepalived:
yum install keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
notification_email {
#收件人地址
}
#邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {
state MASTER #角色类型MASTER|BACKUP
interface ens33 #网卡名称
virtual_router_id 51 #虚拟路由id(需要与BACKUP一致)
priority 100 #优先级
advert_int 1 #没1秒检查一次
#nopreempt #非抢占模式
authentication {
auth_type PASS #认证类型 主备之间必须一样
auth_pass 1111 #认证密码 主备之间必须一样
}
virtual_ipaddress {
192.168.254.250 #虚拟ip(vip)
}
}
#LVS配置
virtual_server 192.168.254.250 80 {
delay_loop 3 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
protocol TCP #协议
real_server 192.168.254.18 80 { #要监控的real_server的ip和端口号
weight 1 #权重
TCP_CHECK { #基于tcp协议的检查
connect_timeout 3 #连接时间超时
retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
}
}
real_server </span>192.168.254.19 80<span style="color: #000000;"> {
weight </span>1<span style="color: #000000;">
TCP_CHECK {
connect_timeout </span>3<span style="color: #000000;">
retry </span>3<span style="color: #000000;">
delay_before_retry </span>3<span style="color: #000000;">
}
}
}
192.168.254.17 DS1
192.168.254.20 DS2
ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
route add -host 192.168.254.250 dev ens33:0
192.168.254.18 RS1
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #loopback
route add -host 192.168.254.250 dev lo:0
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
192.168.254.19 RS2
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #loopback
route add -host 192.168.254.250 dev lo:0
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
tail -f /var/log/messages
以上是关于lvs--小白博客的主要内容,如果未能解决你的问题,请参考以下文章