ADC

用例 4: 特定于数据库的负载平衡

数据库服务器群不仅必须根据服务器的状态进行负载平衡,还必须根据每台服务器上数据库的可用性进行负载平衡。服务可能已启动,负载平衡设备可能显示其处于 UP 状态,但请求的数据库可能在该服务上不可用。如果将查询转发到数据库不可用的服务,则不会为请求提供服务。因此,负载平衡设备必须知道每项服务上数据库的可用性。而且,在做出负载平衡决策时,它必须仅考虑数据库可用的那些服务。

举个例子,假设数据库服务器 server1、server2 和 server3 托管数据库 mydatabase1 和 mydatabase2。如果 mydatabase1 在 server2 上变得不可用,则负载平衡设备必须意识到状态的变化。它必须仅在 server1 和 server3 之间对 mydatabase1 的请求进行负载平衡。在 mydatabase1 在 server2 上可用后,负载平衡设备必须将 server2 包括在负载平衡决策中。同样,如果 mydatabase2 在 server3 上不可用,则设备必须仅在 server1 和服务器 2 之间对 mydatabase2 的请求进行负载平衡。只有当 mydatabase2 可用时,它才必须将 server3 纳入其负载平衡决策中。这种负载平衡行为在服务器群托管的所有数据库中必须保持一致。

NetScaler 设备通过检索服务上所有处于活动状态的数据库的列表来实现此行为。要检索活动数据库的列表,设备使用配置了相应的 SQL 查询的监视器。如果请求的数据库在服务上不可用,则设备会将该服务排除在负载平衡决策之外,直到该服务可用为止。这种行为可确保为客户提供不间断的服务。

注意

只有 MSSQL 和 MySQL 服务类型支持数据库特定的负载平衡。这种支持也适用于 Microsoft SQL Server 2012 高可用性部署。

要设置数据库特定的负载平衡,必须配置以下内容:

  • 启用负载平衡功能,配置类型为 MSSQL 或 MySQL 的负载平衡虚拟服务器。
  • 配置托管数据库的服务,并将服务绑定到虚拟服务器。监视器需要有效的用户凭据才能登录到数据库服务器,因此您必须在每台服务器上配置一个数据库用户帐户,然后将该用户帐户添加到 NetScaler 设备。
  • 然后,配置 MSSQL-ECV 或 MYSQL-ECV 监视器并将该监视器绑定到每项服务。
  • 最后,您必须测试配置以确保其按预期运行。在执行这些配置任务之前,请务必了解数据库特定负载平衡的工作原理。

数据库特定负载平衡的工作原理

要实现数据库特定的负载平衡,您可以配置一个监视器,该监视器定期查询每个数据库服务器上所有活动数据库的名称。NetScaler 设备存储结果,并根据通过监视检索到的信息定期更新记录。当客户端查询特定数据库时,设备使用配置的负载平衡方法选择服务,然后检查其记录以确定该数据库在该服务上是否可用。如果记录表明数据库不可用,它将使用配置的负载平衡方法选择下一个可用服务,然后重复检查。设备将查询转发到数据库处于活动状态的第一个可用服务。

启用负载平衡

禁用负载平衡功能时,可以配置负载平衡实体,如服务和虚拟服务器。在您启用该功能之前,实体不会起作用。

使用 CLI 启用负载平衡

在命令提示符下,键入以下命令以启用负载平衡并验证配置:

enable ns feature LB

show ns feature
<!--NeedCopy-->

示例

> enable ns feature LoadBalancing
 Done
> show ns feature

        Feature                        Acronym              Status
        -------                        -------              ------
 1)     Web Logging                    WL                   OFF
 2)     Surge Protection               SP                   ON
 3)     Load Balancing                 LB                   ON
 .
 .
 .
 24)    NetScaler Push                 push                 OFF
 Done
<!--NeedCopy-->

使用 GUI 启用负载平衡

导航到“系统”>“设置”,然后在“配置基本功能”中选择“负载平衡”。

为数据库特定的负载平衡配置负载平衡虚拟服务器

要配置虚拟服务器以根据可用性对数据库进行负载平衡,请在虚拟服务器上启用数据库特定的负载平衡参数。启用该参数会修改负载平衡逻辑,以便 NetScaler 设备在将查询转发到选定服务之前引用发送到该服务的监视探测结果。

使用 CLI 配置负载平衡虚拟服务器以实现数据库特定的负载平衡

