LVS企业级负载均衡

LVS内容:
集群概念
LVS模型
LVS调度算法
LVS实现
ldirectord

LVS原理其实就是利用iptables的INPUT链,侦听在INPUT链,拦截访问集群服务的数据包,将进入数据包的包头进行更改,不同类型更改包头的方式也不一样,转发给后端的RS,最后RS处理请求后在转发给用户。

1 集群和分布式

系统性能扩展方式:

  • Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
  • Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题,Cluster

单台计算机的性能是有上限的,不可能无限地垂直扩展

1.1 集群 Cluster

Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
Cluster分为三种类型:

  • LB:Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
  • HA:High Availiablity,高可用,避免SPOF(Single Point Of Faliure)
    MTBF:Mean Time Between Faliure 平均无故障时间,正常时间
    MTTR:Mean Time To Restoration(repair)平均恢复前时间,故障时间
    A=MTBF/(MTBF+MTTR) (0,1)取值范围:99%,99.5%,99.9%,99.99%,99.999%

SLA: 服务等级协议(简称:SLA,全称:service level agreement)。是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。
1年=365天=8760小时
99.9=87600.1%=87600.001=8.76小时99.99=87600.0001=0.876小时=0.87660=52.6分钟99.999=87600.00001=0.0876小时=0.087660=5.26分钟

  • HPC:High-performance computing,高性能

1.2 分布式系统

分布式存储:Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark

分布式常见应用:

  • 分布式应用-服务按照功能拆分,使用微服务
  • 分布式静态资源–静态资源放在不同的存储集群上
  • 分布式数据和存储–使用key-value缓存系统
  • 分布式计算–对特殊业务使用分布式计算,比如Hadoop集群

1.3 集群和分布式

集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。

分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。

对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败

1.4 集群设计原则

可扩展性—集群的横向扩展能力
可用性—无故障时间(SLA service level agreement)
性能—访问响应时间
容量—单位时间内的最大并发吞吐量

1.5 集群设计实现

1.5.1 基础设施层面

提升硬件资源性能 一 从入口防火墙到后端web server均使用更高性能的硬件资源多域名 一 DNS轮询A记录解析
多入口 一 将A记录解析到多个公网IP入口
多机房 一 同城+异地容灾
CDN(Content Delivery Network)-基于GSLB(Global Server Load Balance)实现全局负载均衡,如:DNS

1.5.2 业务层面

分层:安全层、负载层、静态层、动态层、(缓存层、存储层)持久化与非持久化
分割:基于功能分割大业务为小服务
分布式:对于特殊场景的业务,使用分布式计算

1.6 LB Cluster 负载均衡集群

1.6.1 按实现方式划分

  • 硬件
    F5 Big-IP (负载均衡调度器)
    Citrix Netscaler
    A10 A10

  • 软件
    lvs:Linux Virtual Server,阿里四层SLB(Server Load Balance)使用
    nginx:支持七层调度,阿里七层SLB使用Tengine
    haproxy:支持七层调度

    ats:Apache Traffic Server,yahoo捐助给apache
    perbal:Perl编写

1.6.2 基于工作的协议层次划分

  • 传输层(通用):DNAT 和 DPORT
    LVS:
    nginx:stream
    haproxy:mode tcp

  • 应用层(专用):针对特定协议,常称为proxy server
    http:nginx,httpd,haproxy(mode http)…
    fastcgi:nginx,httpd
    mysql:mysql-proxy

1.6.3 负载均衡的会话保持

1.session sticky:同一用户调度固定服务器
Source IP:LVS sh算法(对某一特定服务而言)
Cookie
2.session replication:每台服务器拥有全部session
session multicast cluster

3.session server:专门的session服务器
Memcached,Redis

1.7 HA高可用集群实现

keepalived:vrrp协议
Ais:应用接口规范
heartbeat
cman+rgmanager(RHCS)…

2 Linux Virtual Server简介

4种工作模式,10种调度算法

2.1 LVS介绍

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩(花名正明),阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现
LVS官网:http://www.linuxvirtualserver.org!

LVS相关术语
VS:Virtual Server,负责调度
RS:Real Server,负责真正提供服务

