内容:

1、lvs的概念

2、lvs的工作过程

3、lvs的类型

4、lvs的调度方法

5、ipvsadm的使用


一、lvs

LVS(Linux Virtual Server)是前阿里巴巴首席科学家章文嵩博士在大学期间的一款开源的负载均衡软件, 可实现四层的负载均衡。

首先,lvs工作在传输层,lvs的架构和iptables类似,lvs由ipvsadm/ipvs组成,其中ipvsadm工作在用户空间

lvs的术语:

vs:virtual server,director

rs:real server 

CIP:client IP

VIP:virtual server IP

DIP:ditecter IP(connect with rs)

RIP:real server IP

用户请求的IP一定是VIP,否则vs就失去了负载均衡的调度意义


二、lvs的工作过程

lvs的结构以及使用方法_集群

三、lvs的类型

lvs有四种模型,其中前三种是通用的标准:

(1)lvs-nat(DNAT)

(2)lvs-dr

(3)lvs-tun

(4)lvs-fullnat(SANT、DNAT)(淘宝内部研发的模型,并非lvs标准的模型,要使用该模型要打上专门的补丁)


LVS NAT的特性(实质是多目标的DNAT)

1、RS应该使用私有地址;

2、RS的网关的必须指向DIP;

3、RIP和DIP必须在同一网段内;

4、请求和响应的报文都得经过Director;在高负载场景中,Director很可能成为系统性能瓶颈;

5、支持端口映射;

6、RS可以使用任意支持集群服务的OS;

lvs-nat:工作流程如图:

lvs的结构以及使用方法_lvs_02


LVS DR类型的特性:

1、RS可以使用私有地址;但也可以使用公网地址,此时可以直接通过互联网连入RS以实现配置、监控等;

2、RS的网关一定不能指向DIP;

3、RS跟Dirctory要在同一物理网络内(不能由路由器分隔,因为VS通过封装MAC地址到RS);

4、请求报文经过Directory,但响应报文一定不经过Director

5、不支持端口映射;

6、RS可以使用大多数的操作系统;

由于DR类型中,VS、RS的VIP都是一样,如果在同一网段内会造成地址冲突,因此要解决地址冲突有一下三种方法:

禁止RS响应对VIP的ARP广播请求:

1、在前端路由上实现静态MAC地址VIP的绑定;

前提:得有路由器的配置权限;

缺点:Directory故障转时,无法更新此绑定;

2、arptables

前提:在各RS在安装arptables程序,并编写arptables规则

缺点:依赖于独特功能的应用程序

3、修改Linux内核参数

前提:RS必须是Linux;

缺点:适用性差;


两个参数:

arp_announce:定义通告模式

arp_ignore:定义收到arp请求的时响应模式

配置专用路由,以使得响应报文首先通过vip所配置的lo上的别名接口

lvs-dr:工作流程如图

lvs的结构以及使用方法_集群_03

lvs-tun:IP隧道

1、RIP、DIP、VIP都得是公网地址;

2、RS的网关不会指向也不可能指向DIP;

3、请求报文经过Directory,但响应报文一定不经过Director;

4、不支持端口映射;

5、RS的OS必须得支持隧道功能;

lvs-tun:工作流程如图:也是基于lvs-dr的模型,只不过不同的是,rs和vs不必在同一个物理的网络(实现物理冗余),而是通过隧道技术进行vs和rs间的通信

        lvs的结构以及使用方法_集群_04


lvs-fullnat:同时修改源IP和目标IP来进行转发

特性:

1、VIP是公网IP,DIP和RIP是私网地址,且通常不在同一网络中,但需要经路由器互通

2、RS收到的请求报文源IP是DIP,因此响应报文直接响应给DIP

3、请求和响应的报文都经由DIP,因此vs需要承受较大的压力

4、支持端口映射

四、lvs的调度方法

lvs scheduler:lvs调度

LVS的调度方法可以分为静态方法和动态方法:

静态方法:仅根据算法本身进行调度,并没有考虑RS的负载情况

rr: Round Robin 路由轮询

wrr: Weighted RR 加权轮询

