负载均衡LVS原理及其应用

一、LB常用解决方案

1、硬件负载均衡解决方案:

F5公司: BIG-IP

Citrix公司: Netscaler

A10公司: A10

Array

Redware

2、 Linux: LVS

1. 完成Linux Virtual Server作者 (章文嵩,花名段正明)

2. ipvs工作于netfilter框架上

3. ipvs: 框架,工作在内核中,工作在input链上,需要依赖于规则完成转发。 如果发现发往本机INPUT链的请求,如果能匹配到集群规则,直接转发至post-routing链发出主机。

4. 规则: 简单来说就是把ip加端口定义为ipvs集群服务,ipvs会为此请求定义一个或多个后端服务

目标地址未必会改,但是报文会被强行转发给后端的服务器。

5. ipvs组件: ipvsadm(用户空间,用来编写规则) + ipvs(内核空间)

6. ipvs工作在第四层:

1)成为四层交换、四层路由。 做第四层转发。

2)只能基于ip和port转发,无法在应用层,session级别转发

3)不用到达应用层空间,就能转发

7. lvs 性能很好,但是由于只第四层,不能到用户空间,因此不能进行更加精细的控制。 在精细控制方面,haproxy和Ngnix可以更好的实现。

8. lvs通常作为总入口,更精细化的切割可能使用,haproxy或者Nginx实现

9. 报文的信息流: CIP<–>VIP–DIP<–>RIP

1)CIP: Client ip

2) VIP: virtual ip

3) DIP: Director IP

4)RIP: Real server Ip

客户端请求,被VIP端口接收后,从DIP接口被转发出去,并转发至RIP

二、LVS类型:

1、NAT(dNAT):

访问过程如下

1)CIP访问VIP

2)VIP接收报文后,做dNAT,指向某一个RIP

3)RIP拿到接收到报文后进行回应

4)此时需要,RIP网关指向DIP,也就是Director server. 否则若在互联网上,即便报文是可以回应给CIP客户端,但是由于CIP并没有请求RIP服务器,因此报文会被丢弃。

NAT特性

1) RS应该使用私有地址

2) RS的网关必须指向DIP

3) RIP 和 DIP 必须在一同意网段内

4) 进出的报文,无论请求还是响应,都必须经过Director Server, 请求报文由DS完成目标地址转换,响应报文由DS完成源地址转换

5) 在高负载应用场景中,DS很可能成为系统性能瓶颈。

6) 支持端口映射。

7) 内部RS可以使用任意支持集群服务的任意操作系统。

2、 DR

1)让前端路由将请求发往VIP时,只能是Dirctor上的VIP

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

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

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

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

(2) arptables

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

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

(3) 修改Linux内核参数

前提:RS必须是Linux;

缺点:适用性差;

Linux的工作特性:IP地址是属于主机,而非某特定网卡;也就是说,主机上所有的网卡都会向外通告

需要先配置参数,然后配置IP,因为只要IP地址配置完成则开始想外通告mac地址

为了使响应报文由配置有VIP的lo包装,使源地址为VIP,需要配置路由经过lo网卡的别名,最终由eth0发出

两个参数的取值含义:

arp_announce:定义通告模式

0: default, 只要主机接入网络,则自动通告所有为网卡mac地址

1: 尽力不通告非直接连入网络的网卡mac地址

2: 只通告直接进入网络的网卡mac地址

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

0: 只有arp 广播请求,马上响应,并且响应所有本机网卡的mac地址

1: 只响应,接受arp广播请求的网卡接口mac地址

2: 只响应,接受arp广播请求的网卡接口mac地址,并且需要请求广播与接口地址属于同一网段

3: 主机范围(Scope host)内生效的接口,不予响应,只响应全局生效与外网能通信的网卡接口

4-7: 保留位

8: 不响应一切arp广播请求

配置方法:

全部网卡

arp_ignore 1

arp_announce 2

同时再分别配置每个网卡,eth0和lo

arp_ignore 1

arp_annource 2

2) 特性

(1)RS是可以使用公网地址,此时可以直接通过互联网连入,配置,监控RS服务器

(2)RS的网不能指向DIP

(3)RS跟DS要在同一物理网络内,最好在一同一网段内

(4)请求报文经过Director但是相应报文不经过Director

(5)不支持端口映射

(6)RS可以使用,大多数的操作系统,至少要可以隐藏VIP

3. LVS TUN: IP隧道,IP报文中套IP报文

1)RIP,DIP,VIP都必须是公网地址

2)RS网关不会指向DIP

3)请求报文经过Director,但相应报文一定不经过Director

4)不支持端口映射

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

