天天看点

高并发场景 LVS 安装及高可用实现

 负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

ü 单台计算机无法承受大规模的并发访问或数据流量了,此时需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,即减少用户等待响应的时间又提升了用户体验;

ü 7*24小时的服务保证,任意一个或多个有限后端节点设备宕机,不能影响整个业务的运行。

n 工作在网络模型的7层,可以针对http应用做一些分流的策略,比如针对域名、目录结构,Nginx单凭这点可利用的场合就远多于LVS了。

n 最新版本的Nginx也支持4层TCP负载,曾经这是LVS比Nginx好的地方。

n Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一,相反LVS对网络稳定性依赖比较大。

n Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。

那为什么要用lvs呢?

ü 简单一句话,当并发超过了Nginx上限,就可以使用LVS了。

ü 日1000-2000W PV或并发请求1万以下都可以考虑用Nginx。

ü 大型门户网站,电商网站需要用到LVS。

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。

LVS官网:http://www.linuxvirtualserver.org/index.html

相关中文资料

早在2.2内核时, IPVS就已经以内核补丁的形式出现。

从2.4.23版本开始,IPVS软件就合并到Linux内核的常用版本的内核补丁的集合。

从2.4.24以后IPVS已经成为Linux官方标准内核的一部分。

高并发场景 LVS 安装及高可用实现

ü LVS无需安装

ü 安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive

ü ipvsadm是通过命令行管理,而keepalive读取配置文件管理

ü 后面我们会用Shell脚本实现keepalive的功能

主机名

IP地址

软件

系统版本

lb03

10.0.0.15

lvs keepalived

CentOS Linux release 7.4.1708

lb04

10.0.0.16

web03

10.0.0.18

tomcat

web04

10.0.0.17

主机说明

web环境说明

安装管理工具

查看当前LVS状态,顺便激活LVS内核模块。

查看系统的LVS模块。

配置LVS负载均衡服务(在lb03操作)

步骤1:在eth0网卡绑定VIP地址(ip)

步骤2:清除当前所有LVS规则(-C)

步骤3:设置tcp、tcpfin、udp链接超时时间(--set)

步骤4:添加虚拟服务(-A),-t指定虚拟服务的IP端口,-s 指定调度算法 调度算法见man ipvsadm, rr wrr 权重轮询 -p 指定超时时间

步骤5:将虚拟服务关联到真实服务上(-a) -r指定真实服务的IP端口 -g LVS的模式 DR模式 -w 指定权重

步骤6:查看配置结果(-ln)

命令集:

检查结果:

ipvsadm参数说明:(更多参照 man ipvsadm)

参数

(短格式)

(长格式)

参数说明

-A

--add-service

在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。

-E

--edit-service

编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D

--delete-service

删除内核虚拟服务器表中的一条虚拟服务器记录。

-C

--clear

清除内核虚拟服务器表中的所有记录。

-R

--restore

恢复虚拟服务器规则

-S

--save

保存虚拟服务器规则,输出为-R 选项可读的格式

-a

--add-server

在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e

--edit-server

编辑一条虚拟服务器记录中的某条真实服务器记录

-d

--delete-server

删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l

--list

显示内核虚拟服务器表

-Z

--zero

虚拟服务表计数器清零(清空当前的连接数量等)

-

--set tcp tcpfin udp

设置连接超时值

--start-daemon

启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。

--stop-daemon

停止同步守护进程

-h

--help

显示帮助信息

-t

--tcp-service service-address [vip:port] or [real-server-ip:port]

说明虚拟服务器提供的是tcp 的服务

-u

--udp-service service-address [vip:port] or [real-server-ip:port]

说明虚拟服务器提供的是udp 的服务

-f

--fwmark-service fwmark

说明是经过iptables 标记过的服务类型。

-s

--scheduler scheduler

使用的调度算法,有这样几个选项

rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq

默认的调度算法是: wlc

-p

--persistent [timeout]

持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300秒。

-M

--netmask netmask

persistent granularity mask

-r

--real-server server-address

真实的服务器[Real-Server:port]

-g

--gatewaying

指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)

-i

--ipip

指定LVS 的工作模式为隧道模式

-m

--masquerading

指定LVS 的工作模式为NAT 模式

-w

--weight weight

真实服务器的权值

--mcast-interface

interface 指定组播的同步接口

-c

--connection

显示LVS 目前的连接 如:ipvsadm -L -c

--timeout   

显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout

--daemon    

显示同步守护进程状态

--stats     

显示统计信息

--rate      

显示速率信息

--sort      

对虚拟服务器和真实服务器排序输出

--numeric -n

输出IP 地址和端口的数字形式

步骤1:在lo网卡绑定VIP地址(ip)

步骤2:修改内核参数抑制ARP响应

至此LVS集群配置完毕!

浏览器访问:

高并发场景 LVS 安装及高可用实现

         命令行测试:

         抓包查看结果:

高并发场景 LVS 安装及高可用实现

         arp解析查看:

高并发场景 LVS 安装及高可用实现

术语说明:

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。

DR技术可极大地提高集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。

高并发场景 LVS 安装及高可用实现

DR直接路由模式说明:

DR的实现原理和数据包的改变

高并发场景 LVS 安装及高可用实现

既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。

  在lo上配置vip能够完成接收包并将结果返回client。

不可以,将VIP设置在eth0网卡上,会影响RS的arp请求,造成整体LVS集群arp缓存表紊乱,以至于整个负载均衡集群都不能正常工作。

① arp协议说明

ARP协议,全称"Address Resolution Protocol",中文名是地址解析协议,使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。