2.2 LVS工作原理

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS,LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”

2.3 LVS集群体系架构

在这里插入图片描述
集群环境:Director(一般需要两个组成高可用集群,图中没有),LVS调度器发请求到后端服务器real server。

2.4 LVS功能及组织架构

2.4.1 应用于高访问量的业务

如果您的应用访问量很高,可以通过配置监听规则将流量分发到不同的云服务器ECS(Elastic Compute Service弹性计算服务)实例上。此外,可以使用会话保持功能将同一客户端的请求转发到同一台后端ECS

2.4.2 扩展应用程序

可以根据业务发展的需要,随时添加和移除ECS实例来扩展应用系统的服务能力,适用于各种Web服务器和App服务器。

2.4.3 消除单点故障

可以在负载均衡实例下添加多台ECS实例。当其中一部分ECS实例发生故障后,负载均衡会自动屏蔽故障的ECS实例,将请求分发给正常运行的ECS实例,保证应用系统仍能正常工作

2.4.4 同城容灾(多可用区容灾)

为了提供更加稳定可靠的负载均衡服务,阿里云负载均衡已在各地域部署了多可用区以实现同地域容灾。当主可用区出现机房故障或不可用时,负载均衡仍然有能力在非常短的时间内(如:大约30s中断)切换到另外一个备可用区恢复服务能力;当主可用区恢复时,负载均衡同样会自动切换到主可用区提供服务。

使用负载均衡时,您可以将负载均衡实例部署在支持多可用区的地域以实现同城容灾。此外,建议您结合自身的应用需要,综合考虑后端服务器的部署。如果您的每个可用区均至少添加了一台ECS实例,那么此种部署模式下的负载均衡服务的效率是最高的。

如下图所示,在负载均衡实例下绑定不同可用区的ECS实例。正常情况下,用户访问流量将同时转至发主、备可用区内的ECS实例;当可用区A发生故障时,用户访问流量将只转发至备可用区内的ECS实例。此种部署既可以避免因为单个可用区的故障而导致对外服务的不可用,也可以通过不同产品间可用区的选择来降低延迟。

在这里插入图片描述
如果采取如下图所示的部署方案,即在负载均衡实例的主可用区下绑定多台ECS实例,而在备可用区没有任何ECS实例。当主可用区发生故障时会造成业务中断,因为备可用区没有ECS实例来接收请求。这样的部署方式很明显是以牺牲高可用性为代价来获取低延时。
在这里插入图片描述

2.4.5 跨地域容灾

您可以在不同地域下部署负载均衡实例,并分别挂载相应地域内不同可用区的ECS。上层利用云解析做智能DNS,将域名解析到不同地域的负载均衡实例服务地址下,可实现全局负载均衡。当某个地域出现不可用时,暂停对应解析即可实现所有用户访问不受影响。
在这里插入图片描述

2.5 LVS应用场景

2.5.1 音视频大流量场景

在这里插入图片描述
对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全和高可靠的云存储服务

音视频海量流量自动分发
音视频应用中由于用户与主播之间需要实时大量的互动,因此,用户的流量非常大,而直播业务的波峰波谷效应明显,这对整个系统的弹性、稳定性和可用性带来了巨大的挑战

提高横向扩展能力
添加或删减负载均衡后端的服务器实时生效,可根据业务流量大小实时增减

抵御海量流量
业务发展快,访问流量巨大,负载均衡可对多台云服务器进行流量分发服务

提升应用可用性
负载均衡提供后端服务器的健康检查,实时屏蔽异常服务器,提升系统可用性

2.5.2 网络游戏动静分离场景

在这里插入图片描述
动静请求分离,快速稳定交付
游戏业务有很多图片等静态资源需要加载,通过CDN实现全球用户访问静态资源的加速;当用户在游戏
中有互动时,产生的访问流量非常大,此时为了保证互动实时性,需要使用负载均衡进行流量分发

动态请求流量分发
动态请求量大,采用多台云服务器计算处理,并利用负载均衡服务随时进行流量分发

静态请求快速加载
静态内容选择对象存储,接入CDN服务,进一步优化内容分发链路,让内容即刻加载