4. FULLNAT: 必须内核打补丁才能使用,使得各RS主机可以跨vlan. 源IP和目标IP都修改。

二、LVS调度算法:

1. 静态方法:仅根据算法本身进行调度

rr: Round Robin

wrr: Weighted RR

sh: source hashing,源地址进行hash,然后分配到特定的服务器

dh: destination hashing

用于多前端防火墙的场景中,使得访问从一个防火墙进同时还从这个防火墙出来。

2. 动态方法:根据算法及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 后端服务器是缓存服务器时, 可以绑定连接到某一缓存服务器中。

3. LVS缺陷:

不能检测后端服务器的健康状况,总是发送连接到后端。

Session持久机制:

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

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

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

三、ipvsadm使用方法

1.相关命令

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]

2. 集群服务相关

-A: 添加一个集群服务
-t: tcp
-u: udp
-f: firewall mark,
通常用于将两个或以上的服务绑定为一个服务进行处理时使用
例如httpd和https
iptables mongo表一起使用
         
    service-address:
-t IP:port
-u ip:port
-f firewall_mark

-s 调度方法,默认为wlc
-p timeout: persistent connection, 持久连接
-E 修改定义过的集群服务
-D -t|u|f service-address:删除指定的集群服务

3. RS相关

-a:向指定的Cluster services中添加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 # 省略权重为1
    -e: 修改指定的RS属性
    -d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS

4. 清空所有的集群服务:

-C

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

ipvsadm-save 
ipvsadm -S

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

ipvsadm-restore
ipvsadm -R

7. 查看ipvs规则等:

-L [options]
 -n: 数字格式显示IP地址
 -c: 显示连接数相关信息
 --stats: 显示统计数据
 --rate: 速率
 --exact:显示统计数据的精确值
 --timeout: 超时时间
-Z: 计数器清零;

四、LVS NAT模型的实现:

1. 集群环境: 一台Director, 两台后端Real Server RS1,RS2

Director: 两网卡    
eth0: 192.168.98.133/24 
eth1: 172.25.136.10/24
eth0:1: 192.168.98.128/24 作为VIP地址
     
RS1: 
eth0: 172.25.136.11 
     
RS2: 
eth0: 172.25.136.12
Director的eth1和RS1,RS2的eth0在模拟在同一物理网络内,使用VMnet2    
物理机windows 7 作为客户端,在192.168.98.0网络内

2. 为RS添加网关指向Director

RS1:    
  # ifconfig eth0 172.25.136.11/24 
  # route add default gw 172.25.136.10 
RS2: 
  # ifconfig eth0 172.25.136.12/24 
  # route add default gw 172.25.136.10 
添加完路由条目后,应该可以ping通Director 192.168.98.0网段的两个地址。

3. 修改内核参数,开启转发功能

# echo 1 > /proc/sys/net/ipv4/ip_forward

4. 在RS1和RS2上面创建测试页,并在Director验证服务

RS1上
   # echo 'web from RS1' > /var/www/html/index.html 
   # service httpd start 
RS2上
   # echo 'web from RS2' > /var/www/html/index.html 
   # service httpd start 
Director上验证 
   # curl 172.25.136.11 
   web from RS1
   # curl 172.25.136.12 
   web from RS2

5. 在Director添加集群服务

# ipvsadm -A -t 192.168.98.128:80 -s wlc    
# ipvsadm -a -t 192.168.98.128:80  -r 172.25.136.11:80 -m -w 1
# ipvsadm -a -t 192.168.98.128:80  -r 172.25.136.12:80 -m -w 3

6. 通过物理机浏览器访问192.168.98.128, 正常情况,就可以看到轮寻的两个RS的主页了。

访问几次后,查看统计数据如下,大概接入报文比例3:1, 说明wlc生效了    
# ipvsadm -L --stats 
   IP Virtual Server version 1.2.1 (size=4096)
   Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
   -> RemoteAddress:Port
  TCP  192.168.98.128:http                45      227      227    32215    19245
    -> 136-11.priv25.nus.edu.sg:htt       12       62       62     8571     6055
    -> 136-12.priv25.nus.edu.sg:htt       33      165      165    23644    13190

五、LVS DR模型,当DIP,VIP,RIP都为公网地址时(实验环境中,把这三个地址全部放在同一物理网络中)

1. 地址规划:

Director:     
   eth0: 192.168.98.133 作为ssh通信地址
   eth0:1: 192.168.98.128 作为VIP, 可以进行浮动
RS1: 
   eth0: 192.168.98.129/24 作为RIP1 
   lo:1 : 192.168.98.128 作为隐藏的VIP
