LVS学习笔记

一、LVS(linux virtual server)定义

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

 

二、相关概念

1 cluster(集群)

为了解决某个特定的问题,将多台计算机组合起来,形成的单一系统。

随着互联网的发展,为了满足高并发的要求,系统需要不断的扩展。扩展的方式主要有两种,scale up(向上扩展,增加配置)、scale out(向外扩展,增加设备)。集群属于scale out。

 

2 负载均衡LB(load balance)

 严格来说,负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的,使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软体和硬件来完成。

 

3 高可用HA(heigh availiablity)

高可用集群就是当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务。高可用集群是用于单个节点发 生故障时,能够自动将资源、服务进行切换,这样可以保证服务一直在线。在这个过程中,对于客户端来说是透明的。

MTBF 平均无故障时间

MTTR平均恢复前时间

高可用集群的衡量标准

高可用集群一般是通过系统的可靠性(reliability)和系统 的可维护性(maintainability)来衡量的。通常用平均无故障时间(MTTF)来衡量系统的可靠性,用平均维护 时间(MTTR)来衡量系统的可维护性。因此,一个高可用集群服务可以这样来定义:HA=MTTF/(MTTF+MTTR)*100%。

一般高可用集群的标准有如下几种:

99%:表示 一年宕机时间不超过4天

99.9% :表示一年宕机时间不超过10小时

99.99%: 表示一年宕机时间不超过1小时

99.999% :表示一年宕机时间不超过6分钟

 