在命令提示符处,键入以下命令以配置负载平衡虚拟服务器以实现数据库特定的负载平衡并验证配置:

add lb vserver <name> <serviceType> <ipAddress> <port> -dbsLb ENABLED

show lb vserver <name>
<!--NeedCopy-->

配置服务

启用负载平衡功能后,必须为要包含在负载平衡设置中的每个应用程序服务器创建至少一项服务。您配置的服务提供了 NetScaler 设备和负载平衡服务器之间的连接。每个服务都有名称,并指定 IP 地址、端口和处理的数据类型。

如果您在未先创建服务器对象的情况下创建服务,则该服务的 IP 地址也是托管该服务的服务器的名称。如果您更喜欢按名称而不是 IP 地址来识别服务器,则可以创建服务器对象,然后在创建服务时指定服务器的名称而不是其 IP 地址。

配置数据库用户

在数据库中,连接始终是有状态的,这意味着在建立连接时,必须对其进行身份验证。

在 NetScaler 上配置您的数据库用户名和密码。例如,如果您在数据库上配置了用户 John,则也需要在 ADC 上配置用户 John。添加到 ADC 的数据库用户名和密码将添加到 nsconfig 文件中。

注意

名称区分大小写。

ADC 使用这些用户凭证对客户端进行身份验证,然后对服务器与数据库服务器的连接进行身份验证。

使用 CLI 添加数据库用户

在命令提示符下键入

add db user <username> - password <password>
<!--NeedCopy-->

示例

add db user nsdbuser -password dd260427edf
<!--NeedCopy-->

使用 GUI 添加数据库用户

导航到“系统”>“用户管理”>“数据库用户”,然后配置数据库用户。

如果您在数据库服务器上更改了数据库用户的密码,则必须重置在 NetScaler 设备上配置的相应用户的密码。

使用 CLI 重置数据库用户的密码

在命令提示符下键入

set db user <username> -password <password>
<!--NeedCopy-->

示例

set db user nsdbuser -password dd260538abs
<!--NeedCopy-->

使用 GUI 重置数据库用户的密码

导航到“系统”>“用户管理”>“数据库用户”,选择一个用户,然后输入新密码值。

如果数据库服务器上不再存在数据库用户,则可以从 NetScaler 设备中删除该用户。但是,如果该用户继续存在于数据库服务器上,并且您将该用户从 ADC 设备中删除,则使用此用户名的客户端发出的任何请求都无法通过身份验证。因此,用户名不会被路由到数据库服务器。

使用 CLI 删除数据库用户

在命令提示符下键入

rm db user <username>
<!--NeedCopy-->

示例

rm db user nsdbuser
<!--NeedCopy-->

使用 GUI 删除数据库用户

导航到“系统”>“用户管理”>“数据库用户”,选择一个用户,然后单击“删除”。

配置监视器以检索活动数据库的名称

您可以创建监视器来检索数据库实例上所有活动数据库的列表。监视器使用有效的用户凭据登录到数据库服务器并运行相应的 SQL 查询。您需要使用的 SQL 查询取决于您的 SQL 服务器部署。例如,在 MSSQL 数据库镜像设置中,您可以使用以下查询来检索服务器实例上可用的活动数据库列表。

select name from sys.databases where state=0
<!--NeedCopy-->

在 MySQL 数据库设置中,您可以使用以下查询来检索服务器实例上可用的活动数据库列表。

显示数据库

您还可以将监视器配置为评估错误条件的响应,并在没有错误时存储结果。如果响应包含错误,则监视器会将该服务标记为 DOWN。在不再出现错误之前,设备会将服务排除在负载平衡决策之外。

注意

只有 MSSQL 和 MySQL 服务类型支持数据库特定的负载平衡功能。因此,监视器类型必须是 MSSQL-ECV 或 MYSQL-ECV。

配置监视器以使用 CLI 检索服务上托管的所有活动数据库的名称

在命令提示符下,键入以下命令以检索服务上托管的所有活动数据库的名称并验证配置:

add lb monitor <monitorName> <type> -userName <string> -sqlQuery <text> -evalRule <expression> -storedb ENABLED

show lb monitor <monitorName>
<!--NeedCopy-->