ARP协议要求通信的主机双方必须在同一个物理网段(即局域网环境)!

为了提高IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫做ARP缓存。

ARP缓存表是把双刃剑

a) 主机有了arp缓存表,可以加快ARP的解析速度,减少局域网内广播风暴。因为arp是发广播解析的,频繁的解析也是消耗带宽的,尤其是机器多的时候。

b) 正是有了arp缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是arp欺骗攻击。

c) 切换路由器,负载均衡器等设备时,可能会导致短时网络中断。因为所有的客户端ARP缓存表没有更新

②服务器切换ARP问题

  当集群中一台提供服务的lb01机器宕机后,然后VIP会转移到备机lb02上,但是客户端的ARP缓存表的地址解析还是宕机的lb01的MAC地址。从而导致,即使在lb02上添加VIP,也会发生客户端无法访问的情况。

  解决办法是:当lb01宕机,VIP地址迁移到lb02时,需要通过arping命令通知所有网络内机器更新本地的ARP缓存表,从而使得客户机访问时重新广播获取MAC地址。

  这个是自己开发服务器高可用脚本及所有高可用软件必须考虑到的问题。

ARP广播进行新的地址解析

测试命令

windows查看arp -a

③arp_announce和arp_ignore详解

lvs在DR模式下需要关闭arp功能

arp_announce

对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:

确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

数值

含义

0(默认)

在任意网络接口(eth0,eth1,lo)上的任何本地地址

1

尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址 是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口 上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2

对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试 选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中 包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口 或其他的有可能接受到该ARP回应的网络接口来进行发送.

arp_ignore定义

对目标地定义对目标地址为本地IP的ARP询问不同的应答模式0

0(默认值)

回应任何网络接口上对任何本地IP地址的arp查询请求

只回答目标IP地址是来访网络接口本地地址的ARP查询请求

只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3

不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

4-7

保留未使用

8

不回应所有(本地地址)的arp查询

抑制RS端arp前的广播情况

高并发场景 LVS 安装及高可用实现

抑制RS端arp后广播情况

高并发场景 LVS 安装及高可用实现
高并发场景 LVS 安装及高可用实现

通过网络地址转换,调度器LB重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器,真实服务器的响应报文处理之后,返回时必须要通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。

收费站模式---来去都要经过LB负载均衡器。

NAT方式的实现原理和数据包的改变

高并发场景 LVS 安装及高可用实现

LVS-NAT模型的特性

l RS应该使用私有地址,RS的网关必须指向DIP

l DIP和RIP必须在同一个网段内

l 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈

l 支持端口映射

l RS可以使用任意操作系统

l 缺陷:对Director Server压力会比较大,请求和响应都需经过director server

高并发场景 LVS 安装及高可用实现

采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip或ipsec )转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。由于一般网络服务应答数据比请求报文大很多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

VS/TUN工作流程,它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,将原请求的报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的真实服务器;真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

TUN原理和数据包的改变

高并发场景 LVS 安装及高可用实现

LVS-Tun模型特性

l RIP、VIP、DIP全是公网地址

l RS的网关不会也不可能指向DIP

l 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server

l 不支持端口映射

l RS的系统必须支持隧道

高并发场景 LVS 安装及高可用实现

LVS的DR和NAT模式要求RS和LVS在同一个vlan中,导致部署成本过高;TUNNEL模式虽然可以跨vlan,但RealServer上需要部署ipip隧道模块等,网络拓扑上需要连通外网,较复杂,不易运维。

为了解决上述问题,开发出FULLNAT,该模式和NAT模式的区别是:数据包进入时,除了做DNAT,还做SNAT(用户ip->内网ip),从而实现LVS-RealServer间可以跨vlan通讯,RealServer只需要连接到内网。

类比地铁站多个闸机。

  a) 轮询(Round Robin)RR

调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

  b) 加权轮叫(Weighted Round Robin)WRR

调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  c) 最少链接(Least Connections) LC

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

  d) 加权最少链接(Weighted Least Connections) Wlc

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  e) 基于局部性的最少链接(Locality-Based Least Connections) Lblc

"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。

  f) 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

  g) 目标地址散列(Destination Hashing) Dh

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

  h) 源地址散列(Source Hashing)SH

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

1. 添加VIP

2. 添加LVS配置

3. 高可用(VIP漂移)

4. web服务器健康检查

# 检查软件是否安装

lb03上keepalied配置文件

高并发场景 LVS 安装及高可用实现
高并发场景 LVS 安装及高可用实现

lb03 /etc/keepalived/keepalived.conf

      lb04的Keepalied配置文件

高并发场景 LVS 安装及高可用实现
高并发场景 LVS 安装及高可用实现

lb04 /etc/keepalived/keepalived.conf

keepalived persistence_timeout参数意义 LVS Persistence 参数的作用

http://blog.csdn.net/nimasike/article/details/53911363

注意:web服务器上的配置为临时生效,可以将其写入rc.local文件,注意文件的执行权限。

使用curl命令进行测试

至此keepalived+lvs配置完毕

Ø 开发类似keepalived的脚本,早期的办法,现在不推荐使用。

Ø heartbeat+lvs+ldirectord脚本配置方案,复杂不易控制,不推荐使用

Ø RedHat工具piranha,一个web界面配置LVS。

Ø LVS-DR+keepalived方案,老师推荐最优方案,简单、易用、高效。

高并发场景 LVS 安装及高可用实现

 本文出自“惨绿少年”,欢迎转载,转载请注明出处!http://blog.znix.top