本主题将详细介绍 NSX Advanced Load Balancer 上提供的 DataScript 池函数的规范。

函数

描述

avi.pool.get_server_status( pool, server, port )

返回服务器的已启动/已关闭状态

avi.pool.get_servers( pool )

返回已启动的服务器总数

avi.pool.select( pool [, server [, port]] )

选取特定池

avi.pool.server_ip()

返回选定服务器的 IP 地址

avi.pool.get_server_info()

返回服务器的 IP 地址和端口

avi.poolgroup.select( pool )

选择特定的池组

avi.pool.chash( string )

设置一致哈希负载均衡算法哈希处理的字符串值,以在选定池中选择服务器。

注:

NSX Advanced Load Balancer 版本 22.1.3 开始,支持将一致哈希作为池组的负载均衡算法。

avi.pool.get_server_status

函数

avi.pool.get_server_status(pool, server, port)

描述

确定侦听指定端口的服务器的状态。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

所有三个参数字段均为必填字段。

  • pool 可以是特定的池名称,也可以是求值结果为有效池名称的表达式。

  • server 标记是服务器的 IPv6 地址,用引号括起。

  • port 标记将连接转发到服务器的特定服务端口。port 必须是介于 0 与 65536 之间的数字或求值结果为有效端口号的表达式。

返回

返回值 0 表示服务器状态为 down。返回值 1 表示服务器状态为 up

示例

如果服务器已关闭,请按以下方式将流量重定向到其他位置:

if avi.pool.get_server_status("web-pool", "10.1.1.1", "80") == 0 then
   avi.http.redirect("backupsite.com" .. avi.http.get_uri())
 end

avi.pool.get_servers

函数

avi.pool.get_servers( pool )

描述

检查处于“已启动”状态的服务器数以及所指定池中配置的服务器总数。

事件

  • HTTP_REQ

  • HTTP_RESP

参数

pool 可以是池名称,也可以是求值结果为有效池名称的表达式。

返回

返回池中已启动的服务器数和服务器总数。

示例

将请求转发到显式目标。

servers_up, servers_total = avi.pool.get_servers("web-pool")
   if servers_up == 0 then
   avi.http.response(503)
end

avi.pool.select

函数

avi.pool.select( pool [, server [, port]] )

描述

为当前请求选择池或池中的特定服务器。如果 HTTP 请求策略还配置了切换操作以选择池或池中的特定服务器,则选择不会生效。HTTP 请求策略的切换操作优先于 DataScript 的池选择。

事件

HTTP_REQ

参数

pool 可以是特定的池名称,也可以是求值结果为有效池名称的表达式。

server 参数(字符串)是服务器的 IPv4 地址,用引号括起。可选的 port 参数(整数)会将连接转发到服务器的特定服务端口。port 必须是介于 0 与 65536 之间的数字或求值结果为有效端口号的表达式。

注意事项

可以明确调用也可以根据 Lua 表达式动态确定池名称、服务器名称或 IP 以及服务器端口。如果池名称、服务器或服务器端口不存在或无法由虚拟服务引用,则会生成错误。

  • 显式引用:保存 DataScript 时将生成配置错误。

  • 动态生成的引用:将生成运行时错误,这会导致向客户端返回 500 错误。

返回

不返回任何值

相关

avi.poolgroup.select() - 为当前请求选择一个池组。

示例 1

将请求转发到显式目标。

if avi.http.get_path() == "/sales/" then
   avi.pool.select("sales-pool")
elseif avi.http.get_path () == "/engineering/" then
   avi.pool.select("engineering-pool", "apache1")
elseif avi.http.get_path () == "/marketing/" then
   avi.pool.select("marketing", "10.10.31.201")
end

示例 2

将请求转发到动态生成的目标。

www.avi.com/support/index.htm would go to the support pool www.avi.com/sales/apac/index.htm会转到 sales 池

avi.pool.select(avi.http.get_path_tokens(1, 1))

示例 3

将请求转发到指定服务器。

var = "abcd" avi.pool.select("poolx", var)
注:

IPv6 不支持池选择功能。

avi.pool.server_ip

函数

avi.pool.server_ip()

描述

返回此请求或响应的服务器的 IPv6 地址。请记住,通过内容切换或多路复用,单个客户端连接可能具有多个请求,每个请求分配到不同的服务器。

事件

HTTP_RESP

参数

返回

返回服务器 IP 地址的字符串

示例

avi.http.add_header("Server", avi.pool.server_ip())
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLOSSL_HANDSHAKE_DONE 不支持此 API。

avi.pool.get_server_info

函数

avi.pool.server_info()

描述

返回此请求或响应的服务器的 IPv6 地址和端口。

注:

通过内容切换或多路复用,单个客户端连接可能具有多个请求,每个请求将分发到不同的服务器。

事件

  • HTTP_RESP

  • LB_DONE

参数

返回

服务器的 IP 地址(字符串)及其端口号

注意事项

可以明确调用也可以根据 Lua 表达式动态确定池名称、服务器名称或 IP 以及服务器端口。如果池名称、服务器或服务器端口不存在或无法由虚拟服务引用,则会生成错误。

  • 显式引用:保存 DataScript 时将生成配置错误。

  • 动态生成的引用:将生成运行时错误,这会导致向客户端返回 500 错误。

相关

avi.pool.get_server_status(),确定侦听指定端口的服务器的状态。

示例

ip, port = avi.pool.get_server_info()

avi.poolgroup.select

函数

avi.poolgroup.select( poolgroup )

描述

为当前请求选择一个池组。如果 HTTP 请求策略还配置了用于选择池的切换操作,则选择不会生效。HTTP 请求策略的切换操作优先于 DataScript 的池组选择。

事件

HTTP_REQ

参数

poolgroup 可以是特定的池名称,也可以是求值结果为有效池名称的表达式。

返回

可以明确调用也可以根据 Lua 表达式动态确定池组名称。如果池组名称不存在或无法由虚拟服务引用,则会生成错误。

  • 显式引用:保存 DataScript 时将生成配置错误。

  • 动态生成的引用:将生成运行时错误,这会导致向客户端返回 500 错误。

注意事项

不返回任何值

相关

avi.pool.select() - 为当前请求选择一个池。

示例

将请求转发到显式目标。

if avi.http.get_path() == "/test/" then
avi.poolgroup.select("test-poolgroupl")
else
avi.poolgroup.select("defaut-poolgroup")
end

avi.pool.chash

函数

avi.pool.chash ( string )

描述

设置一致哈希负载均衡算法哈希处理的字符串值,以在选定池中选择服务器。

事件

HTTP_REQ

参数

必须指定字符串值,并且可以通过任何方式创建。

返回

无返回值

示例

如果请求中存在名称为 custom-hash 的标头,则将其值用作“具有自定义数据的一致哈希”负载均衡算法的输入,以从名为 pool-of-servers 的池中选择一个服务器。应该将池配置为将其负载平衡算法设置为“自定义数据上的一致哈希”。

hash = avi.http.get_header("custom-hash")
if hash then
   avi.pool.select("pool-of-servers")
   avi.pool.chash(hash)
end