配置监视器以使用 GUI 检索服务上托管的所有活动数据库的名称

  1. 导航到“流量管理”>“负载平衡”>“监视器”,然后配置 MSSQL-ECV 或 MYSQL-ECV 类型的监视器。
  2. 特殊参数中,指定用户名、查询和规则。例如,对于 MSSQL-ECV,查询必须是“从 sys.databases 中选择名称,其中 state=0”),规则必须是 MSSQL.RES.TYPE.NE(ERROR)。对于 MYSQL-ECV,查询必须是“显示数据库”,规则必须是 MYSQL.RES.TYPE.NE(ERROR)。

对 MSSQL 的可用性组部署支持

考虑以下场景,在该场景中,在高可用性组部署中配置了数据库特定的负载平衡。S1 到 S5 是 ADC 设备上的服务。DB1 到 DB4 是服务器上的数据库,由服务 S1 到 S5 表示。AV1 和 AV2 是可用性组。每个可用性组包含最多一个主数据库服务器实例和最多四个辅助数据库服务器实例。代表可用性组中服务器的服务可以是一个可用性组的主服务,也可以是另一个可用性组的辅助服务。每个可用性组包含不同的数据库和一个监听器,它是一种服务。所有请求都到达位于主数据库上的侦听器服务。AVI 包含数据库 DB1 和 DB2。AV2 包含数据库 DB3 和 DB4。L1 和 L2 分别是 AV1 和 AV2 上的监听器。S1 是 AV1 的主要服务,而 S2 是 AV2 的主要服务。

HA 部署 SQL

服务 服务上的活动数据库列表
S1 DB1、DB2、DB3、DB4
S2 DB3、DB4
S3 DB3、DB4
S4 DB1,DB2
S5 DB1,DB2
可用性组 数据库 代表可用性组中服务器的服务
AV1 DB1,DB2 S1, S4, S5
AV2 DB3、DB4 S1, S2, S3

查询流程如下:

  1. AV1 的 READ 查询在 S4 和 S5 之间实现了负载平衡。S1 是 AV1 的主节点。
  2. AV1 的 WRITE 查询被定向到 L1。
  3. AV2 的 READ 查询在 S1 和 S3 之间实现了负载平衡。S2 是 AV2 的主节点。
  4. AV1 的 WRITE 查询被定向到 L2。

示例配置

  1. 配置负载平衡和内容交换虚拟服务器。
    • add lb vserver lbwrite -dbslb enabled
    • add lbvserver lbread MSSQL -dbslb enabled
    • add csvserver csv MSSQL 1.1.1.10 1433
  2. 配置两个监听器服务,每个可用性组一个,以及五个代表数据库 DB1 到 DB4 的服务 S1 到 S5。
    • add service L1 1.1.1.11 MSSQL 1433
    • add service L2 1.1.1.12 MSSQL 1433
    • add service s1 1.1.1.13 MSSQL 1433
    • add service s2 1.1.1.14 MSSQL 1433
    • add service s3 1.1.1.15 MSSQL 1433
    • add service s4 1.1.1.16 MSSQL 1433
    • add service s5 1.1.1.17 MSSQL 1433
  3. 将服务绑定到负载平衡虚拟服务器。
    • bind lbvserver lbwrite L1
    • bind lbvserver lbwrite L2
    • bind lbvserver lbread s1
    • bind lbvserver lbread s2
    • bind lbvserver lbread s3
    • bind lbvserver lbread s4
    • bind lbvserver lbread s5
  4. 配置数据库用户。
    • add db user nsdbuser1 -password dd260427edf
    • add db user nsdbuser2 -password ccd1234xyzw
  5. 为每个侦听器服务配置两个监视器,即 monitor_L1 和 monitor_L2,以检索该可用性组中的活动数据库列表。添加监视器 monitor1 以检索辅助数据库服务器实例的数据库列表。
    • add lb monitor monitor_L1 MSSQL-ECV -userName user1 -sqlQuery "SELECT name FROM sys.databases a INNER JOIN sys.dm_hadr_availability_replica_states b ON a.replica_id=b.replica_id INNER JOIN sys.availability_group_listeners c on b.group_id = c.group_id INNER JOIN sys.availability_group_listener_ip_addresses d on c.listener_id = d.listener_id WHERE b.role = 1 and d.ip_address like '1.1.1.11'" -evalRule "MSSQL.RES.TYPE.NE(ERROR)” –storedb ENABLED
    • add lb monitor monitor_L2 MSSQL-ECV -userNameuser1 -sqlQuery "SELECT name FROM sys.databases a INNER JOIN sys.dm_hadr_availability_replicca_states b ON a.replica_id=b.replica_id INNER JOIN sys.availability_group_listeners c on b.group_id = c.group_id INNER JOIN sys.availability_group_listener_ip_addresses d on c.listener_id = d.listener_id WHERE b.role = 1 and d.ip_address like '1.1.1.12'" -evalRule "MSSQL.RES.TYPE.NE(ERROR)" -storedb ENABLED
    • add lb monitor monitor1 MSSQL-ECV -userNameuser1 -sqlQuery "SELECT name FROM sys.databases a INNER JOIN sys.dm_hadr_availability_replica_states b ON a.replica_id=b.replica_id WHERE b.role = 2" -evalRule "MSSQL.RES.TYPE.NE(ERROR)" -storedb ENABLED
  6. 配置读取和写入策略。
    • add cs policy pol_write -rule "MSSQL.REQ.QUERY.TEXT.CONTAINS("insert")"
    • add cs policy pol_read -rule "MSSQL.REQ.QUERY.TEXT.CONTAINS("select")"
  7. 将策略绑定到内容交换虚拟服务器。
    • bind csvserver csv -targetLBVserver lbwrite -policyName pol_write -priority 11
    • bind csvserver csv -targetLBVserver lbread -policyName pol_read -priority 12
  8. 将监视器绑定到服务。将监视器绑定到服务 L1 和 L2 以获取其作为侦听器的可用性组的活动数据库列表。将监视器绑定到绑定到只读虚拟服务器的所有服务。
    • bind service L1 -monitorName monitor_L1
    • bind service L2 -monitorName monitor_L2
    • bind service s1 -monitorName monitor1
    • bind service s2 -monitorName monitor1
    • bind service s3 -monitorName monitor1
    • bind service s4 -monitorName monitor1
    • bind service s5 -monitorName monitor1

