热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于LVS的AAA负载均衡架构实践

本次分享将从一次实际的负载均衡改造案例出发,通过介绍项目背景、选型思路、测试方法和问题分析等方面展开

一、背景

项目背景是某企业的AAA管理系统, AAA 即 Authentication(认证)、Authorization(授权)、Accounting(记账),是网络设备的一种集中化管理机制,可以在不同设备上为用户设置不同的权限,对网络安全起到监视作用。

AAA服务是基于TACACS+协议(Terminal Access Controller Access Control System Plus),TACACS+是在 TACACS 协议的基础上进行了功能增强的安全协议,最早由Cicso提出并开放标准。该协议与 RADIUS 协议的功能类似,采用客户端/服务器模式实现 网元与 TACACS+ 服务器之间的通信,使用TCP 49端口。

每次TACACS+ 交互主要实现: 认证 (Authentication): 确认访问网络的用户身份,判断访问者是否合法 授权( Authorization ): 对通过认证的用户,授权其可以使用哪些服务 记账( Accounting ):记录用户的操作行为、发生时间

1.问题描述

系统架构如下图所示,服务器采用一主一备模式,一般情况下由Master服务器处理请求,如果它故障或者负荷过高、无法快速响应请求,网元会将请求发送到BackUP服务器处理。AAA Server上运行守护进程处理请求,记为TACACSD。

基于 LVS 的 AAA 负载均衡架构实践

容量计算

在很长一段时间内,原有架构可以满足应用需求,但是随着集中化的深入推进,资源不足的问题日益严重:Master负荷早已爆满,BackUP的负荷也几乎与Master相当,而且请求从Master切换到BackUP的时候,非常容易引起失败。 主要有三个关键因子的变化: 1、管理设备数量增长10倍,而且还要继续增长 2、网络配置自动化,单一网元的巡检、配置操作有数量级的提升
3、TACACSD程序本身存在性能瓶颈,CPU消耗随着设备数量增长而增长

前两个因素属于业务需求,不能调整,程序性能问题涉及开发周期问题(这块以后再单独分析),迫于业务压力,我们必须快速寻找一种变通方案。

2.选型要求

在选择适用方案之前,我们必须考虑以下几个要求:

可伸缩性(Scalability) 当服务规模(设备数量、自动化操作次数)的负载增长时,系统能被扩展来满足需求(弹性扩展服务能力),且不降低服务质量。

高可用性(Availability) 尽管部分硬件和软件会发生故障,整个系统的服务必须是每天24小时每星期7天可用的。(必须去除原来过于依赖单一服务器的瓶颈)

可管理性(Manageability) 整个实现应该易于管理,提供灵活的负载均衡策略支持。

价格有效性(Cost-effectiveness) 整个实现是经济的。这个怎么说呢,比如这个问题吧,有人说:买四层交换机啊? 没钱!宇宙上最好服务器来一台? 没钱!! 于是我们的主要探索方向放在了开源软件,感谢开源社区解救穷人。

二、前戏

我们首先想到的是HAProxy,一款经典的负载均衡开源软件。 特别是具备以下几个特点:配置维护简单,支持热备,支持后端服务器的状态检测,可以自动摘除故障服务器;支持TCP 代理;支持Session的保持。

tcp
The instance will work in pure TCP mode. A full-duplex connection will be established between clients and servers, and no layer 7 examination will be performed. This is the default mode. It should be used for SSL, SSH, SMTP, …

1.HAProxy+TProxy

当我们满怀希望地推进之时,一个要命的问题摆在面前:后端的AAA服务器上看到的连接的Source IP都不再是用户原始的IP,而是前端的HAProxy服务器的IP,

基于 LVS 的 AAA 负载均衡架构实践

官方文档对于source调度算法的描述:

source
The source IP address is hashed and divided by the total weight of the > running servers to designate which server will receive the request. This ensures that the same client IP address will always reach the same server as long as no server goes down or up. If the hash result changes due to the number of running servers changing, many clients will be directed to a different server.

