☞LVS

LVS



Linux Virtual Server 传输层的包转发工具,通过VS对RS的调度实现负载均衡:

  • VS:Virtual Server(Director、Dispatcher、Balancer);

  • RS:Real Server(upstream server,backend server);

LVS工作在传输层,主要根据目标端口进行分发,相当于4层交换机,不受应用层套接字和端口的数量的限制,而是直接把报文转发给后端服务器,并发量极高。支持TCP、UPD、ESP、AH、SCTP等协议报文的转发。相同功能的模拟传输层进行任务调度的应用还用:nginx(stream)、haproxy(mod tcp)等。

相比较而言: 
Nginx作为反向代理服务器实现负载均衡时工作应用层,因此只能模拟传输层进行任务调度,主要根据请求模型的分类进行分发,例如把SELECT语句分发至一台MySQL服务器,把php请求分发至fpm服务器等。这类应用层的均衡调度器主要有:nginx(upstream)、httpd(balance)、haproxy(mod http)、ats、perlbal、mysql-proxy等。

在与客户端通信的过程中常常涉及到会话追踪的需求,比如用户在不同的终端上完成的一次购物行为等待。但是http协议本身是无状态的,服务器与客户端如何实现会话追踪,尤其是集群服务如何实现Session保持成为一大问题。集群服务的Session保持方案主要由以下3种:

  1. Session Stick:Source IP or Cookie实现在单台服务器时间最基本的Session保持;

  2. Session replication:Session Cluster实现在多台服务器之间复制所有Session;

  3. Session Server:由独立的Session服务器实现Session同步和共享;

LVS工作类型

LVS有两部分组成:ipvsadm/ipvs,分别是用户空间的规则定义和Real Server管理工具;内核空间的调度分发组件;

  • ipvsadm:用户空间的规则定义和Real Server管理工具;

  • ipvs:工作于内核空间的Netfilter的INPUT Function之上,请求报文经路由到达用户空间进程之前,ipvs改变了报文的流向直接转给POSTROUTING,并根据调度算法选择一个Real Server,并对请求报文做相应的修改之后转发给Real Server。Director与Real Server之间的packet-forwarding-method有4种: 

    1. lvs-nat:修改请求报文的目标IP,报文的收发都由Director完成

    2. lvs-dr:封装新的MAC地址,响应报文有Real Server直接响应给客户端

    3. lvs-tun:在原请求报文中新加一个IP首部,远程

    4. lvs-fullnat:同时修改请求报文的源和目标IP

LVS NAT

多目标的DNAT,通过修改请求报文的目标IP地址和PORT实现以Director为网关的调度与分发,正是因为RS的网关为Director,所以无需修改源IP,且Director和RS必须通过交换机相连接。可概括为以下特点:

  1. RIP和DIP属于同一网络,且使用私网地址,Real Server的网关必须指向DIP(保证响应报文经由Director);

  2. 请求和响应文本都经由Director;在高负载场景中,Director很可能成为系统性能瓶颈;

  3. Director主机为Linux系统,Real Server可以是任意支持集群服务的OS;

  4. 支持端口映射;

LVS DR(默认)

Direct Routing 直接路由,对请求报文封装一个MAC地址,根据调度算法广播发送给其中一台Real Server,并且由Real Server直接响应客户端请求。可概括为以下特点:

  1. Real Server的RIP可使用私网地址,也可使用公网地址,但Director与Real Server直接不能经过路由

  2. Real Server与Directory通过物理交换机连接

  3. 请求报文经由DIrector,但响应不经由Director,而是由Real Server直接发往Client

  4. 不支持端口映射

Direct Routing带来的问题

