上一主题: 交换机

下一主题: L3LB-TCP/UDP 负载均衡器

HALB-会话识别且基于 HA 代理的 HTTP 负载均衡器

最新版本:2.0.2-1

HALB-会话识别的 HTTP 负载均衡器

概览

目录

系统

类别

交换机

用户卷

no

最小 内存

96M

操作系统

Linux

约束

no

功能概述

HALB 是一个交换机,用于将工作负载分发到类型相同或不同的多个 Web 服务器。 HALB 基于 HAProxy TCP/HTTP 负载均衡软件包;在设计上,HALB 的速度极快,消耗的资源极少。

HALB 使用多种算法执行负载均衡功能。 它可以执行简单的循环均衡,以此均衡后端服务器的负载。 它还支持持久性会话,通过会话 Cookie 或通过使用请求源 IP 地址作为密钥,将客户端绑定到特定的后端 Web 服务器。 在使用会话 Cookie 时,没有会话 Cookie 的任何新会话都使用循环算法进行分配。 HALB 支持带有多个 Cookie 的会话,并且只修改和/或跟踪必要的会话,而不处理其他任何会话。 可以使用 Cookie 关联将任何特定的会话或客户端关联到特定的后端 Web 服务器或应用。 对于不支持包含多个 Cookie 的请求的客户端,HALB 可以透明方式修改现有 Cookie。

HALB 不断地监控所有后端 Web 服务器的运行状态。 HALB 执行的运行状态检查可以包括一个简单的 TCP 连接检查或者一个更复杂的 HTTP 请求(在 HALB 的边界上指定)。 当 HALB 使用参数化运行状况检查方法检测到服务器故障时,会将流量切换到备用服务器。 如果出现故障的服务器最终得到恢复,HALB 可以将流量切换回到已恢复的服务器。

HALB 在其 ctl 终端上公开 Web 服务接口。 用户可通过该接口以编程方式启用/禁用输出终端 out1-out8,以及检索所有终端的状态。 当出现某种后端故障(例如:在数据库或存储组件中发生这种故障),应用自身可以自动禁用流向特定服务器集的流量时,此接口将十分有用。 在此情况下,HALB 自身无法检测这种故障;因此,应该由应用检测故障并禁用相应的后端服务器集。

HALB 维护详细的统计信息,包括后端状态、每个服务器处理的请求数、发生的错误数,等等。 将通过 mon 终端报告统计信息,同时,通过 ui 终端将独立的计数器公开为可通过浏览器访问的 GUI。

在设计上,HALB 的速度极快,占用的资源很少。 在常规条件下,HALB 对每个会话消耗大约 25KB 内存,对 40000 个同时会话消耗 1 GB 内存,每秒可处理高达 6000 个请求。

边界

资源

资源

最小值

最大值

默认值

CPU

0.1

16

0.4

内存

96 MB

32 GB

96 MB

带宽

1 Mbps

2 Gbps

250 Mbps

为 L3LB 分配内存量不会提高吞吐量或响应时间。 L3LB 是与 CPU/带宽绑定的组件。

终端

name

dir

协议

说明

in

in

Any

通用输入。 已发送到 in 终端的 TCP 请求将使用循环选项或基于源的会话信息定向到某一个输出。

ctl

in

HTTP

用于启用/禁用输出和检索输出终端状态的控制终端

out1-out8

out

Any

均衡的输出。 可将这些输出中的任一输出和所有输出保持未连接状态;流量只会分发到已连接且已启用的输出。 默认情况下会启用所有终端。

mon

out

CCE

用于发送性能和资源使用统计信息。

属性

常规属性

name

类型

说明

mode

字符串

