LVS集群原理与实现

LVS简介
   LVS(Linux Virtual Server)称之为linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能,LVS是一种集群(Cluster)技术,基于IP负载均衡技术和基于内容请求分发技术。它能将客户端请求均衡的分发到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
LVS三层结构
   

图片1.png

`第一层`:负载调度器,负责将客户端请求发送到后端服务器,由后端服务器执行客户端请求。
`第二层`:服务器群,执行客户端发送过来的请求。
`第三层`:共享存储,调度器可以将客户端请求分散给任何一台后端服务器,造成的问题是,
          A用户上传的图片,下载访问被调度到另一台服务器上执行,结果A用户看不到自己上传的图片,
          最好的解决办法就是使用共享存储服务器,将特定资源统一由存储服务器管理。

Cluster
   集群,为解决某个特定问题,将多台主机组合起来形成单个系统。

Cluster类型:
  LB(Loader Balancing):负载均衡
 ` HA(High Availability)`:高可用性,换句话说,就是尽可能的让服务器不出现问题,保持
长时间持久服务,对于调度器来说,也存在宕机的情况,我们需要在主调度服务器出现问题时将所
有资源转移到另一台备用的调度服务器上,保证服务的正常运行,在这个过程中所花费的时间非常少,
对于单点失败问题可以用keepalived 或 heartbeat技术来实现。
  `HPC(高性能)`:高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,
因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。
这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPCcluster的并行能力。
这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。HPC集群特别适合于在计算中各
计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其它节点计算结果的情况。

负载均衡集群的作用
   提供一种廉价的、高可用的、透明的方法,来扩展服务器的负载、增加吞吐率,加强网络数据的处理能力,提高网络的灵活性和可用性。
LVS结构
   

图片2.png

   一组服务器通过高速的局域网或者地理分布的广域网相互连接,在这些服务器的上游有一个或多个负载调度器,它负载将客户端的请求分发到下游各个真实处理请求的服务器上,对于客户端来说,其访问的就如访问了一台高可用、高性能的服务器,客户端不受服务器集群的影响而做任何操作,这对于客户端来说是透明的。

LVS实现原理
   

图片3.png

1、当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。
2、PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。
3、IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集
群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会修改数据包里的目标IP地
址及端口(端口按照不同模型来修改),并将新的数据包发往POSTROUTING链。
4、POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,
将数据包最终发送给后端的服务器。

LVS集群术语

  VS(调度器):Virtual Server、Director  Server(DR)、 Dispatcher、Loader Balancer。
  RS(后台真正工作的服务器):Real Server。
  CIP:客户端IP。
  VIP:虚拟IP,面向用户的IP,作为用户请求的IP(VS外网IP)。
  DIP:用于内部主机通讯的IP(VS内网IP)。

LVS集群类型
 命令行工具

ipvsadm:规则管理器,用于管理集群服务及Real Server。
ipvs:工作于内核空间netfilter中INPUT钩子框架上。

 LVS集群类型
   LVS-NAT:修改请求报文中的IP,多目标IP的DNAT。
   LVS-DR:操纵封装新的MAC地址。
   LVS-TUN:在源IP报文请求之外再添加一个新的IP报文首部。
   LVS-FULLNAT:修改请求中的源IP和目标IP。
LVS-NAT模型
   通过地址转换的方法来实现任务调度,首先调度器接收客户端发过来的请求,而后根据算法来实现将该请求分发到哪一台后台服务器中并将目标地址及目标端口修改为RS的RIP及port,从而实现转发。
   1、RIP和DIP应在同一IP网段,且应使用私网地址,RS网关要指向DIP。
   2、请求报文和响应报文都要经过调度器,调度服务器压力过大。
   3、支持端口映射,可以修改请求报文的port。
   4、VS必须是Linux系统,RS可以是任意OS系统。
   

图片4.png

   
图片5.png