2.5.3 多层次容灾架构场景

在这里插入图片描述

跨地域跨可用区的容灾方案
用户业务遍布各地域,使用云解析DNS将不同地域用户智能解析访问到相应的业务系统内,使用负载均
衡进行海量的访问流量分发,还可构建地域级、可用区级的多层容灾架构

智能解析
智能判断提供最佳的访问解析地址,使访问用户获得最快捷、最流畅的体验

流量分发
业务发展快,访问流量巨大,负载均衡可对多台云服务器进行流量分发服务

多层次容灾
云解析提供跨地域的高可用,负载均衡可实现可用区级的高可用

2.5.4 海量访问流量分发场景

在这里插入图片描述

2.6 LVS集群类型中的术语

VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx)上游服务器, backend server(haproxy)
CIP:Client IP
VIP:Virtual serve IP VS外网的IP
DIP:Director IP VS内网的IP
RIP:Real server IP
访问流程:CIP <–> VIP == DIP <–> RIP

3 LVS工作模式和相关命令

3.1 LVS集群的工作模式

lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址。MAC头的修改
lvs-tun:在原请求IP报文之外新加一个IP首部。
lvs-fullnat:修改请求报文的源和目标IP

❤3.1.1 LVS的NAT模式

④是DNAT技术
在这里插入图片描述
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
在这里插入图片描述

❤3.1.2 LVS的DR模式

DR模式:请求报文经过LVS服务器,但是响应报文是不经过LVS服务器的。提升服务器的性能

在这里插入图片描述
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

在这里插入图片描述
ignore,announce。 可以控制对外不宣称VIP,同时也不响应请求。
arp_ignore - INTEGER
0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答;
1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应;
2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求;
3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
4-7:保留
8:不应答所有本地IP
arp_announce - INTEGER
0:默认值,允许使用本机上所有接口的IP作ARP通告。
1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告。
2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告。

在这里插入图片描述

VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx)上游服务器, backend server(haproxy)
CIP:Client IP
VIP:Virtual serve IP VS外网的IP
DIP:Director IP VS内网的IP
RIP:Real server IP
访问流程:CIP <–> VIP == DIP <–> RIP

DIP和RIP是在一个网段,VIP可以独立一个网段

DR模式的特点:

1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director

  • 在前端网关做静态绑定VIP和Director的MAC地址
  • 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
  • 在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore
/procy/sys/net/ipv4/conf/all/arp_announce

3.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director

4.RS和Director要在同一个物理网络
5.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
6.不支持端口映射(端口不能修改)
7.RS可使用大多数OS系统

3.1.3 LVS的TUN模式

请求到达LVS,然后通过IP Tunnel

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
在这里插入图片描述
请求报文经过LVS服务器,而响应报文,不需要经过LVS服务器。
TUN模式特点:

  1. DIP,VIP,RIP可以是公网地址
  2. RS的网关一般不能指向DIP
  3. 请求报文要经由Director,但响应不经由Director
  4. 不支持端口映射
  5. RS的OS须支持隧道功能

3.1.4 LVS的FULLNAT模式

kernel内核不支持,了解下即可。 源地址也参与转换了
在这里插入图片描述

VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx)上游服务器, backend server(haproxy)
CIP:Client IP
VIP:Virtual serve IP VS外网的IP
DIP:Director IP VS内网的IP
RIP:Real server IP
访问流程:CIP <–> VIP == DIP <–> RIP

通过同时 修改请求报文的源IP地址和目标IP地址进行转发
fullnat模式特点:
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.支持端口映射
注意:此类型kernel默认不支持

3.1.5 LVS工作模式总结和比较

VS/NAT VS/TUN VS/DR
Server any Tunneling Non-arp device
Server network private LAN/WAN LAN
Server number low(10-20) High(100) High(100)
Server gateway load balancer own router own router

lvs-nat与lvs-fullnat:

  • 请求和响应报文都经由Director
  • lvs-nat:RIP的网关要指向DIP
  • lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

lvs-dr与lvs-tun:

  • 请求报文要经由Director,但响应报文RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