4 HPC高性能((High Performance Computing)

构建高性能计算系统的主要目的就是提高运算速度。

 

5 其他

分布式:一个任务分给多台机器去做,减少单个任务的执行时间。

集群:提高单位时间内执行任务数。

SPOF 单点失败

keepalive 与lvs搭配,解决单点失败问题

 

三、cluster分类

1 硬件

F5、big-ip

2 软件

lvs、nginx、haproxy

lvs工作在传输层及以下,nginx、haproxy可以工作在应用层。

 

 


 

思考一个问题

如上图,A、B为client,1、2、3分别为负载均衡集群中的真实服务器,当A第一次访问时被调度到真实服务器1,A的登录信息记录在1上,如果A再次访问被调度到2,2上没有A的登录信息,A需要重新登录。如何解决?

方法1:

可以通过调度算法,把来自同一个IP的请求调度到同一台后端真实服务器。

方法2:

session绑定(session是啥,参考https://blog.csdn.net/xueqinna/article/details/51628984)

后端真实服务器将cookie信息发送到client上,client请求中携带cookie信息,lvs检测到cookie信息,调度。

方法3:

session同步

在真实服务器1、2、3上同步session信息,或是用专有的session服务器,如redis。

 


 

 

四、LVS集群中的术语

VS

virtual server  director server dispatcher(调度器) load balancer

RS

real server    upstream server(nginx) 上游服务器  backed server (haproxy)后端服务器

CIP

client ip

VIP

virtual server ip

DIP

director ip VS服务器用于内网连接的ip

RIP

real server ip

 

五、LVS原理

1 LVS原理-内核模型

**此处可以了解一下iptable的原理**    地址 https://blog.csdn.net/sinat_36888624/article/details/78733484

LVS由工作在用户空间(user space)的ipvsadm和工作在内核空间(kenel space)的ipvs组成。ipvsadm用来定义规则,ipvs工作在内核空间的input链上,当数据到达input链时,首先被ipvs检测,如果数据包中的目的ip及端口没有在规则中,则数据包会被放行到用户空间。反之,数据包将会被修改目的地址(按照规则),并直接发往postrouting链,最后经由postrouting链发往后端服务器。如下图所示。

  

 

2 LVS原理-lvs的包转发模型

lvs-nat

lvs-dr(最常用,也是默认模型)

lvs-tun

lvs-fullnat

重点掌握lvs-nat、lvs-dr,另外两种只做了解即可。

 

lvs-nat

 

1 客户端将请求发往lvs服务器,源ip为cip,目的ip为vip。

2 lvs服务器收到报文后,发现目的地址为规则中存在的地址,按照规则修改目的ip为后端的rip,并按照调度算法转发出去。

3 rs收到报文后,发现目的地址为自身地址,响应请求并将响应返还给lvs服务器。

4 lvs服务器将报文的源ip改为自身ip(vip),发给客户端。lvs服务器与real server之间的链接如果使用交换机,rs的网关应为dip。

 

lvs-dr

1 client 发送请求给lvs。

2 lvs收到请求报文,发现目的地址为规则中的地址,按照规则修改源mac为dmac,目的mac为rmac,按照调度算法转发给后端服务器。

3 rs收到道文,发现mac地址为自身mac,处理后响应请求,将报文直接发给client。

**dr模式不支持端口映射**

 

lvs-tun(隧道模式)--适合跨异地机房

|dip rip|cip vip|tcp|http|data|

原理详情:
1.客户请求数据包,目标地址VIP(调度器的IP地址)发送到调度器上
2.调度器接收到客户请求包,进行IP Tunnel封装,在原有的包头加上IP Tunnel的包头,然后发送给服务器
3.服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有调度器和服务器之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理
4.响应处理完毕之后,服务器使用自己的出公网的线路,将这个响应数据包发送给客户端,源IP地址还是VIP地址
**可参考  https://blog.csdn.net/ying_smile/article/details/81628176 **

 

lvs-fullnat(内核未集成)

lvs在转发数据包是,同事修改源ip及目的ip

**可参考  https://blog.csdn.net/letter_a/article/details/81324767**

 

  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 balance own router own router

 

3 lvs-调度算法

lpvs scheduler,根据是否考虑后端服务器的负载状态,可以分为两类。

静态算法:

1 RR(round robin) 轮询。

2 WRR(weighted RR)加权轮询。

3 SH (source hash) 对源地址做hash运算,将值存放到lvs中,相同的ip调度到同一台real server。

4 DH(destination hash) 当目的地址相同时,调度到同一台real server。常用于正向代理服务器。例如缓存服务器。

动态算法:

1 LC (least connections)最少连接。

overhead=activeconns*256+inactiveconns

2 WLC 加权LC (系统默认的调度算法)

overhead=(activeconns*265+inactiveconns)/weight

3 SED(shortest expection delay)  WLC在系统刚开始工作时,连接为0,系统无法选择分配对象,针对这个问题,SED遵循高权重优先。

overhead=(activeconns+1)256/weight

4 NQ (nerver queue)第一轮平均分配,后续遵循SED。

5 LBLC 动态的DH算法,根据负载状态实现正向代理。

6 LBLCR 解决LBLC负载不均衡问题。

**DH LBLC LBLCR多为宽带运营商使用**

 

六 lvs-实验

1 相关命令

ipvsadm -A|E -t|u|f service -S scheduler

ipvsadm -a|e -t|u|f service -r realserver -g(dr)|m(nat)|i(tun) -w

ipvsadm -C  //清除规则

ipvsadm -Ln 查看

      -- numberic,-n //以数字的形式输出端口号和地址

      --exact //扩展信息,精确值。

      --connection,-c //当前lvs连接输出

      --stats //统计信息

      --rate //输出速率信息

相关文件

ipvs规则 /proc/net/ip_vs

ipvs连接 /proc/net/ip_vs_conn

保存

ipvsadm -Sn > /etc/sysconfig/ipvsadm   //将ipvs规则保存到文件中

ipvsadm -restore < /etc/sysconfig/ipvsadm //读取文件中的规则

正常情况下,每次重启服务,规则都会清除

在/usr/lib/systemd/system/ipvsadm.service中定义了服务启动和停止时读取和保存ipvs规则的方式。

      

2 实验-nat

 

1 client为物理机,windows系统。lvs服务器及rs服务器为虚拟机centos7.2系统。

2 虚拟机网卡均为桥接,按照规划图设置好ip,关闭防火墙及selinux。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ip配置完成后,发现rs可以ping通10.10.23.177,但是无法ping通10.10.23.88。分析发现原因为client上没有到30段的路由,在10.10.23.88上添加30段的路由(10.10.23.177)后解决,在实际工作中,并不需要此配置。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3 配置路由转发。ip_forward

路由转发:当主机拥有多块网卡时,期中一块网卡收到数据包,根据目的ip将数据包发往本机的另一块网卡,该网卡根据路由表发送数据包。这通常是路由器所要实现的功能。

处于安全考虑,linux系统默认是禁止数据包转发的。

实验过程中,如果关闭ip_forward,client无法ping通rs.

开启路由转发的方法:

方法一:echo 1 > /proc/sys/ipv4/ip_forward

方法二:vi /etc/sysctl.conf

  修改 net.ipv4.ip_forward = 1 //默认为0

sysctl -p //查看修改结果

或者通过 sysclt -a |grep ip_forward

4 rs1、rs2安装nginx,配置站点。index.html 内容分别为本机ip。

5 ipvsadm规则配置

ipvsadm -A -t 10.10.23.177:80 -S rr

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.100:80 -m

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.102:80 -m

6 在client上 调用cmd窗口

curl 10.10.23.177

返回结果为: 10.10.30.100(第一次访问)  10.10.30.102(第二次访问)

7 查看rs上nginx的访问日志 access.log 发现客户端ip为 cip.

 

2 实验-dr

1 实际十堰过程中,路由器用虚拟机代替,两块网卡配置路由转发ip_forward。

2 vip与rip不同网段,并且通过各自网关连接“外网”。为了让lvs与rs之间通信,启用dip。

3 rs上要匹配dip和vip(理论上vip配置在lo上或与rip同一块网卡都可以,但实际实验过程中配置在lo上遇到问题,最终配置到rip的网卡上)。

为了避免ip冲突,需要在rs修改内核参数,限制arp响应和通过级别,arp_ignore及arp_annouce。

在rs1上

ip a a 10.10.23.177/24 dev eno16777736 //添加ip地址到网卡

echo 1  > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/eno16777736/arp_annouce

在rs2上

ip a a 10.10.23.177/24 dev eno16777736 //添加ip地址到网卡

echo 1  > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore

echo 2  > /proc/sys/net/ipv4/conf/eno16777736/arp_annouce

---------------------------------------------------------

arp_ignore 

0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7:保留未使用
8:不回应所有的arp请求

arp_annouce

0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
 
思考问题:实验中遇到的client上10.10.23.177的arp信息错误问题,是否与“1:只响应目的IP地址为接收网卡上的本地地址的arp请求。”有关。
--------------------------------------------------------------

 

4 lvs规则配置

yum install ipvsadm -y

ipvsadm -A -t 10.10.23.177:80 -S rr

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.100 -g

ipvsadm -a -t 10.10.23.177:80 -r 10.10.30.102 -g

5 在client上访问站点,测试结果。

curl 10.10.23.177

 

---------------------------------------------------

此实验中避免ip冲突的几种方法:

1 在前端网关上做静态绑定。

2 在rs上使用arptables工具。

3 在rs上修改内核参数以限制arp通告及应答级别。

 

 

参考地址**https://mp.weixin.qq.com/s/0c6c738zrZIwcCEJKjlMNA**

posted @ 2019-01-28 10:15  lemonning  阅读(486)  评论(1编辑  收藏  举报