指定运行模式,以及将命名会话 Cookie 用于会话标识的方法。 有效值是:
passive-不修改 Cookie。 给定的 Cookie 值应该始终唯一,并且同一值永远不会由其他服务器使用。
sync-修改服务器 HTTP 响应中的 Cookie 字符串,使它对发出响应的终端是唯一的(方法是在 Cookie 值中添加一个 4 字符终端 ID)。 将请求转发到 outX 终端之一上的服务器之前会去除“终端 ID”。 除插入终端 ID 之外,Cookie 值和输出终端之间的映射与 passive 的一样-即对整个 cookie 值进行比较。
insert-负载均衡器本身将在发回到客户端的响应中插入一个 Cookie,因此当客户端用该 Cookie 发送后续请求时,这些请求会定向到与该客户端第一个请求所指向的同一服务器。 由 HALB 插入的 Cookie 没有到期日期,这意味着客户端软件不会永久保存它。
source-请求的源 IP 地址用于将会话绑定到特定的后端 Web 服务器。 将忽略该 Cookie 属性。
默认值:passive。

cookie_name

字符串

用于标识会话的 Cookie 名称。 对于 passive 模式(passive 和 sync-参见下面的模式属性),这是 Cookie 的名称,后端服务器使用这些 Cookie 连接到 out1-out8 以标识客户端会话。 对于 insert 模式,这是 HALB 为了使每个客户端与单个服务器“绑定”在一起而要插入到 HTTP 响应中的 Cookie 的名称。 如果此属性设为空值,则不执行任何会话跟踪,且所有请求都采用简单循环机制来分发。 对 source 模式忽略此属性。
默认值:(空)。

cookie_check_length

Int

定义将 Cookie 值中的多少个字节用作 passive 运行模式的唯一键,以将会话与后端 Web 服务器进行匹配。 默认值 10 通常足以满足所有常用的 PHP 和 java 应用。 此值必须始终等于或少于 Cookie 值的长度。
默认值:10。

max_connections

整数

负载均衡器处理的最大并发活动连接数。 在达到此数目时,仍会接受新连接,但是其处理会延迟,直到另一个连接关闭。 启动时,HALB 会基于可用内存自动确定最大连接数,将其与该属性的值进行比较并使用最小值。 如果该属性等于 0,则使用计算的值。 请注意,可用内存和该属性的显式设置都不会对均衡器的吞吐量或其最大请求率造成直接影响-仅当后端服务器在为每个请求(例如:数据库搜索)执行冗长操作,导致许多请求同时处于打开状态时,设置较小的值(或分配极少的内存)才会影响响应。
默认值:0

backup_outputs

字符串

被视为备份的输出 (out1 - out8) 的空格或逗号分隔列表。 仅当所有后端服务器都不可用时,流量才会定向到备份服务器。 这些备份服务器的用途是通知客户端出现问题或者重定向客户端,而不是在后端不可用或超时的情况下引发错误。
默认值:(空)。

超时属性

name

类型

说明

timeout

整数

使非活动会话到期的超时(秒)。 如果设为零,则非活动会话不会到期。 如果设为非零值,超时秒数后恢复的非活动会话被认为已过时,带有“长时间不用的”cookie 的请求被视为根本没有 cookie,并使用普通的循环方向定向到随机服务器。 此属性仅对 passive 模式有效,对所有其他模式将被忽略。
默认值:0

client_timeout

Int

建立连接后等待客户端发出请求所用的超时(秒)。
默认值:150。

server_timeout

Int

建立连接后等待后端 Web 服务器发出回复所用的超时(秒)。
默认值:150。

conn_timeout

Int

建立任何 TCP 连接所用的超时(秒)。 这包括运行状况检查。 处理此设置时必须格外小心,因为在高负载下,运行状况检查会因值太小而超时,从而使 HALB 开始禁用输出。 建议不要将它设为低于 20 秒。
默认值:20。

运行状况检查属性

name

类型

说明

healthcheck_url

字符串