每个Real Server与VS共用VIP才能实现Real Server直接响应Client,但是多块网卡共用VIP是不被允许的,可能会造成路由器把请求报文直接给Real Server而不经过Director调度。因此,Real Server必须把VIP隐藏起来,或者通过设定路由器策略及ARP广播策略,以实现只是Director接收请求以完成调度,且Real Server直接响应客户端的工作方式:

  • 方案一:在前端网关做静态绑定,依赖于路由器设定,一般不可取

  • 方式二:禁止广播,需arptables组件,较难适用

  • 方式三:内核开启应答与通告级别(arp_annouce、arp_ignore)设定,避免内核使用不在对应网卡上的ip地址进行交叉通告,限制内核仅对对应接口的ARP请求做出响应,把VIP绑定在 lo 网卡上,达到隐藏的效果。这样在Director封装MAC后广播发送给Real Server,并且由Real Server解包的报文中目标地址VIP就可以被Real Server的lo网卡所绑定的VIP相对应,不至于被丢弃。Real Server发送报文时则先经过 lo 网卡转发至物理网卡再发送出去,原因是 Linux 内核会根据响应报文的源IP选择网卡,因此,回应报文必须先经过 lo 网卡,再由物理网卡发送。

限制响应模型的内核参数

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

  • arp_ignore: 
    0:默认值,内核使用任意地址响应网卡的 
    1:仅在请求的目标IP配置在本地主机的收到请求报文接口

LVS TUN

由于DR类型的Director与Real Server工作在同一物理网络上,而LVS TUN则针对Real Server工作在不同网络中的情况,利用IP隧道(把报文经公网IP再次封装)将请求报文送达至远程Real Server,并实现有Real Server直接响应客户端的一种LVS类型。

LVS TUN的转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在源IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文通过路由分发给Real Server。可概括为以下特点:

  1. DIP,VIP,RIP都是公网地址(Director通过公网给Real Server分发请求);

  2. Real Server的网关不能也不可能指向DIP(保证响应报文经由Director发出);

  3. 请求报文要经由Director,但响应报文不经由Director;

  4. 不支持端口映射;

  5. Real Server的内核需支持隧道功能;

LVS FULLNAT

与 NAT 类型不同的是 FULLNAT 则是同时修改请求报文的源IP与目标IP,经过路由分发给RS,响应报文也经过路由到达Director再发出,为了实现路由,要把目标地址和源地址改成DIP与RIP。此外FULLNAT也支持端口映射,但需做内核修补,LVS默认不支持此模型。可概括为以下特点:

  1. VIP是公网地址,RIP与DIP是私网地址,且通常不在同一网络,但必须能够路由

  2. Director的VIP接收Client的CIP请求,但响应报文也需Director转发给Client的RIP;

  3. Real Server收到请求报文源IP是Director的DIP(CIP –> DIP、VIP –> RIP),响应目标IP也是Director的DIP;

scheduling-method

ipvs的根据是否需要考虑Real Server的负载,可分为静态调度算法动态调度算法

ipvs默认采用WLC调度算法,是较好的一种调度算法。其既考虑到活动与非活动connection的比重,又考虑到Real Server本身性能的权重,是一种较为综合、均衡、通用的调度算法;

静态调度算法

仅根据算法本身,轮询Real Server分发请求;

  1. RR(Roundrobin),自上而下轮询Real Server,逐一分发;

  2. WRR(Weighted RR),根据Real Server的权重进行分发,能够分析一段时间内Real Server的处理能力对其进行加权;

  3. SH(Source Hashing),对源IP地址hash,将来自同一IP地址的请求始终发往一台Real Server,实现Session Stick,其算法是基于WRR实现的; 
    此外,设置调度时的timeout,也可实现类似的会话保持功能;

  4. DH(Destination Hashing),对目标IP地址hash,将发往同一目标地址的请求始终发送给一台Real Server,一般是缓存服务器,以负载均衡内网用户对外部服务器的请求;

动态调度算法

