ADC

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

数据库服务器场不仅必须根据服务器的状态进行负载平衡,还必须根据每台服务器上数据库的可用性进行负载平衡。服务可能已启动,并且负载平衡设备可能会显示它处于 UP 状态,但请求的数据库在该服务上可能不可用。如果查询被转发到数据库不可用的服务,则不会满足请求。因此,负载平衡设备必须了解每个服务上的数据库的可用性。在做出负载平衡决策时,它必须仅考虑数据库可用的那些服务。

例如,请考虑数据库服务器 server1、Server2 和 server3 托管数据库 mydatabase1 和 mydatabase2。如果 mydatabase1 在 server2 上变得不可用,则负载平衡设备必须意识到状态更改。它必须仅在 server1 与 server3 之间对 mydatabase1 的请求进行负载平衡。mydatabase1 在 server2 上变为可用后,负载平衡设备必须在负载平衡决策中包含 server2。同样,如果 mydatabase2 在 server3 上变得不可用,则设备必须仅在 server1 和 server2 之间对 mydatabase2 的请求进行负载平衡。仅当 mydatabase2 变为可用时,它必须在其负载平衡决策中包含 server3。此负载平衡行为必须在服务器场上托管的所有数据库中保持一致。

Citrix ADC 设备通过检索服务上处于活动状态的所有数据库的列表来实现此行为。要检索活动数据库的列表,设备使用配置了适当 SQL 查询的监视器。如果请求的数据库在服务上不可用,则设备将服务排除在负载平衡决策中,直到服务变为可用。此行为确保不间断地向客户端提供服务。

注意

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

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

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

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

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

启用负载平衡

禁用负载平衡功能时,可以配置负载平衡实体,如服务和虚拟服务器。在启用特征之前,图元才能正常工作。

使用 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 启用负载平衡

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

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

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

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

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

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

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

配置服务

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

如果在不首先创建服务器对象的情况下创建服务,则服务的 IP 地址也是承载服务的服务器的名称。如果希望通过名称而不是 IP 地址来标识服务器,则可以创建服务器对象,然后在创建服务时指定服务器的名称而不是其 IP 地址。

配置数据库用户

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

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

注意

姓名区分大小写。

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

使用 CLI 添加数据库用户

在命令提示符下键入

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

例如

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

使用 GUI 添加数据库用户

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

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

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

在命令提示符下键入

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

例如

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

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

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

如果数据库服务器上不再存在数据库用户,则可以从 Citrix ADC 设备中删除该用户。但是,如果用户继续存在于数据库服务器上,并且您从 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 数据库设置中,您可以使用以下查询检索服务器实例上可用的活动数据库列表。

显示数据库

您还可以将监视器配置为评估错误条件的响应,并在没有错误时存储结果。如果响应包含错误,监视器将服务标记为 DOP。设备将服务从负载平衡决策中排除,直到不再返回错误为止。

注意

仅 MSSQL 和 MySQL 服务类型支持数据库特定的负载平衡功能。因此,监视器类型必须是 MSSQL-ECV 或神秘的 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,查询必须是“select name from sys.databases where state=0”),并且规则必须是 MSSQL.RES.TYPE.NE(ERROR)。对于 MYQL-ECV,查询必须是“show databases”,并且规则必须是 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 的读取查询是在 S4 和 S5 之间进行负载平衡的。S1 是 AV1 的主要用途。
  2. AV1 的写查询被定向到 L1。
  3. AV2 的读取查询是在 S1 和 S3 之间进行负载平衡的。S2 是 AV2 的主要用途。
  4. AV1 的写查询被定向到 L2。

示例配置

  1. 配置负载平衡和内容交换虚拟服务器。
    • add lb vserver lbwrite -dbslb enabled
    • add lbvserver lbread MSSQL -dbslb enabled
    • add csvserver csv MSSQL 1.1.1.10 1433
  2. 配置两个侦听器服务(每个可用性组一个)和五个服务 S1 到 S5,表示数据库 DB1 到 DB4。
    • 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-->