摘要

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

一、背景

项目背景是某企业的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。

容量计算

>服务端资源需求T= 认证请求规模g(n) / TACACSD运算能力 f(n)

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

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

2.选型要求

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

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

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

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

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

<!--more-->

二、前戏

我们首先想到的是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, ...

vi haproxy.cfg
listen AAA-Cluster
mode tcp
bind 49
option tcplog
source 0.0.0.0 usesrc clientip
server AAA-Server-210 192.168.3.10:49
server AAA-Server-211 192.168.3.11:49

1.HAProxy+TProxy

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

官方文档对于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)一致。 

过程描述:网络设备会发送该用户的凭证到 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 !!

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 49 -j DNAT --to 192.168.3.10-192.168.3.13

如上即可解决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控制机的单点故障问题,还选用了Keepalived,负责LVS控制机和备用机的自动故障切换。

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. 各种负载均衡实现在网络中的位置

四层负载均衡的特点一般是在网络和网络传输层(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

更多精彩内容,请访问https://riboseyim.github.io 扫码关注公众号:@睿哥杂货铺

[转载]基于LVS的AAA负载均衡架构实践的更多相关文章

  1. LVS基于NAT模式搭建负载均衡群集

    LVS的基本架构图 负载均衡群集中,包括三个层次的组件: 1.第一层,负载调度器(BL) 前段至少有一个负载调度器(Load Balancer 或称为Director)负责响应并分发来自客户端的访问请 ...

  2. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

  3. 借助LVS+Keepalived实现负载均衡(转)

    原文:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...

  4. 借助LVS+Keepalived实现负载均衡

    原文地址:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了 ...

  5. 【转】借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

  6. LVS+keepalived实现负载均衡

    背景:         随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要 的浪费?同时实现商业硬件一样的 ...

  7. 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  8. 借助 LVS + Keepalived 实现负载均衡

    虽然现在云手段很高明了.但是这个lvs + keepalive 还是需要了解下的. 今天就整理了下lvs和keepalive的东西.做下总结留作以后怀念 在实际应用中,在Web服务器集群之前总会有一台 ...

  9. [转]搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

    [原文]https://www.toutiao.com/i6591714650205716996/ 一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最 ...

随机推荐

  1. Objective-C 和 Swift 混编项目的小 Tips(一)

    本文主要闲聊一些 Objective-C 和 Swift 混编项目带来的一些潜规则,希望能帮到对此感到疑惑的朋友.下面我们开始进入主题: 命名 官方 Guide 上只是简单叙述(Using Swift ...

  2. 谈谈调用腾讯云【OCR-通用印刷体识别】Api踩的坑

    一.写在前面 最近做项目需要用到识别图片中文字的功能,本来用的Tesseract这个写的,不过效果不是很理想. 随后上网搜了一下OCR接口,就准备使用腾讯云.百度的OCR接口试一下效果.不过这个腾讯云 ...

  3. 自学Python2.7-collections系列

    Python collections系列 Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供 ...

  4. CoreJava逻辑思维-顺时针打印自定义矩阵

    CoreJava逻辑思维-顺时针打印自定义矩阵 这两天回顾了一下刚入Java时的一些比较有意思的逻辑题,曾经也费劲脑汁的思考过的一些问题,比如百钱百鸡最简单的算法啦之类的,而今天博主想说的是一个循环打 ...

  5. 给虚拟机添加新硬盘并分区,fdisk查看分区,分区,重新读取分区表信息partprobe,格式化,挂载,查看分区挂载信息,自动挂载文件/etc/fstab,/etc/fstab文件错误导致重启崩溃后的修复

    1.虚拟机关机断电 2.添加硬盘 2.开机 3.fdisk -l查看刚才新添加的硬盘 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 2147483 ...

  6. python基础知识——字符串详解

    大多数人学习的第一门编程语言是C/C++,个人觉得C/C++也许是小白入门的最合适的语言,但是必须承认C/C++确实有的地方难以理解,初学者如果没有正确理解,就可能会在使用指针等变量时候变得越来越困惑 ...

  7. bzoj 4013: [HNOI2015]实验比较

    Description 小D 被邀请到实验室,做一个跟图片质量评价相关的主观实验.实验用到的图片集一共有 N 张图片,编号为 1 到 N.实验分若干轮进行,在每轮实验中,小 D会被要求观看某两张随机选 ...

  8. Git_学习_03_ ignore文件配置

    一.示例 # 1.Compiled class file *.class bin target # 2.Log file *.log logs # 3. Package Files # *.war * ...

  9. 前端MVC Vue2学习总结(六)——axios与跨域HTTP请求、Lodash工具库

    一.axios Vue更新到2.0之后宣告不再对vue-resource更新,推荐使用axios,axios是一个用于客户端与服务器通信的组件,axios 是一个基于Promise 用于浏览器和 no ...

  10. [编织消息框架][JAVA核心技术]动态代理应用11-水平扩展实现

    由于示例,远程服务地址配置在properties文件,通过QMConfig类加载,最优方式是上节介绍过,放在共享内存上,只需要维护一份数据即可,如放在redis上 /** 服务地址<servic ...