TACACSD进程必须获取到认证请求的Source IP,为此我们尝试引入TProxy。 它允许你”模仿”用户的访问IP,就像负载均衡设备不存在一样,TProxy名字中的T表示的就是transparent(透明)。当网元发起的认证请求到达后端的AAA服务器时,可以通过抓包看到的请求Source IP就是网元的真实IP。

即使用上“HAProxy+TProxy”的组合拳,还是存在另外一个问题: 设备对于认证结果报文,似乎需要请求报文的目标地址(代理服务器)与结果报文的发送端(Real AAA Server)一致。 基于 LVS 的 AAA 负载均衡架构实践

过程描述:网络设备会发送该用户的凭证到 TACACS+ 服务器进行验证,然后决定分配访问相关设备的权限,并将这些决定的结果包含在应答数据包中并发送到网络设备上,再由网络设备发送到用户终端。 至于是否真的是这个校验规则,或者我们还没有找到更好的解释。暂且搁置,引述一段RFC 1492的说明,日后再补充这个问题。CONNECT(username, password, line, destinationIP, destinationPort) returns (result1, result2, result3)

This request can only be issued when the username and line specify an already-existing connection. As such, no authentication is required and the password will in general be the empty string. It asks, in the context of that connection, whether a TCP connection can be opened to the specified destination IP address and port.

2.IPTABLES NAT

为了解决上述Proxy无法传递Source IP 的问题,我们还尝试过基于 iptables 实现网络地址转换的方式,It’s Working !!

如上即可解决HAProxy的Source IP 传递和报文回路的问题。 压力测试的时候,开始设备数比较少的时候,各项业务还很正常,当设备数加到1.5万台左右,或者几百台设备并发请求的时候,报文转发的时延久急剧上升,甚至出现丢包情况。这个方案对我们来说显然存在性能瓶颈。

HAProxy—>HAProxy + TProxy —>IPTABLES NAT

转了一圈,回到起点。

三、终极杀器

经过之前一波三折的折腾,我们决定启用一款终极杀器:LVS。 LVS即Linux Virtual Server,是一个虚拟的服务器集群系统。它有三种工作模式NAT(地址转换),IP Tunneling(IP隧道)、Direct Routing(直接路由)。

NAT模式 TUN模式 DR模式
Server any Tunneling Non-arp device
Server Network private LAN/WAN LAN
Server Number low(10-20) HIGH(100) HIGH(100)
Server Gateway load balancer own router own router

基于之前NAT方面的不良体验,我们这次直接选择了LVS-DR模式, LVS支持八种调度算法,我们选择轮询调度(Round-Robin Scheduling)。

LVS只处理一般连接,将请求给后端real server,然后由real server处理请求直接相应给用户,Direct Routing与IP Tunneling相比,没有IP封装的开销。

缺点:由于采用物理层,所以DR模式的调度器和后端real server必须在一个物理网段里,中间不能过路由器。

基于 LVS 的 AAA 负载均衡架构实践

另外,为了防止LVS控制机的单点故障问题,还选用了Keepalived,负责LVS控制机和备用机的自动故障切换。

基于 LVS 的 AAA 负载均衡架构实践

LVS依赖项:IPVS内核模块和ipvsadm工具包。 具体配置不做过多说明,可以自行检索,关键注意以下几点: 1)检查服务器是否已支持ipvs modprobe -l |grep itvs 2)检查依赖包: rpm -q kernel-devel rpm -q gcc rpm -q openssl rpm -q openssl-devel rpm -q popt 3)配置realserver节点ARP及VIP绑定脚本 vi /etc/init.d/lvs 4)启动LVS-DR /etc/init.d/lvsdr start 5)查看VIP 情况 ip addr list 6)启动realserver节点LVS /etc/init.d/lvs start

五、小结

1. 各种负载均衡实现在网络中的位置