`1、 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP `
`2、 PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链`
`3、 IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP `
`4、 POSTROUTING链通过选路,将数据包发送给Real Server`
`5、 Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP `
`6、 Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP`

LVS-DR模型
   Director Routing,直接路由,LVS的默认模式,应用子广泛,通过请求报文重新封装一个MAC报文首部进行转发,源MAC是DIP所在的接口MAC地址,目标MAC是挑选出来的RIP所在接口的MAC,源IP/PORT及目标IP/PORT均保持不变。

1、Director和RS服务器都要配置VIP。
2、确保前端路由器将目标IP为VIP的请求报文发往Director。
(1)在前端网关做静态绑定。
(2)在RS上修改内核参数以限制arp通告及应答级别。
     /proc/sys/net/ipv4/conf/all/arp_announce
     /proc/sys/net/ipv4/conf/all/arp_ignore
3、RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director。
4、RS跟Director要在同一个物理网络。
5、请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client。
6、不支持端口映射。
7、RS可以使用大多数OS系统。
图片6.png

图片8.png
Source Port MAC Desc Port MAC
CIP XXXXX MACc VIP 80 MACroute1
CIP XXXXX MACroute2 VIP 80 MAClvs
CIP XXXXX MAClvs VIP 80 MACrs
VIP 80 MACrs CIP XXXXX MACroute2
VIP 80 MACroute1 CIP XXXXX MACc

当客户端发送请求,数据包通过路由器送达到Director,此时源地址为CIP、MAC为客户端服务器MAC地址,目标地址为VIP、MAC地址为Director MAC地址,Director收到请求报文根据调度规则发送给后端RS服务器,此时源IP与目标IP不变,更改源MAC与目标MAC,RS服务器收到请求报文经过处理响应给客户端,过程中不经过Director,源IP为VIP,目标IP为CIP,整个过程IP地址不变,只更改MAC地址。
LVS-TUN模型
   转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。

1、DIP, VIP, RIP都应该是公网地址。
2、RS的网关不能,也不可能指向DIP。
3、请求报文要经由Director,但响应不能经由Director。
4、不支持端口映射。
5、RS的OS得支持隧道功能。
图片9.png

图片10.png

图片11.png
客户端向VIP发送请求时,[源CIP;目的VIP],Director经过调度轮询后选择一个RS后使用隧道
技术再次封装后向RS发送【源DIP;目的RIP [源CIP;目的VIP]】,RS通过隧道收到请求后拆开
数据后得到[源CIP;目的VIP],发现目的IP为自己L0接口的IP得,后就把数据收下,找到数据后将
数据直接通过公网返还给客户端[源VIP;目的CIP].

LVS-FULLNAT模型

通过同时修改请求报文的源IP地址和目标IP地址进行转发;
    CIP <--> DIP
    VIP <--> RIP
1、VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP。
2、RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client。
3、请求和响应报文都经由Director。
4、支持端口映射。

ipvs scheduler

根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种
静态方法:仅根据算法本身进行调度;
        RR:roundrobin,轮询;
        WRR:Weighted RR,加权轮询;
        SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定;
        DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡;
    动态方法:主要根据每RS当前的负载状态及调度算法进行调度;
        Overhead=       
        LC:least connections
            Overhead=activeconns*256+inactiveconns
        WLC:Weighted LC
        Overhead=(activeconns*256+inactiveconns)/weight
        SED:Shortest Expection Delay
        Overhead=(activeconns+1)*256/weight
        NQ:Never Queue            
        LBLC:Locality-Based LC,动态的DH算法;
        LBLCR:LBLC with Replication,带复制功能的LBLC

Ipvsadm命令