3.2 LVS调度算法

ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态
分为两种:静态方法和动态方法

3.2.1 静态方法

仅根据算法本身进行调度
1.RR:roundrobin,轮询
2.WRR:Wegihted RR,加权轮询
3.SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定。
4.DH:Destination Hashing:目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

3.2.2 动态方法

主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、LC:least connections 适用于长连接应用
Overhead=activeconns256+inactiveconns
2、WLC:Weighted LC,默认调度方法
Overhead=(activeconns
256+inactiveconns)/weight
3、SED:Shortest Exception Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

3.2.3 内核版本4.15版本后新增调度算法:FO和OVF

FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度

OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:

  • 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

3.3 LVS相关软件

3.3.1 程序包:ipvsadm

yum -y install ipvsadm
Unit File:ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm

3.3.2 ipvsadm命令

ipvsadm核心功能:

  • 集群服务管理:增、删、改
  • 集群服务的RS管理:增、删、改
  • 查看

ipvsadm工具用法:

#管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pepersistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address #删除
ipvsadm -C #清空
ipvsadm -R #重载,相当于ipvsadm-restore
ipvsadm -S [-n] #保存,相当于ipvsadm-save,默认停服务会保存在/etc/sysconfig/ipvsadm

#管理集群中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L [options]
ipvsadm -Z [-t|u|f service-address]

管理集群服务:增、改、删

增、修改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

删除:
ipvsadm -D -t|u|f service-address

-t|u|f:
-t:TCP协议的端口,VIP:TCP_PORT
-u:UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,标记,一个数字

[-s scheduler]:指定集群的调度算法,默认为wlc

管理集群上的RS:增、改、删

增、改:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
删:
ipvsadm -d -t|u|f service-address -r server-address

server-address:
rip[:port] 如省略port,不作端口映射
选项:
lvs类型:
-g:gateway,dr类型,默认
-i:ipip,tun类型
-m:masquerade,nat类型
-w weight:权重

清空定义的所有内容

ipvsadm -C

清空计数器:
ipvsadm -z [-t|u|f service-address]

查看:

ipvsadm -L [options]
--numeric,-n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate:输出速率信息

ipvs规则:/proc/net/ip_vs
ipvs连接:/proc/net/ip_vs_conn

保存:建议保存至/etc/sysconfig/ipvsadm

ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE

重载:

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

3.4 防火墙标记

FWM:FireWall Mark
MARK target可用于给特定的报文打标记
–set-mark value
其中:value可为0xffff格式,表示十六进制数字
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度。

实现方法:
在这里插入图片描述
以下这种访问,是各自调度各自的,不会作为成体调度,会有一个情况都调度到同一个RS上。
yum -y install mod_ssl

ipvsadm -A -t 192.168.0.100:443 -s rr
ipvsadm -a -t 192.168.0.100:443 -r 10.0.0.7
ipvsadm -a -t 192.168.0.100:443 -r 10.0.0.7

在这里插入图片描述在这里插入图片描述

现在想要访问80和443就认为是一个服务作为成体调度。打上防火墙标签,根据标签调度

iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
iptables -t mangle -nvL
ipvsadm -Ln

在这里插入图片描述

ipvsadm -A -f 66 -s rr
ipvsadm -a -f 66 -r 10.0.0.7
ipvsadm -a -f 66 -r 10.0.0.17
ipvsadm -Ln

在这里插入图片描述
作为整体调度,两个访问请求,最后出现的地址会错开。
在这里插入图片描述

3.5 LVS持久连接

ipvsadm -E -f 66 -s **sh**
ipvsadm -Ln

SH算法,根据源地址调度,只要同一个IP,就往同一个机器调度。

session绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现

持久连接(lvs persistence)模板:实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p[timeout]]

持久连接实现方式:

  • 每端口持久(PPC):每个端口定义为一个集群服务,每集群服务单独调度
  • 每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
  • 每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式
ipvsadm -E -f 66 -s rr -p   
sh算法比较粗糙,来自同一个IP就往同一个机器调度
rr算法均匀实现了负载均衡,缺点可能会导致session信息的丢失,尽可能让客户访问同一个服务器,单单轮询是做不到的。
不管什么算法,加上-p,可以实现持久连接,   -p 3000 