基于 LVS 的 AAA 负载均衡架构实践

四层负载均衡的特点一般是在网络和网络传输层(TCP/IP)做负载均衡,而七层则是指在应用层做负载均衡。 四层负载均衡对于应用侵入比较小,对应用的感知较也少,同时应用接入基本不需要对此做特殊改造。 七层负载均衡一般对应用本身的感知比较多,可以结合一些通用的业务负载逻辑做成很细致的方案,比如我们通常用HAProxy/Nginx来做网站流量的分发。

实践再次教育我们,天下没有一招鲜,任何技术都有它的江湖位置。

2. 仿真能力

这次实践可以用一句话概括就是:“成也仿真,败也仿真”。 起初走了很长一段弯路,可以说是因为对整个负载均衡体系的理解不深入,也可以说是测试不足导致,凭着惯性,想当然地认为可以简单复制原来的“经验”,而 忽视了实验环境的构建。

后来可以快速推进,是因为重新规整了测试方法和目标,并且基于虚拟机搭建了验证环境,包括引入了可以仿真路由器的GNS3平台,完整地测试了真实的业务流程。LVS集群环境也是先完成构建、试运行一段时间之后才完成的业务割接。

IPTABLES NAT的方案并没有在早期发现性能瓶颈,也说明这快的测试能力不足。

3.花边故事

HAProxy的官网目前是被封锁的,国内没梯子访问不了,Why ? 在他们家的操作手册后面有LVS、Nginx的推荐链接。以前并没有注意。

TPROXY最早是作为 Linux 内核的一个patch,从linux-2.6.28以后TPRXOY已经进入官方内核。iptables只是Linux防火墙的管理 工具 而已,位于/sbin/iptables。真正实现防火墙功能的是Netfilter,它是Linux内核中实现包过滤,如果要探讨Netfilter,又会是一个很长的故事。

LVS开始于1998年,创始人是章文嵩博士,从Linux2.4内核以后,已经完全内置了LVS的各个功能模块。到今天为止,依然是目前国内IT业界达到Linux标准内核模块层面的唯一硕果。章博士同时是前淘宝基础软件研发负责人、前阿里云CTO,三个月前刚转会到滴滴打车任副总裁。淘宝技术体系曾大规模使用了LVS,不过最新消息,淘宝的同学已经鼓捣出一个VIPServer,正逐步替代了LVS。

罗列的这几条信息,其实与这次的主题关系不大,但确是整理这次篇帖子过程中,感觉很有意思的事情。技术并不冰冷,它就像个江湖,到底还是关于人的故事。

续集

1、本次场景中, HAProxy方案为什么会失败?还缺少一个深度解释。 2、本次场景中,LVS方案采用默认的轮询算法是否最优? 3、本次场景中,7X24系统如何完成服务切换? 4、本次场景中, IPTables NAT 的性能瓶颈如何解释? 5、来一个关于Netfilter的讨论 6、阅读参考资料 VIPServer: A System for Dynamic Address Mapping and Environment Management


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 程度|也就是_论文精读:Neural Architecture Search without Training
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了论文精读:NeuralArchitectureSearchwithoutTraining相关的知识,希望对你有一定的参考价值。 ... [详细]
  • dataguard日志传输模式解析_SOFAJRaft 日志复制pipeline 实现剖析 | SOFAJRaft 实现原理
    SOFAStack(ScalableOpenFinancialArchitectureStack)是蚂蚁金服自主研发的金融级分布式架构,包 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • ConsumerConfiguration在kafka0.9使用JavaConsumer替代了老版本的scalaConsumer。新版的配置如下:bootstrap. ... [详细]
  • rust编程这篇文章是关于我通过解决Twitch上尚未解决的所有CtCI问题来学习Rust的经验。英国科学博物馆集团AdaLovelace的肖像Rust徽标,由Moz ... [详细]
author-avatar
mobiledu2502873157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有