程序包:ipvsadm
    Unit File: ipvsadm.service
    主程序:/usr/sbin/ipvsadm
    规则保存工具:/usr/sbin/ipvsadm-save
    规则重载工具:/usr/sbin/ipvsadm-restore
    配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm命令:
    核心功能:
    集群服务管理:增、删、改;
    集群服务的RS管理:增、删、改;
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
    ipvsadm -D -t|u|f service-address
    ipvsadm -C
    ipvsadm -R
    ipvsadm -S [-n]
    ipvsadm -a|e -t|u|f service-address -r server-address [options]
    ipvsadm -d -t|u|f service-address -r server-address
    ipvsadm -L|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
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]
选项:
Lvs类型:
            -g: gateway, dr类型
            -i: ipip, tun类型
        -m: masquerade, nat类型
        -w weight:权重;
清空定义的所有内容:
ipvsadm -C
查看:
ipvsadm -L|l [options]
--numeric, -n:以数字形式输出IP和端口号 
        --exact:扩展信息,精确值。
            --connection, -c:当前ipvs连接输出。
        --stats:统计信息。
        --rate :输出速率信息。
保存和重载:
保存:
  ipvsadm -Sn > /etc/sysconfig/ipvsadm
  ipvsadm -save -n > /etc/sysconfig/ipvsadm
建议保存至/etc/sysconfig/ipvsadm中,可以查看/usr/lib/systemd/system/ipvsadm.service文件,
在关闭ipvsadm服务会自动保存ipvs规则至/etc/sysconfig/ipvsadm文件中,
启动时会从该文件中加载,如图12。
重载:
    ipvsadm -S = ipvsadm-save
    ipvsadm -R = ipvsadm-restore

图片12.png

负载均衡集群设计时要注意的问题
   1、是否需要会话保持;
   2、是否需要共享存储;
   共享存储:NAS, SAN, DS(分布式存储)
   数据同步:
FWM:FireWall Mark

Mark target:可用于给特定的报文打标签
--set-mark value:value可以是0xffff格式,表示十六进制数字。
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度
实现方法:
1、在Director主机上打标机:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports -j MARK --set-mark NUMBER
2、在Director主机上基于标机定义集群服务:
ipvsadm -a -f number [options]

ldirectord

监控和控制LVS守护进程,可管理LVS规则。
包名:ldirectord-3.9.5-3.1.x86_64.rpm
ldirectord配置示例:
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes          #是否启动自动加载,yes为是,no为否
logfile="/var/log/ldirectord.log"   #日志存放路径
#logfile="local0"
#emailalert="[email protected]"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no                #集群服务down时,yes表示删除,no时权重为0
virtual=10
        real=10.0.0.11 gate         #Real Server的IP地址
        real=10.0.0.12 gate
#       real=192.168.6.6 gate
        fallback=127.0.0.1:80 gate  #Sorry Server
        service=http
        scheduler=rr            #调度方法
#       #persistent=600     #保持连接的时间,单位为s秒
#       #netmask=255.255.255.255
        protocol=fwm            #
        checktype=negotiate
        checkport=80
        request="index.html"    #
        receive="RS"        #搜索关键字符,判断RS服务是否出现故障
#       virtualhost=x.y.z

实验

LVS-NAT模型:
  实验环境:
    VM12
    Centos7.4
    主机数:4台
    网络拓扑
图片13.png

地址规划:

CIP:172.10.0.100
VIP:172.10.0.200
DIP:192.168.30.100
RS1:192.168.30.101
RS2:192.168.30.102

步骤:
  1)客户端地址:
    这里Client的网关无需指向VIP,至需要配置IP地址就行


14.png

  2)Director(调度器)地址分配:
    在VM添加两块网卡,Client与VIP在同一个网段,DIP与RS在同一个网段(这里可以不再同一个网段,建议在一个网段),下面为两个网卡的IP地址,ifcfg-ens37为DIP,ifcfg-ens38位VIP

[root@centos7 network-scripts]#cat ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT="yes"
IPADDR=192.168.30.99
PREFIX=24
DNS1=114.114.114.114
[root@centos7 network-scripts]#cat ifcfg-ens38
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens38
DEVICE=ens38
ONBOOT="yes"
IPADDR=172.10.0.200
PREFIX=16
DNS1=114.114.114.114
图片14.png

  3)RS地址分配
    在为RS服务器添加地址时,需要将网关指向DIP,下面是RS1服务的ip