❤4 LVS实战案例

均在无防火墙服务的测试

4.1 LVS-NAT模式案例

在这里插入图片描述
1.Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
2.Web服务器采用仅主机网卡与director相连
3.Web服务器网关指向10.0.0.200
4.后端web服务器不需要连接外网

使用NAT模式,采用轮询调度算法、

范例
图有点错,应该是 172.20.200.6/24
在这里插入图片描述
环境
地址:
RS1:10.0.0.7
RS2:10.0.0.17
CLIENT:172.20.200.6
LVS:10.0.0.8 172.20.200.200 (LVS服务器上安装yum -y install ipvsadm)
在这里插入图片描述

RS1
#vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.8

修改了/etc/sysconfig/network-scripts/ifcfg-eth0的要进行
nmcli connection reload
nmcli connection up eth0
route -n

第一步:搭建http服务(把http服务通过lvs进行调度)
在RS1,RS2上:yum -y install httpd && systemctl enable --now httpd
[root@rs1 ~]# echo RS1 Server on 10.0.0.7 > /var/www/html/index.html
[root@rs2 ~]# echo RS2 Server on 10.0.0.17 > /var/www/html/index.html

第二步:测试网络互联

[root@LVS ~]# hostname -I
10.0.0.8 172.20.200.200
[root@LVS ~]# curl 10.0.0.7
RS1 Server on 10.0.0.7
[root@LVS ~]# curl 10.0.0.17
RS2 Server on 10.0.0.17
[root@LVS ~]# ping 172.20.200.6
PING 172.20.200.6 (172.20.200.6) 56(84) bytes of data.
64 bytes from 172.20.200.6: icmp_seq=1 ttl=64 time=1.05 ms

在这里插入图片描述
第三步:LVS配置
首先要安装好 ipvsadm,其次确保ipforward开启