RS1: 
   eth0: 192.168.98.130 作为RIP2 
   lo:2: 192.168.98.128 作为隐藏VIP

2. 配置地址

Director: 
  # ifconfig eth0 192.168.98.133/24 up 
  # ifconfig eth0:1 192.168.98.128/24 up 
RS1 
  # ifconfig eth0 192.168.98.129/24 up 
RS2 
  # ifconfig eth0 192.168.98.130/25 up

3. 修改RS1,RS3的内核参数,关闭lo的arp通告和lo的arp响应,并配置隐藏地址

RS1: 
  # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  # echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  # echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
   设置RS1的隐藏VIP地址, 并禁止其向外发广播
  # ifconfig lo:1 192.168.98.128 netmask 255.255.255.255 broadcast 192.168.98.128
RS2: 
  # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  # echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  # echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    设置RS2的隐藏VIP地址,并禁止其向外发广播
  # ifconfig lo:1 192.168.98.128 netmask 255.255.255.255 broadcast 192.168.98.128

4. 为RS1和RS2添加路由条目,保证其发出报文经过eth0之前,还要先经过lo:1 VIP, 使得源地址成为VIP

RS1:     
    # route add 192.168.98.128 dev lo:1
RS2:
    # route add 192.168.98.128 dev lo:1

5. 此时在Director上面添加,集群服务

# ipvsadm -A -t 192.168.98.128:80 -s wlc    
# ipvsadm -a -t 192.168.98.128:80  -r 192.168.98.129:80 -g -w 1
# ipvsadm -a -t 192.168.98.128:80  -r 192.168.98.130:80 -g -w 3

六、LVS持久连接:

1. PCC:将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS;

可以通过修改轮寻算法为sh算法实现
# ipvsadm -E -t 192.168.98.128:80 -s sh 
  [root@www ~]# curl 192.168.98.128 
  eb from RS2
  [root@www ~]# curl 192.168.98.128 
  web from RS2
  [root@www ~]# curl 192.168.98.128 
  web from RS2
  [root@www ~]# curl 192.168.98.128 
  web from RS2
  [root@www ~]# curl 192.168.98.128 
  web from RS2
  [root@www ~]# curl 192.168.98.128 
  web from RS2

2. PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS;

3. PFMC: 端口绑定,port affinity, 基于防火墙标记,将两个或以上的端口绑定为同一个服务

防火墙打标记
# iptables -t mangle -A PREROUTING -d VIP -p tcp --dport CS_Port -j MARK --set-mark #  (0-99)
定义集群服务:
# ipvsadm -A -f #(防火墙打的标记)

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-12-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信终端开发团队的专栏

Hello Bonjour!

Hello Bonjour! 一开始用Bonjour,我是拒绝的。 让我们以一个问题开头:如何能在本地网络找到自己想要的硬件设备及相应服务,并连接? 在这个以I...

277100
来自专栏python3

python3--网络编程一

有两个文件a.py和b.py,分别去运行,这两个python的文件分别运行的很好,但是如果这两个程序之间想要传递一个数据,要怎么做呢?

14910
来自专栏腾讯玄武实验室的专栏

IE 浏览器 DOM 树结构概览(上)

DOM 作为现代浏览器的基础,其设计和实现方式影响着整个浏览器的表现。对安全研究者而言,了解DOM 的结构更是有着特殊的意义。在对 DOM 结构有了了解之后进行...

50400
来自专栏即时通讯技术

迈向高阶:优秀Android程序员必知必会的网络基础

网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlC...

19920
来自专栏落影的专栏

HLS点播实现(H.264和AAC码流)

前言 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 使用AudioToolbox编码AAC 使用AudioT...

53460
来自专栏运维小白

18.7 LVS介绍

LVS介绍 LVS是由国人章文嵩开发 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高 LVS最新版本基于Linux内核2...

23580
来自专栏马小尾成长迹

如何通过浏览器上网

当我们在网页浏览器(Web browser)的地址栏中输入 URL 时,Web 页面是如何呈现的吗?

17800
来自专栏即时通讯技术

网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动。

30920
来自专栏FreeBuf

挖洞经验 | Facebook的手机扫码登录漏洞

Facebook最近推出了忘记密码的手机登录功能,我发现该功能中的二维码扫描存在漏洞,可以利用其进行CSRF攻击,劫持其它Facebook账户。 ? 当我的手机...

75280
来自专栏java思维导图

《HTTP权威指南》思维导图一览全书

文章作者:yrq110 原始链接:http://yrq110.me/2017/03/04/20170304-http-mindmap/ 高清原图:请下拉到底点...

30430

扫码关注云+社区

领取腾讯云代金券