[root@localhost network-scripts]#cat ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT="yes"
IPADDR=192.168.30.101
PREFIX=24
GATEWAY=192.168.30.100          #网关指向DIP
图片16.png

   RS2服务器IP

[root@localhost network-scripts]#cat ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT="yes"
IPADDR=192.168.30.102
PREFIX=24
GATEWAY=192.168.30.100    #网关指向DIP
图片17.png

  4)安装httpd服务

1、yum install -y httpd(RS1跟RS2都安装)
2、构建默认网站    
[root@rs1 ~]#echo Real Server1 > /var/www/html/index.html
[root@rs2 ~]#echo Real Server2 > /var/www/html/index.html
3、RS1与RS2分别启动httpd服务
Systemctl start httpd.service

  5)在VS服务器上安装ipvsadm程序
    [root@lvs ~]#yum install -y ipvsadm
    测试一下是否能ping同后端服务器

图片18.png

  5)搭建ipvs集群规则
图片19.png

  6)测试
图片21.png

    实验成功,以轮询的方式将请求调度到后端的RS服务器上。
LVS-DR模型
  实验环境:
  VM12
  Centos7.4
  主机数:5台
  网络拓扑:
图片22.png

  地址规划
23.png

  客户端IP:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT="yes"
IPADDR=172.10.0.100
PREFIX=16
DNS1=114.114.114.114

图片23.png

  路由器地址:
    1、添加rip2
    [root@route ~]#ip addr add 10.0.0.10/8 dev ens37:1
图片24.png

    开启路由转发功能:
图片25.png

  LVS地址分配:
图片26.png

  注意:LSV-NAT中LVS服务器需要开启路由转发功能,DR模型不需要
  RS服务器地址分配:
    1、RS服务器设置限制apr通告及应答级别,避免地址冲突

[root@RS1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    2、RS1地址分配及网关设置


图片27.png

图片28.png

  3、RS2地址分配及网关设置


图片29.png

  添加ipvs规则:
[root@lvs ~]#ipvsadm -A -t 10.0.0.11:80 -s rr
[root@lvs ~]#ipvsadm -a -t 10.0.0.11:80 -r 192.168.30.101
[root@lvs ~]#ipvsadm -a -t 10.0.0.11:80 -r 192.168.30.102

图片30.png

  测试:
图片31.png

  测试成功,表示DR模型环境搭建成功
基于ldirectord生成集群策略
    在后端RS服务器中,如果有一台服务器出现故障,为了避免不往有故障的服务器进行调度,可以使用ldirectord工具来实现往一台机器上调度。

1、安装ldirectord-3.9.5-3.1.x86_64.rpm包
文件:     
/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.5
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf           #配置文件模板
/usr/share/man/man8/ldirectord.8.gz
2、复制/usr/share/doc/ldirectord-3.9.5/ldirectord.cf到/etc/ha.d中
示例:
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="[email protected]"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no

# Sample for an http virtual service
virtual=192.168.30.200:80
virtual=10.0.0.11:80            #VIP
        real=192.168.30.101:80 gate #RIP
        real=192.168.30.102:80 gate
        fallback=127.0.0.1:80 gate  #Sorry Server
        service=http
        scheduler=rr
#       #persistent=600
#       #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        receive="Real"
删除LVS服务器上的ipvs规则,看其效果:
图片32.png

  启动[root@lvs ~]#systemctl start ldirectord服务
  测试:


图片33.png

图片34.png

  这里自动生成ipvs规则,然后继续测试宕到一台RS服务器,看调度情况:


图片35.png

图片36.png

  自动将另一台RS服务器的策略删除,只调度到一台服务器上。此时基于ldirectord工具实现了自动生成调度策略。

你可能感兴趣的:(LVS集群原理与实现)