MSSQL 虚拟服务器的配置示例

要为数据库特定的负载平衡配置负载平衡虚拟服务器,请执行以下操作:

add lb vserver DBSpecificLB1 MSSQL 192.0.2.10 1433 -dbsLb ENABLED

Done

show lb vserver DBSpecificLB1

DBSpecificLB1 (192.0.2.10:1433) - MSSQL Type: ADDRESS
. . .
DBS_LB: ENABLED

Done
<!--NeedCopy-->

要配置服务,请执行以下操作:

add service msservice1 5.5.5.5 MSSQL 1433

使用命令行配置监视器以检索服务上托管的所有活动数据库的名称

add lb monitor mssql-monitor1 MSSQL-ECV -userName user1 -sqlQuery "select name from sys.databases where state=0" -evalRule "MSSQL.RES.TYPE.NE(ERROR)" -storedb EN

Done

show lb monitor mssql-monitor1

1)   Name.......: mssql-monitor1    Type......: MSSQL-ECV

...

Special parameters: Database.....:""

User name.....:"user1"

Query..:select name from sys.databases where state=0 EvalRule...:MSSQL.RES.TYPE.NE(ERROR)

Version...:70 STORE_DB...:ENABLED

Done
<!--NeedCopy-->

MySQL 虚拟服务器的配置示例

要为数据库特定的负载平衡配置负载平衡虚拟服务器,请执行以下操作:

add lb vserver DBSpecificLB1 MYSQL 192.0.2.10 3306 -dbsLb ENABLED

Done

show lb vserver DBSpecificLB1

DBSpecificLB1 (192.0.2.10:3306) - MYSQL Type: ADDRESS

. . .

DBS_LB: ENABLED

Done
<!--NeedCopy-->

要配置服务,请执行以下操作:

add service msservice1 5.5.5.5 MYSQL 3306
<!--NeedCopy-->

使用命令行配置监视器以检索服务上托管的所有活动数据库的名称

add lb monitor mysql-monitor1 MYSQL-ECV -userName user1 -sqlQuery "show databases" -evalRule "MYSQL.RES.TYPE.NE(ERROR)" -storedb ENABLED

Done

show lb monitor mysql-monitor1

1)     Name.......: mysql-monitor1  Type......: MYSQL-ECV  State....:  ENABLED

...

Special parameters: Database.....:""

User name.....:"user1" Query..:show databases

EvalRule...:MYSQL.RES.TYPE.NE(ERROR) STORE_DB...:ENABLED

Done
<!--NeedCopy-->