用于以 http_get 和 http_head 运行状况检查方法执行后端 Web 服务器运行状况检查的 URL。 可指定为完整 URL (http://host.name/file/to/check/for.php) 或相对路径 (/file/to/check/for.php)。 如果指定为 URL,HALB 在使用从 Host: 头中的 UR 中提取的主机名执行运行状况检查时将使用 HTTP/1.1 协议。 允许使用虚拟主机。 如果指定为相对路径,HALB 将使用 HTTP/1.0 协议,并检查该属性指定的文档。 如果该属性为空,HALB 将使用 HTTP/1.0 协议检查默认根目录“/”。
默认值:(空)。

healthcheck_agent

字符串

用作 http_get 和 http_head 运行状况检查方法的代理标识符的字符串。 如果为空,则使用 HALB-health-check。
默认值:(空)。

healthcheck_method

字符串

用于执行后端 Web 服务器运行状况检查的方法。
tcp_connect一HALB 连接到 Web 服务器的端口 80。 如果成功建立连接,则 HALB 假定 Web 服务器正在运行。 这是最快的方法,且需要的资源最少。
http_head一HALB 使用 HEAD 方法来请求 healthcheck_url 属性指定的文档。 此方法的速度比 tcp_connect 慢,需要 HALB 和 Web 服务器上的更多资源,但是更加可靠。 可以根据从 Web 服务器接收的 2xx 或 3xx 状态代码来验证服务器是否正在运行。
http_get一HALB 使用 GET 方法来请求 healthcheck_url 属性指定的文档。 这是最慢的方法,需要的资源最多,但最可靠。可以根据从 Web 服务器接收的 2xx 或 3xx 状态代码来验证服务器是否正在运行。 如果已定义 healthcheck_regexp 属性,那么 HALB 将会下载包括所有 HTTP 头和服务器状态代码的文档,并根据 healthcheck_regexp 值检查匹配。 如果找到匹配项,则认为后端服务器正在运行;如果找不到匹配项,则认为已禁用后端服务器。
默认值:tcp_connect。

healthcheck_regexp

字符串

用于 http_get 运行状况检查模式的测试字符串。 使用简短或不具体的字符串(例如 OK)很可能会引起误报匹配。 该字符串是 perl 正则表达式,此处提供了有关 perl 正则表达式的更多详细信息。
默认值:(空)。

healthcheck_interval

Int

后端 Web 服务器运行状况检查之间的时间间隔(指定以秒为单位)。
默认值:20 秒。

UI/Web 服务接口属性

name

类型

说明

用户名

字符串

用于通过 ui 终端访问 HALB GUI 的用户名。 如果为空,则不进行身份验证。
默认值:(空)。

password

字符串

用于通过 ui 终端访问 HALB GUI 的密码。 如果用户名为空,则会忽略密码。
默认值:(空)。

ctl_port

Int

用于通过 ctl 终端访问 Web 服务控制界面的端口。
默认值:80。

ui_port

Int

用于通过 ui 终端访问 HALB 运行时统计信息 GUI 的端口。
默认值:80。

自定义计数器

HALB 组件通过 mon 终端报告下列自定义计数器。

下列计数器属于 HALB 计数器组。 X 可以使用 1 - 8 范围内的值。

计数器名称

说明

outX_status

输出终端 outX 的状态:0-已启用并已启动,1-已启用并已关闭,100-已断开连接。

outX_queue

终端 outX 的排队请求数。

outX_queue_max

终端 outX 的同时排队请求的历史最大值。

outX_sessions_active

终端 outX 的活动会话数。

outX_sessions_max

终端 outX 的同时活动会话的最大数目。

outX_sessions_total

终端 outX 的已完成会话数。

outX_errors

终端 outX 的失败运行状况检查数。

queue

out1-out8 的当前累积队列长度。

queue_max

out1-out8 的同时排队请求累积数的历史最大值。

sessions_active

out1-out8 的活动会话累积数。

sessions_max

out1-out8 活动会话累积数的历史最大值。

sessions_total

out1-out8 的已完成会话累积数。

错误

out1-out8 的失败运行状况检查累积数总计。

性能

请求速率

HALB 每秒路由的事务数不少于 6000 个(请求/响应对),此速率受文档大小和可用网络带宽的限制。

数据吞吐量

HALB 以不低于 15 MB/秒的速率路由

并发连接数

HALB 支持不少于 2000 个并发未决请求。 (“未决请求”是来自客户端的开放 TCP 连接,其中有一个或多个未完成的 HTTP 请求正在进行中)。 最大并发连接数取决于可用内存,可高达 40000 个。 经过测试,HALB 支持的同时活动传输数超过 15000 个。

错误消息

在组件启动失败的情况下,系统日志可能记录以下错误消息:

错误消息

说明

错误: 无法确定组件内存配置,请联系 CA Technologies 支持。

HALB 无法检测可用内存量,请联系 CA 支持。

错误: 无法创建 HAProxy 配置文件,请联系 CA Technologies 支持。

HALB 无法创建 HAProxy 配置文件(可能是因为磁盘空间不足),请联系 CA 支持。

错误: 无法确定可用 CPU 数,请联系 CA Technologies 支持。

HALB 无法检测可用 CPU 的数量,请联系 CA 支持。

错误: healthcheck_url 在指定为 URL 时,必须以 http:// 开头,并包含文档的完整路径(例如 http://host.name.domain/file/to/check/for.html)

healthcheck_url 属性值不正确,它应该以 http:// 开头,并包含完整路径,例如 http://host.name.domain/file/to/check/for.html

错误: 指定了未知的运行状况检查方法 healthcheck_method。

healthcheck_method 属性值不正确,它应为 tcp_connect、http_head 或 http_get

错误: 指定的运行模式无效

指定了无效的模式,它应为 passive、sync、insert 或 source

错误: ui_port 值必须介于 1 和 65535 之间。

ui_port 值必须大于 1 并小于 65535。

错误: ctl_port 值必须介于 1 和 65535 之间。

ctl_port 值必须大于 1 并小于 65535。

错误: 无法启动 HALB,有关详细信息,请参阅 /var/log/appliance/log 日志文件。

在启动 HALB 时发生系统错误,请联系 CA 支持。

错误: 无法初始化控制 Web 服务接口,请联系 CA Technologies 支持。

在初始化 ctl 终端上公开的控制 Web 服务接口时发生系统错误,请联系 CA 支持。

错误: 无法初始化统计信息报告,请联系 CA Technologies 支持。

在初始化统计信息报告时发生系统错误,请联系 CA 支持。

错误: 无法初始化用户接口终端,请联系 CA Technologies 支持。

在初始化 ui 终端上公开的图形用户界面时发生系统错误,请联系 CA 支持。

错误: 无法初始化外部运行状况检查程序,请联系 CA Technologies 支持。

在启动支持正则表达式的外部运行状况检查程序时发生错误,请联系 CA 技术支持。

输出终端的程序化控制

概览

控制 Web 服务接口在 ctl 终端(配置的端口)上公开,可用于启用和禁用输出终端 (out1-out8) 并检索当前的终端状态。

协议

该协议仅使用 GET HTTP 方法,因为它仅提供读取功能。 因此,每个支持的协议请求类型都可通过 URI 和输出结构来定义。 不能在 URI 中使用的特殊字符应通过标准 % 编码进行转义。

下面是所有支持的 URI 的说明。

控制调用

禁用输出终端

根据输出终端的标识方式,可以使用两种不同的禁用控制调用格式:

请求:/api/disable?channel=out3(禁用输出终端 out3)

请求:/api/disable?10.11.12.13(禁用连接到 IP 地址为 10.11.12.13 的 Web 服务器的输出终端)

响应:

HALB 返回以下包含状态代码和可选状态消息的结构:

{
   "status" :
   {
   "code": code_value,
   "message": "status_message"
   }
}

下面列出了可能的状态代码值:

代码值

说明

0

操作成功,已禁用终端。

10

操作不成功,HALB 配置未修改。 最可能的原因是终端已禁用,或者指定的 IP 地址无效。

100

处理请求时发生错误,状态消息中提供了更多详细信息。

启用输出终端

根据输出终端的标识方式,可以使用两种不同的启用控制调用格式:

请求:/api/enable?channel=out3(启用输出终端 out3)

请求:/api/enable?10.11.12.13(启用连接到 IP 地址为 10.11.12.13 的 Web 服务器的输出终端)

响应:

HALB 返回以下包含状态代码和可选状态消息的结构:

{
   "status" :
   {
   "code": code_value,
   "message": "status_message"
   }
}

下面列出了可能的状态代码值:

代码值

说明

0

操作成功,已启用终端。

10

操作不成功,HALB 配置未修改。 最可能的原因是终端已启用,或者指定的 IP 地址无效。

100

处理请求时发生错误,状态消息中提供了更多详细信息。

检索输出终端状态

请求:/api/status(返回所有输出终端的状态)

响应:

HALB 返回以下包含状态代码和可选状态消息的结构:

{
   "status" :
   {
   "code": code_value,
   "message": "status_message",
   "terminal_id": "terminal_state",
   "terminal_id": "terminal_state",
   ...
   }
}

只返回所有已连接终端的状态;不报告已禁用和已断开连接终端的状态。

下面列出了可能的状态代码值:

代码值

说明

0

操作成功。

100

处理请求时发生错误,状态消息中提供了更多详细信息。

可能的终端值为 out1-out8。

可能的状态值为:

状态值

说明

up

终端已连接并处于活动状态。

down

终端处于非活动状态。 连接到该终端的 Web 服务器已关闭,或者 HALB 运行状况检查失败。

示例状态输出:

{
   "status" :
   {
   "code": 0,
   "message": "",
   "out1": "up",
   "out2": "up",
   "out3": "down",
   "out4": "up"   
   }

}

Web GUI

HALB 通过 ui 终端显示统计信息 GUI。 通过此 GUI 可获取各种运行时信息:

参数

说明

nbcproc

HALB 可用的 CPU 数。

uptime

HALB 运行时间。

system limits

HALB 上的操作系统实施的资源限制。

memmax

HALB 的最大可用内存。

ulimit-n

同时打开的最大文件数。 网络套接字被视为文件。

maxsock

同时打开的最大套接字数。

maxconn

最大同时连接数。 一旦达到此数目,所有新连接将被置入等待队列。

current conns

当前的活动连接数。

Server Status

后端服务器的状态。 UP-服务器正常运行;DOWN-服务器不正常运行。

Queue Curr.

后端服务器的当前请求队列长度。

Queue Max.

自 HALB 启动以来,后端服务器达到的最大队列长度。

Sessions Curr.

当前活动会话数。

Sessions Max.

达到的最大同时活动会话数。

Sessions Cumul.

已完成会话的总数。

Errors Conn.

连接到后端服务器时发生的错误数。

Errors Resp.

后端服务器报告的 5xx 错误数。

Errors Check

后端服务器上失败的运行状况检查数。

Errors Down

后端服务器从 UP 状态转为 DOWN 状态的次数。

典型用法

对慢速动态内容应用进行负载均衡

如果您的应用需要大量的计算才能生成每个页面,那么,它自然能够为数量有限的客户端同时提供服务。 不过,如果数据源足够快,或可以从多个服务器复制和获得服务,则可以使用 HALB 来增加可同时处理的连接数。 为绘图数据库中的地图提供服务就是一个典型示例-读取数据库的速度很快,但每个页面加载需要将地图渲染为图像文件。

下图显示了如何通过 HALB,使用多个 CPU 提供相同的内容,以便在重负载条件下提供更快的响应速度。

如何使用 HALB 来利用多个 CPU 提供相同内容

服务器保持会话的配置-Bugzilla

配置示例只列出了设为非默认值的属性。

属性

说明

cookie_name

Bugzilla_logincookie

这是 Bugzilla 为其登录 Cookie 使用的名称

mode

passive

Bugzilla 为每个用户名/IP 地址组合发出唯一的 Cookie,因此连接到相同数据库的两个 bugzilla 实例绝不会返回相同的 Cookie。 因此,可以放心地使用最简单的 passive 模式。 对于其他服务器类型,sync 设置可能更合适。

使用 Cookie 对无会话服务器进行粘性负载均衡

对于没有会话但保存缓存数据并可能从持续定向到相同服务器的客户端受益的服务器,被动 Cookie 监控将不起作用,因为没有要监控的 Cookie。 在此情况下使用 insert 模式,如表中所示:

属性

说明

cookie_name

session_id

任意名称,但请确保它不同于服务器为其他对象使用的名称。

mode

insert

HALB 插入 Set-Cookie: 头

不使用 Cookie 与会话持久性对无会话服务器进行粘性负载均衡

某些客户端不支持 Cookie,或者会禁用 Cookie。 在此情况下,上面显示的示例不是最佳解决方案,因为客户端会忽略设置的 Cookie。 较佳解决方案是使用 HALB 的 source 运行模式,该模式基于请求源 IP 地址将流量定向到 Web 服务器。 此外,如果客户端同时使用多个网关访问 Internet,可以不将请求定向到相同的 Web 服务器。

属性

说明

mode

HALB 使用请求源 IP 地址作为密钥,将请求重定向到 Web 服务器。

带有基础架构运行状况检查的负载均衡

后端 Web 服务器运行状况检查成功并不能保证返回的数据为有效数据,或它所依赖的数据库仍然正常工作。 HALB 的一个与众不同的特征是不仅可以使用传统运行状况检查方法(只连接到 Web 服务器的端口 80),而且还可以使用更高级的方法,例如 http_head 和 http_get。 该功能的正确使用不仅有助于确保后端 Web 服务器的可用性,而且有助于确保其依存关系、数据库、应用和存储服务器。 该示例中使用了 HALB 的两个运行状况检查功能。 首先,创建了特殊文件 health_check.php,并在 healthcheck_url 属性中指定了该文件的完整 URL。 在访问该文件时,它会评估数据库、应用或 NAS 服务器的可用性,并返回包含文本 ALL_SERVICES_ARE_OK 的状态文档。 该值在 healthcheck_regexp 属性中指定。

HALB 使用 HTTP/1.1 GET 请求检查每个输出 (out1-out8),将 Host: HTTP 头和 /health_check.php 中的站点用作文档 URL。 这些值从 healthcheck_url 属性 (http://site/health_check.php) 中提取。 在从每个后端服务器检索的文档中,HALB 搜索 healthcheck_regexp 的值 (ALL_SERVICES_ARE_OK)。 如果找到该行,则认为服务器正在运行/已启动,否则将禁用输出终端。 如果已禁用输出,则以后 HALB 运行状况检查成功时,会重新启用输出。

在没有使用虚拟主机时,或后端服务器不支持 HTTP/1.1 协议时,可使用简单格式 (/health_check.php) 指定 healthcheck_url。 在此情况下,HALB 使用 HTTP/1.0 协议,并且不指定 Host: HTTP 头。

属性

说明

healthcheck_mode

http_get

HALB 使用 http_get 模式的运行状况检查。

healthcheck_url

http://site/health_check.php

HALB 检查的 URL。

healthcheck_regexp

ALL_SERVICES_ARE_OK

 

使用备份服务器

在所有后端服务器不可用时使用备份服务器,必须将有意义的消息或重定向页面提供给客户端,而不要提供错误或超时。 在下例中,备份服务器配置为最后使用的服务器,该服务器只提供静态页面,通知客户正在执行技术维护。 在所有四个服务器 (srv1 - srv4) 都关闭后,提供服务器备份的内容。

使用备份服务器

属性

说明

backup_outputs

out8

 

使用控制 Web 服务接口

使用控制 Web 服务接口可以通过动态方式和编程方式启用/禁用 HALB 的输出终端。 它还可用于检索所有输出终端的当前状态。 该接口通过 HALB 的 ctl 终端公开。

下图显示了包含多个 Web 服务器和数据库服务器的群集环境。 每个 Web 服务器和数据库服务器都与 HALB 的 ctl 终端建立了反馈连接。 如果 Web 服务器检测到数据库/连接/性能出现问题,它可以禁用相应的输出终端,从而命令 HALB 停止将流量定向到 Web 服务器。 同样,任何数据库服务器都可以禁用 HALB 的输出终端,从而禁用所有传入流量。 在解决问题之后,可以重新启用输出终端。

包含多个 Web 服务器和数据库服务器的群集环境

说明

组件内所用的开源和第三方软件

HALB 除了使用其基类 LUX5 所用的第三方开源软件包之外,还使用下列第三方/开源软件包。

软件

版本

已修改

许可

说明

haproxy

1.4.9

GPLv2

主页

php-thttpd

2.25b

BSD

N/A