sh: source hashing 源地址哈希,主要作用是保持session,使同一个客户端被调度到之前访问的同一个RS,所以需要保持会话时才使用该调度方法

dh: destination hashing:目标地址哈希


动态方法:根据算法及RS当前的负载状况

lc: Least Connection最少连接

Overhead=Active*256+Inactive

结果中,最小者胜出;

wlc: Weighted LC 加权的最少连接

Overhead=(Active*256+Inactive)/weight

结果中,最小者胜出

sed: Shortest Expect Delay 最短期望延时

Overhead=(Active+1)*256/weight

结果中,最小者胜出

nq: Nerver Queue 永不排队,sed算法的改进,第一轮时每个都要响应一次

lblc: Locality-based Least Connection

dh+lc

lblcr: Replicated and Locality-based Least Connection,带复制的lblc

其中wlc算法最为通用

既然是负载均衡调度,我们也知道,http协议是无状态的,那么就要考虑一个问题,如果用户被调到不同RS时,其访问的信息怎么同步:

负载均衡中Session持久机制:

1、session sticky绑定:始终将同一个请求者的连接定向至同一个RS(第一次请求时仍由调度方法选择);没有容错能力,有损均衡效果;SH算法

2、session cluster复制:在RS之间同步session,因此,每个RS持集群中所有的session;对于大规模集群环境不适用;

3、session server服务器:利用单独部署的服务器来统一管理session; 


五、ipvsadm/ipvs的使用:

(1)首先要查看内核是否已经装有ipvs的模块或功能,如果没有需要重新编译内核

[23:13 root@centos6.8~]# cat /boot/config-2.6.32-642.el6.x86_64 |grep -A 10 -i 'ipvs'
# 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
--
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set

(2)安装ipvsadm的客户端使用包

[23:21 root@centos6.8~]# yum install -y ipvsadm

ipvsadm的命令:

ipvsadm

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

        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 [-g|i|m] [-w weight] [-x upper] [-y lower]

        ipvsadm -d -t|u|f service-address -r server-address

        ipvsadm -L|l [options]

        ipvsadm -Z [-t|u|f service-address]


(3)可以讲命令安装一定的功能分类:

    集群服务相关:

   -A: 添加一个集群服务

    -t: tcp

    -u: udp

    -f: firewall mark,通常用于将两个或以上的服务绑定为一个服务进行处理时使用;


    service-address:

    -t VIP:port

    -u VIP:port

    -f firewall_mark


    -s 调度方法,默认为wlc


    -p timeout: persistent connection, 持久连接


   -E:修改定义过的集群服务


   -D -t|u|f service-address:删除指定的集群服务


RS相关:


-a:向指定的CS中添加RS

-t|-u|-f service-address:指明将RS添加至哪个Cluster Service中


-r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口


LVS类型:

-g: Gateway, DR

-i: ipip, TUN

-m: masquerade, NAT


指定RS权重:

-w


-e: 修改指定的RS属性


-d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS


清空所有的集群服务

-C


保存规则:(使用输出重定向)

ipvsadm-save 

ipvsadm -S


载入指定的规则:(使用输入重定向)

ipvsadm-restore

ipvsadm -R


查看ipvs规则等:

-L [options]

-n: 数字格式显示IP地址

-c: 显示连接数相关信息

--stats: 显示统计数据

--rate: 速率

--exact:显示统计数据的精确值


-Z: 计数器清零


FWM:FireWall Mark :借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度;

打标记方法(在Director主机):

# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 

基于标记定义集群服务:

# ipvsadm -A -f NUMBER [options]

(4)lvs persistence:持久连接

持久连接模板:实现无论使用任何算法,在一段时间内,实现将来自同一个地址的请求始终发往同一个RS;

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

port Affinity:

每端口持久:每集群服务单独定义,并定义其持久性;

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

每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,而且可使用持久连接进行绑定;

(5)保存及重载规则:

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

ipvsadm-save > /PATH/TO/IPVSADM_FILE

ipvsadm -S > /PATH/TO/IPVSADM_FILE

systemctl stop ipvsadm.service 

重载:

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

ipvsadm -R < /PATH/FROM/IPVSADM_FILE

systemctl restart ipvsadm.service