#LVS启用IP_FORWORD功能
[root@LVS ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

在这里插入图片描述

#
[root@LVS ~]# ipvsadm -A -t 172.20.200.200:80 -s rr  // -A添加集群,-t是指定VIP和指定端口(连接外网的),算法是rr轮询算法
[root@LVS ~]# ipvsadm -a -t 172.20.200.200:80 -r 10.0.0.7 -m  // -a针对添加real server, -r是real server的地址, -m是工作模式(默认是DR,-g对应DR -i对应tunnel -m对应nat)
[root@LVS ~]# ipvsadm -a -t 172.20.200.200:80 -r 10.0.0.17 -m

ipvsadm -Ln
如何想调度mysql,那新增一个集群
[root@LVS ~]# ipvsadm -A -t 172.20.200.200:3306 -s rr


[root@LVS ~]# ipvsadm -Ln   或者 cat /proc/net/ip_vs 以十六进制形式展开
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.20.200.200:80 rr
  -> 10.0.0.7:80                  Masq    1      0          0         
  -> 10.0.0.17:80                 Masq    1      0          0   

在这里插入图片描述

第四步:测试验证
轮询效果:
第一次应该访问到RS1
第二次应该访问到RS2
第三次应该访问到RS1
在这里插入图片描述
想保存规则

[root@LVS ~]# ipvsadm-save -n
-A -t 172.20.200.200:80 -s rr
-a -t 172.20.200.200:80 -r 10.0.0.7:80 -m -w 1
-a -t 172.20.200.200:80 -r 10.0.0.17:80 -m -w 1

[root@LVS ~]# ipvsadm -Sn 
[root@LVS ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm  放在启动服务的地方

在这里插入图片描述
在上面保存到文件后,清理后再重新加载规则:

ipvsadm -C
ipvsadm -Ln
ipvsadm -R < /etc/sysconfig/ipvsadm
ipvsadm -Ln

在这里插入图片描述
以上重新加载规则都是临时性的,如果想持续保存
systemctl enable --now ipvsadm.service 开机会自动加载
–now选项,可以激活同时启动服务

Real Server,从里访问外不行,没有配置SNAT,没路由。只能从外访问里,配置了DNAT

此外,后端Real Server服务器通过日志可以看到客户端的IP
在这里插入图片描述


数据库调度
①在后端Real Server服务器上
grant all on *.* to test@'%' identified by '123456';

[root@LVS ~]# ipvsadm -A -t 172.20.200.200:3306 -s rr
[root@LVS ~]# ipvsadm -a -t 172.20.200.200:3306 -r 10.0.0.7 -m //添加节点
[root@LVS ~]# ipvsadm -a -t 172.20.200.200:3306 -r 10.0.0.17 -m
[root@LVS ~]# ipvsadm -Ln

在这里插入图片描述
②客户端连接

[root@CLIENT ~]# mysql -utest -h172.20.200.200 -p123456

在这里插入图片描述
③RS服务器上查看ss -nt
连到了rs2
在这里插入图片描述断开后,客户端再次连接,这次连到了rs1
在这里插入图片描述

④还有一种验证方法,是在RS服务器上,修改他们的server_id
RS上登录到数据库修改,然后在客户端登录查询server_id测试
rs1:MariaDB [(none)]> set global server_id=7;
rs2:MariaDB [(none)]> set global server_id=17;
在这里插入图片描述
⑤保存规则
(服务停止会自动保存 systemctl stop ipvsadm.service)
cat /usr/lib/systemd/system/ipvsadm.service

修改调度策略1

ipvsadm -E -t 172.20.200.200:80 -s wrr
ipvsadm -Ln
ipvsadm -e -t 172.20.200.200:80 -r 10.0.0.7 -m -w 3
ipvsadm -Ln

在这里插入图片描述在这里插入图片描述
修改调度策略2

如果想改端口为8080, 
先在RS1服务器将httpd.conf的监听改为8080,重启httpd服务
再去LVS,先删除之前的规则
ipvsadm -d -t 172.20.200.200:80 -r 10.0.0.7
再添加下面的这个
ipvsadm -a -t 172.20.200.200:80 -r 10.0.0.7:8080 -m -w 3

在这里插入图片描述

4.2 LVS-DR模式案例

在这里插入图片描述
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

  • 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
  • 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别:arp_announce

  • 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
  • 1:尽量避免将接口信息向非直接连接网络进行通告
  • 2:必须避免将接口信息向非本网络进行通告

在这里插入图片描述
DR模式的组网要求LVS和Real server在同一网段二层互通。因为LVS DR模式在负载均衡转发报文时,只修改目的mac为real server的mac,lvs要能将报文转发给real server,就必须满足LVS和real server是同网段二层互通。

配置要点
1.Director 服务器采用双IP桥接网络,一个是VIP,一个DIP
2.Web服务器采用和DIP相同的网段和Director连接
3.每个Web服务器配置VIP
4.每个web服务器可以出外网

范例

环境:五台主机
一台:客户端 172.20.0.123/16  GW:172.20.200.200
一台:ROUTER
eth0:NAT 10.0.0.200/24 VIP
eth1:桥接 172.20.200.200/16
启用 IP_FORWARD
一台:LVS
eth0:10.0.0.19/24 GW:10.0.0.200

两台RS:
RS1:10.0.0.7/24  GW:10.0.0.200
RS2:10.0.0.17/24 GW:10.0.0.200

配置过程

NAT模式支持端口映射,DR模式不支持端口映射,要把上面NAT实验的8080改为80

路由器
ipforward配置,/etc/sysctl.conf
net.ipv4.ip_forward=1
#sysctl -p

第一步:配置好地址,互联互通,网关是下一跳地址

第二步:配置
直接配IP地址,可能会产生冲突,所以配置地址前,要防止地址冲突

#在LVS服务器上实现   -g 默认是dr模型
[root@centos8~]#ifconfig 1o:1 10.0.0.100/32
[root@centos8~]#ipvsadm -A -t 10.0.0.100:80 -s rr
[root@centos8I~]#ipvsadm-a -t 10.0.0.100:80 -r 10.0.0.7
[root@centos8~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17
[root@centos8~]#ipvsadm -Ln

#在后端RS服务器上实现,默认值是0表示正常工作模式,ARP请求会回应而且还会向外声明自己的IP地址
RS1和RS2都要这样配置
[rootQRS1~]#ifconfig 1o:1 10.0.0.100/32
[root@RS1~]#echo 1>/proc/sys/net/ipv4/conf/a11/arp_ignore  1表示只有请求的时候才回应
[root@RS1~]#echo 1>/proc/sys/net/ipv4/conf/1o/arp_ignore
[root@RS1~]#echo 2>/proc/sys/net/ipv4/conf/a11/arp_announce  2表示不主动声明
[root@RS1~]#echo 2>/proc/sys/net/ipv4/conf/1o/arp_announce

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。

4.3 LVS-DR多网段模式案例

RIP和DIP不在同一个网段。
在这里插入图片描述在这里插入图片描述

路由器配置: 在eth0的基础上增加地址
nmcli connection modify eth0 +ipv4.address 192.168.0.200/24
nmcli connection reload eth0
nmcli connection up eth0

VIP脚本配置
virtual server在网卡子接口上配置vip,配置dr转发的ipvs规则。提高配置效率,将这些操作定义为shell脚本如下

LVS服务器执行:bash lvs_dr_vs.sh start

#!/bin/bash
vip='192.168.0.100'
mask='255.255.255.255'
port='80'
iface='lo:1'
rs1='10.0.0.7'
rs2='10.0.0.17'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null  || yum -y install ipvsadm &> /dev/null

case $1 in
start)
    ifconfig $iface $vip netmask $mask broadcast $vip up
    iptables -F
    # 配置ipvs规则
    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!"
    #realserver不配置端口,dr模式不支持端口映射 
    ;;
stop)
    ipvsadm -C
    ifconfig $iface down
    echo "The VS Server is Canceled!"
    ;;
*)
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac

RIP脚本配置
Realserver的vip配置在lo口,与arp_ignore、arp_announce参数的修改相配套,抑制了RealServer不应答vip的arp请求,而接受lvs-dr转发过来的报文。提高配置效率,将这些操作定义为shell脚本如下

RS服务器执行:bash lvs_dr_rs.sh start

#!/bin/bash
vip=192.168.0.100
mask='255.255.255.255'
dev=lo:1
#rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
#serice httpd start &> /dev/null && echo "The httpd Server is Ready!"
#echo "<h1>`hostname`</h1>" > /var/www/html/index.html

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
    echo "The RS Server is Ready"
    ;;
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

在这里插入图片描述

5 LVS 高可用性实现

LVS不可用时:
Director不可用,整个系统将不可用;SPoF Single Point of Failure
解决方案:高可用,keepalived、heartbeat/corosync

RS不可用时:
某RS不可用时,Director依然会调度请求至此RS
解决方案:由Director对各RS健康状态进行检查,失败时禁用,成功时启用
常用解决方案:

  • keepalived
  • heartbeat/corosync
  • ldirectord

检测方式:

  • 网络层检测,icmp
  • (b)传输层检测,端口探测
  • (c)应用层检测,请求某关键资源

RS全不用时:backup server,sorry server(LVS上也可搭建专门用来维护时用的页面)

5.1 Idirectord软件(了解,一般用keepalive)

Idirectord:监控和控制LVS守护进程,可管理LVS规则。(健康性检查)
包名:Idirectord-3.9.6-0rc1.1.1.x86_64.rpm
下载:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/

相关文件:

·/etc/ha.d/ldirectord.cf	#主配置文件
·/usr/share/doc/ldirectord-3.9.6/directord.cf	#配置模版
·/usr/lib/systemd/system/ldirectord.service	#服务
·/usr/sbin/ldirectord	#主程序,Perl实现
·/var/log/directord.log		#日志
·/var/run/ldirectord.ldirectord.pid		#pid文件

5.2 Idirectord配置文件示例

在这里插入图片描述
在这里插入图片描述

范例:DR模型的FWM
在这里插入图片描述
这个了解下就行,后续是会用keepalive调用的

猜你喜欢

转载自blog.csdn.net/qq_39578545/article/details/107749150