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

二、lvs的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

三、LVS的专用名词
DS:Director Server。指的是前端负载均衡器节点。
RS:Real Server。后端真实的工作服务器。
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
RIP:Real Server IP,后端服务器的IP地址。
CIP:Client IP,访问客户端的IP地址。

四、ipvsadm命令详解
ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]
ipvsadm command [protocol] service-address server-address [packet-forwarding-method] [weight options
第一条命令用于向LVS系统中添加一个用于负载均衡的virtual server(VS);第二条命令用来修改已经存在的VS的配置,service address用来指定涉及的虚拟服务即虚拟地址,server-address指定涉及的真实地址。

命令:
-A, --add-service:为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。
-E, --edit-service:修改一个虚拟服务。
-D, --delete-service:删除一个虚拟服务。
-C, --clear:清除所有虚拟服务。
-R, --restore:从标准输入获取ipvsadm命令。一般结合下边的-S使用。
-S, --save:从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。 -a, --add-server:为虚拟服务添加一个real server(RS)
-e, --edit-server:修改RS
-d, --delete-server:删除
-L, -l, --list:列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。
-Z, --zero:将所有数据相关的记录清零。这些记录一般用于调度策略。
–set tcp tcpfin udp:修改协议的超时时间。
–start-daemon state:设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4)
–stop-daemon:停止备服务器。
-h, --help:帮助。

参数:
以下参数可以接在上边的命令后边。
-t, --tcp-service service-address:指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。如果需要将端口设置为0,还需要加上-p选项(持久连接)。
-u, --udp-service service-address:使用udp服务,其他同上。
-f, --fwmark-service integer:用firewall mark取代虚拟地址来指定要被负载均衡的数据包,可以通过这个命令实现把不同地址、端口的虚拟地址整合成一个虚拟服务,可以让虚拟服务器同时截获处理去往多个不同地址的数据包。fwmark可以通过iptables命令指定。如果用在ipv6需要加上-6。
-s, --scheduler scheduling-method:指定调度算法。调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)
-p, --persistent [timeout]:设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器,通常用于ftp或者ssl中。
-M, --netmask netmask:指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。
-r, --real-server server-address:为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。
[packet-forwarding-method]:此选项指定某个真实服务器所使用的数据转发模式。需要对每个真实服务器分别指定模式。
-g, --gatewaying:使用网关(即直接路由),此模式是默认模式。
-i, --ipip:使用ipip隧道模式。
-m, --masquerading:使用NAT模式。
-w, --weight weight:设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持(这点和直接把某个真实服务器删除时不同的)。
-x, --u-threshold uthreshold:设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。
-y, --l-threshold lthreshold:设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。(PS:笔者以为此设定可能是为了防止服务器在能否接收连接这两个状态上频繁变换)
–mcast-interface interface:指定使用备服务器时候的广播接口。
–syncid syncid:指定syncid,同样用于主备服务器的同步。

五、LVS NAT模式

centos6录制屏幕 centos7 lvs_IP


NAT模式原理

1、当客户端发起链接请求,访问web服务器,首先到达最近的路由器,中间串过层层路由关卡,来到了lvs服务器,

2、经过iptables表规则筛选,发现是给它自己的,而它自己本机没有web服务,就把请求目标变更为RIP,源不变

3、通过路由表POSTROUTING把变更后的请求报文发给RIP

4、RS中有个RIP收到后,开始回应,发送回应报文,源RIP,目标CIP,经过POSTROUTING回到lvs调度器

5、在请求报文中做了转换,回应报文也要转回去,所有到达lvs调度器,更改回应源,源VIP,目标CIP,经过PREROUTING到达最近的路由

6、穿过层层路由大军到了客户端

NAT模式配置过程
1、首先安装ipvsadm工具
yum install ipvsadm
2、在ipv4环境下可以进行ip转发
echo 1 >> /proc/sys/net/ipv4/ip_forward
3、添加集群服务器
ipvsadm -A -t 192.168.1.174 -r ss -A 添加一条集群服务 -t 为tcp 本地地址 -r ss 模式为轮询
4、添加真实服务器
ipvsadm -a -t 192.168.1.174:80 -r 192.168.5.3 -m -a 添加真实服务器 -t tcp 虚拟ip地址,本地地址 -r 真实服务器地址 -m 为NAT模式
5、真实的服务器的默认网关必须为LVS服务器,否则不能使用

六、DR模式,直接路由模式

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR模式可以极大的提高集群系统的伸缩性。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。DR模式是互联网使用比较多的一种模式。

centos6录制屏幕 centos7 lvs_IP_02


centos6录制屏幕 centos7 lvs_客户端_03

centos6录制屏幕 centos7 lvs_服务器_04


原理介绍:

当客户端请求VIP时,会将请求先发给Director(调度器),调度器发现请求的是一组集群服务,根据调度算法将这一请求转发给RealServer,注意在转发的过程中,仅仅是修改了数据报文中的MAC地址,所以这也是为什么我们要求DR和RS必须在同一个物理网络内,就是为了保证可以通过修改MAC地址而进行数据报文的转发。当RealServer处理请求,响应数据,发送响应数据给客户端,按理说此时的数据包的源IP为RIP,目标IP为CIP,虽然能找到客户端,但是客户端是不收该数据包的,因为并没有请求该RIP ,现在的做法就是进行IP欺骗,即就是修改源 IP 为 VIP,但是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。要在lo接口上配置VIP,并将此 VIP 屏蔽,但是出去时候的数据包被路由转换,转换后的 IP不再是 VIP,所以要重新设置路由。另外关于各服务器网络的配置,首先每个服务有一个独立网卡即可。在DR上将DIP配置eth0上,将VIP配置在网络别名上,这样是为了以后调度器做高可用方便VIP做IP地址飘移。在各RS上同样需要配置好VIP,这样个RS就可以直接响应Client,而不需要再经过DR,但是一个物理网络之内是不允许有多个同名IP的,所以需要修改RS的内核参数,并且将VIP配置在LO上,让其保留VIP但是不允许对外进行广播,这样从RS出去的报文源地址就是VIP,当然这需要从真实的物理网卡出去,所以必须加一条路由,让访问VIP的数据包请求,对其响应的是配置了VIP的网卡,这样响应出去的报文源地址就是VIP,可以被Client接受。

配置过程:
1、LVS服务器在网卡上需要添加一个ip地址,才有用网络别名的方式
ens192:1 192.168.7.1 vip
ens192 192.168.7.2 dip
2、LVS服务器开启arp抑制
echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce
echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce
echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore
3、真实的服务器需要配置VIP在lo网卡上
ens192 192.168.7.3 DIP
lo:1 192.168.7.1 VIP
4、真实的服务器开启ARP抑制
echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce
echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce
echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore
5、首先安装ipvsadm工具
yum install ipvsadm
7、在ipv4环境下可以进行ip转发
echo 1 >> /proc/sys/net/ipv4/ip_forward
8、添加集群服务器
ipvsadm -A -t 192.168.1.174 -s wrr
4、添加真实服务器
ipvsadm -a -t 192.168.1.174:80 -r 192.168.5.3 -g -a 添加真实服务器 -t tcp 虚拟ip地址,本地地址 -r 真实服务器地址 -g 为DR模式
5、真实的服务器的默认网关必须局域网真正的默认网关,否则不能使用