根据算法本身以及实时Real Server负载状态(Overhead),分发给负载较小的Real Server;

  1. LC(least connections),Overhead=activeconns*256+inactiveconns;

  2. WLC(Weighted LC)默认调度算法,Overhead=(acriveconns*256+inactiveconns)/weight;考虑非活动连接的负载

  3. SED(Shortest Expection Delay),最短期望延时,弱化非活动连接的负载,Overhead=(activeconns+1)*256/weight,活动连接相同(包括0个连接),优先分配给权重大的Real Server,但不公平,会导致权重小的Real Server空闲;

  4. NQ(Never Queue),每台Real Server最少分发一个conn,再根据SED调度;

  5. LBLC(Locality-Based LC),动态的DH算法,考虑Real Server的负载,但损失命中率;

  6. LBLCR(LBLC with Replication),带复制功能的LBLC,在考虑Real Server负载的情况下,优先从另一Real Server中复制缓存;

CentOS 7 中的ipvs组件

RHEL 7系统的内核中默认已经编译了ipvs,可通过查看发行版编译内核时的config文件是否有相关选项:

grep -i -C 10 ipvs /boot/config-xxx.x86_64

# IPVS transport protocol load balancing support
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

# IPVS scheduler
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

安装ipvsadm程序

yum -y install ipvsadm
rpm -ql ipvsadm

主要文件

Unit File:/usr/lib/systemd/system/ipvsadm.service 
程序文件:/usr/sbin/ipvsadm/usr/sbin/ipvsadm-restore,/usr/sbin/ipvsadm-save

ipvsadm命令

用法与iptables类似,可分为管理集群服务管理Real Server查看当前状态规则保存等几个部分的命令选项。

使用ipvs应开启内核的ip_forward功能;

ipvs支持调度防火墙的MARK捆绑,可同时对一组或单个应用的设定集群服务;

ipvs有两种方式实现 Session 保持功能,原理是让客户端可以持续连接同一台Real Server;一种是设定默认为300s的persistent,另一种是使用SH调度算法;前一种可在任意一种调度算法上实现会话保持;such as SSL or FTP where it is important that clients consistently connect with the same real server.

ipvsadm -h
 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe peReal Serveristence_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] #清空packet, byte and rate counteReal Server
 ipvsadm --set tcp tcpfin udp
 ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
 ipvsadm --stop-daemon state
 ipvsadm -h

管理集群服务:

  1. 增加、修改Director及调度算法

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
  1. 删除Director,关闭lvs:

    ipvsadm -D -t|u|f service-address
       -t|u|f service-address
       -t:TCP协议的端口
       -u:UDP协议的端口
       -f:firewall MARK,通过防火墙对相同服务的不同端口标记为同一数字

管理Real Server

  1. 增加、修改Real Server及工作模型:

ipvsadm -a|e -t|u|f service-address -r server-address [options]

[options]:
   lvs类型:
       -g:gateway,dr类型
       -l:ipip,tun类型
       -m:masquerade,nat类型
   权重:
   -w weight,权重,wrr,wlc使用
  1. 删除Real Server:

ipvsadm -d -t|u|f service-address -r server-address
   server-address:
       RemotAddress[:port]   #默认与请求服务的端口相同
       #dr、tun不支持端口转发,nat、fullnat支持端口转发

查看状态 
不反解的ip与端口、权重、活动连接、非活动连接、精确显示数值、当前的IPVS连接、统计数据、每秒连接数、接收、发送字节数等

ipvsadm -L|l [options]
   --numeric,-n:numeric output of addresses and ports
   --exact:expand numbeReal Server (display exact values)
   --connection,-c:output of current IPVS connections
   --stats:output of statistics information
   --rate:output of rate information

清空内容

ipvsadm -C  #清空所有集群服务的定义,造成集群服务立即断开
ipvsadm -Z [-t|u|f service-address] #清空单集群或所有集群的统计数据

保存和重载

ipvsadm -R  #接收标准输入
ipvsadm -S [-n] #保存在/etc/sysconfig/ipvsadm 文件中

配置集群服务

man ipvsadm通俗易懂的配置示例。主要配置两部分的规则: 
集群服务 + Real Server的配置,配置前需要准备好以下几项条件:

  1. 同步时间:建立ntp服务器或使用chrony同步某一台主机的时间

vi /etc/chrony.con
   #注释默认设置,修改为某一主机的地址

systemctl restart chronyd.service
chronyc sources
  1. Director开启包转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward

  2. RS的默认网关指向要正确

  3. lvs之前先测试每台Real Server提供的服务是否正常

NAT方法示例

nat.jpg

可能用到的命令:

  1. 临时修改网卡地址:ifconfig eth0 IP/PRX up

  2. 增加默认路由:route add defaule GATEWAY

  3. 禁用某块网卡:ip link set down ethX

使用rr调度算法轮询RS

ipvsadm -A -t 10.1.253.29:80 -s rr
ipvsadm -a -t 10.1.253.29:80 -r 192.168.22.15 -m
ipvsadm -a -t 10.1.253.29:80 -r 192.168.22.16 -m

ipvsadm -Ln
for i in {1..5}; do curl http://10.1.253.29
#结果为交替响应

使用wrr调度算法静态加权轮询

ip -E -t 10.1.253.29:80 -s wrr
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.15  -m -w 1
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16  -m -w 1

for i in {1..5}; do curl http://10.1.253.29
#结果为rs1:rs2=2:1

使用sh调度算法实现持久连接

ip -E -t 10.1.253.29:80 -s sh
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16  -m -w 2
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16  -m -w 1

for i in {1..5}; do curl http://10.1.253.29
#结果为该客户端ip只由某一RS响应

使用wlc调度算法实现动态负载加权

ip -E -t 10.1.253.29:80 -s wlc
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16  -m -w 1
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16  -m -w 1
#结果为2:1

DR方法示例

通用的Real Server配置

#
#Real Server
#
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_annouce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_annouce

ifconfig lo:0 10.1.253.11 netmask 255.255.255.255 broadcast 10.1.253.11 up
route add -host 10.1.253.11 dev lo:0

负载均衡http服务

dr.jpg

#
#Director Server
#
ifconfig eno16777736:0 10.1.253.11 netmask 255.255.255.255 broadcast 10.1.253.11 up

ipvsadm -A -t 10.1.0.11:80 -s wlc
ipvsadm -a -t 10.1.0.11:80 -r 10.1.0.51 -g -w 1
ipvsadm -a -t 10.1.0.11:80 -r 10.1.0.69 -g -w 2

负载均衡mysql服务

ipvsadm -E -t 10.1.0.11:3306 -s wrr
ipvsadm -e -t 10.1.0.11:80 -r 10.1.0.51 -g -w 1
ipvsadm -e -t 10.1.0.11:80 -r 10.1.0.69 -g -w 2

负载均衡FWM捆绑的服务

FWM(FireWall Mark):借助防火墙标记分类报文,可将多个不同应用使用同一个集群服务jingx当做一类请求进行轮询

iptables -t mangle -A PREROUTING -p tcp -d 10.1.253.11 -m multiport --dports 80,443 -j MARK --set-mark 01

iptables -t mangle -vnL

ipvsadm -A -f 01 -s wrr
ipvsadm -a -f 01 -r 10.1.253.51 -g -w 1
ipvsadm -a -f 01 -r 10.1.253.69 -g -w 1

lvs persistence(持久连接)

lvs通过定义集群服务的persistent时间实现持久连接,可在任一的调度算法中实现持久连接。其不同于SH算法,而是在timeout时间内始终把同一客户端IP请求分发给某一Real Server。根据需求,LVS可实现以下3种类型的持久连接:

  1. 每端口持久:每集群服务单独定义,各自持久

  2. 每FWM持久:基于防火墙标记定义持久连接,可实现将多个端口上的应用统一调度,即所谓的port Affinity;

  3. 每客户端持久:基于0端口定义集群服务,将客户端对所有应用请求都调度至Real Server,且可使用持久连接进行Session绑定

#每端口持久
ipvsadm -A -t 10.1.253.11:80 -s rr -p 60
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1

#每FWM持久
ipvsadm -A -f 01 -s rr -p 360
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1

#每客户端持久
ipvs -A -t 10.1.253.11:0 -s wrr -p
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1

规则保存与恢复

#获取帮助
man ipvsadm-save
cat /usr/lib/systemd/system/ipvsadm.service

#保持保存
ipvsadm -S > /etc/sysconfig/ipvsadm
ipvsadm-save > /etc
/sysconfig/ipvsadm
systemctl stop ipvsadm.service          #自动保存规则

#规则恢复
ipvsadm -R < /etc/sysconfig/ipvsadm
ipvsadm-restore < /etc
/sysconfig/ipvsadm
systemctl start ipvsadm.service

附录

DR方法的Director配置脚本

#/bin/bash
#
#setting for the Director.

iface='eth0:0'
vip='10.1.253.11'
rs1='10.1.253.51'
rs2='10.1.253.69'
mask='255.255.255.255'
scheduler=$2
method='-g'
port='3306'
weight=$3

case $1 in
   start)
   ifconfig $iface $vip netmask $mask broadcast $vip up
   iptables -F #don't compatibility with Netfilter
   ipvsadm -A -t ${vip}:$port -s ${scheduler:=wlc}
   ipvsadm -a -t ${vip}:$port -r ${rs1} $method -w ${weight:=1}
   ipvsadm -a -t ${vip}:$port -r ${rs2} $method -w 1
   ;;
   stop)
   ipvsadm -C
   ifconfig $iface down
   ;;
   *)
   echo "Usage $(basename $0) start|stop [scheduler] [weight]"
   exit 1
   ;;
esac

运行帮助

[root@cent7]~>bash dr_vs.sh
Usage dr_vs.sh start|stop [scheduler] [weight]

DR方法的Real Server配置脚本

#!/bin/bash
#setting for real server.
vip='10.1.253.11'
mask='255.255.255.255'

case i 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 lo:0 $vip netmask $mask broadcast $vip up
   route add -host $vip dev lo:0
   ;;
   stop)
   ifconfig lo:0 down
   route del -host $vip
   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 start|stop"
   ;;
esac

原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/56303

(0)
hellochelloc
上一篇 2016-10-26
下一篇 2016-10-26

相关推荐

  • puppet部署多台服务器

    利用puppet实现自动化部署 配置前准备:   图中:蓝线表示各个服务器之间通信      红线表示puppetmaster主机向各个agent主机部署信道 A主机puppet-master主机:192.168.126.129 B主机做两种服务:keepalived高性能和nginx反代  &nb…

    2017-07-23
  • 常见RAID总结

    RAID浅析 目录索引 一、定义 二、特点 三、常用RAID级别      四、RAID实现方式 五、实际环境测试 一、定义: 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。 独立磁盘冗余阵列(RAID,redundant array…

    Linux干货 2016-04-12
  • LVS+keepalived高可用web集群搭建的疑惑

    参考文章是这一份:http://ox0spy.github.io/debian/2014/06/26/setup-lvs-and-keepalived-on-debian/ 一:操作系统与ip               ip地址形式:19…

    Linux干货 2016-02-14
  • 对防火墙的初步认识

      防火墙,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。    目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7…

    Linux干货 2017-06-15
  • 探索处理文本工具“sed”的相关奥妙

    一:sed工具 1,set的介绍:sed是一种流编辑器,它一次处理一行内容。处理时,把当前 处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断…

    2017-08-26
  • 用户和组管理

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@suywien ~]# who | cut -d ‘ ‘ -f1 | uniq -c 2 root [root@suywien ~]# 2、取出最后登录到当前系统的用户的相关信息。 [root@suywien ~]# who | tail -1 | cut…

    Linux干货 2018-03-18