Citrix ADC

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

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

例如,请考虑数据库服务器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 

例如

> enable ns feature LoadBalancing Done > show ns feature feature Acronym Status ------- ------- ------ 1) Web Logging WL OFF 2) Surge Protection SP ON 3) LoadBalancing LB ON…24) NetScaler Push Push OFF Done 

使用GUI启用负载平衡

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

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

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

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

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

add lb vserver     -dbsLb ENABLED show lb vserver  

配置服务

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

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

配置数据库用户

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

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

注意

姓名区分大小写。

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

使用cli添加数据库用户

在命令提示符下键入

添加数据库用户<用户名> -密码<密码> 

例如

增加数据库用户nsbuser -password dd260427edf 

使用GUI添加数据库用户

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

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

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

在命令提示符下键入

设置db user  -password  

例如

设置数据库用户nsbuser -password dd260538abs 

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

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

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

使用cli删除数据库用户

在命令提示符下键入

Rm db user  

例如

Rm dbuser nssdbuser 

使用GUI删除数据库用户

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

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

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

从sys中选择名称。其中state=0 

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

显示数据库

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

注意

仅MSSQL和MySQL服务类型支持数据库特定的负载平衡功能。因此,监视器类型必须是mssql-ecv或神秘的ecv。

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

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

add lb monitor   -userName  -sqlQuery  -evalRule  -storedb ENABLED show lb monitor  

使用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 DB4, DB4
S3 DB4, DB4
S4 DB1、DB2
S5 DB1、DB2
可用性组 数据库 代表可用性组中服务器的服务
AV1 DB1、DB2 S1, S4, S5
AV2 DB4, DB4 S1、S2、S3

查询流程如下:

  1. Av1的读取查询是在s4和s5之间进行负载平衡的。S1是av1的主要用途。
  2. Av1的写查询被定向到l1。
  3. Av2的读取查询是在s1和s3之间进行负载平衡的。S2是av2的主要用途。
  4. Av1的写查询被定向到l2。

示例配置

  1. 配置负载平衡和内容交换虚拟服务器。
    • 启用lb vserver lbwrite -dbslb功能
    • 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
    • 绑定lbvserver lbwrite L2
    • 绑定lbvserver lbread s1
    • 绑定lbvserver lbread s2
    • 绑定lbvserver lbread s3
    • 绑定lbvserver lbread s4
    • 绑定lbvserver lbread s5
  4. 配置数据库用户。
    • 添加数据库用户nsbuser1 -密码dd260427edf
    • 添加数据库用户nsbuser2 -密码ccd1234xyzw
  5. 为每个侦听器服务配置两个监视器,即Monitor_L1和Monitor_L2,以检索该可用性组中的活动数据库列表。添加监视器monitor1以检索辅助数据库服务器实例的数据库列表。
    • add lb monitor monitor_L1 MSSQL-ECV -userName user1 -sqlQuery "SELECT name FROM sys. name "数据库内部连接系统。dm_hadr_availability_replica_states b ON .replica_id=b。sys. replica_id INNER JOIN。availability_group_listeners c on b.group_id = c.group_id INNER JOINavailability_group_listener_ip_addresses d on c.listener_id = d.listener_id WHERE b.role = 1 and d.l 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. name "数据库内部连接系统。dm_hadr_availability_replicca_states b ON .replica_id=b。sys. replica_id INNER JOIN。availability_group_listeners c on b.group_id = c.group_id INNER JOINWHERE b.role = 1 and d.ip_address like '1.1.1.12'" -evalRule "MSSQL.RES.TYPE.NE(ERROR)"-storedb启用
    • add lb monitor monitor1 MSSQL-ECV -userNameuser1 -sqlQuery "SELECT name FROM sys. name "数据库内部连接系统。dm_hadr_availability_replica_states b ON .replica_id=b。WHERE b.role = 2" -evalRule "MSSQL.RES.TYPE.NE(ERROR)"-storedb启用
  6. 配置读取和写入策略。
    • 添加cs策略pol_write -rule "MSSQL.REQ.QUERY.TEXT.CONTAINS("insert")"
    • 添加cs策略pol_read -rule "MSSQL.REQ.QUERY.TEXT.CONTAINS("select")"
  7. 将策略绑定到内容交换虚拟服务器。
    • bind csvserver csv -targetLBVserver lbwrite -policyName pol_write -priority
    • bind csvserver csv -targetLBVserver lbread -policyName pol_read -priority
  8. 将监视器绑定到服务。将监视器绑定到服务L1 和 L2 以获取它作为侦听器的可用性组的活动数据库列表。将监视器绑定到绑定到只读虚拟服务器的所有服务。
    • 绑定服务L1 -monitorName monitor_L1
    • 绑定服务L2 -monitorName monitor_L2
    • 绑定服务s1 -monitorName monitor1
    • 绑定服务s2 -monitorName monitor1
    • 绑定服务s3 -monitorName monitor1
    • 绑定服务s4 -monitorName monitor1
    • 绑定服务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 

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

添加服务5.5.5.5 MSSQL 1433 .使用实例

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

add lb monitor mssql-monitor1 MSSQL-ECV -userName user1 -sqlQuery "select name from sys. name "数据库状态=0" -evalRule "MSSQL.RES.TYPE.NE(ERROR)"-storedb EN Done显示lb monitor mssql-monitor1 1)名称.......: mssql-monitor1类型……: MSSQL-ECV…特殊的参数:数据库……:“用户名…:“user1”查询. .:从sys中选择名称。database where state=0 EvalRule…:MSSQL.RES.TYPE.NE(ERROR) Version…: 70 STORE_DB……:在ABLED Done 

MySQL虚拟服务器的配置示例

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

add lb vserver DBSpecificLB1 MYSQL 192.0.2.10 3306 - dbslb ENABLED完成显示lb vserver DBSpecificLB1 DBSpecificLB1 (192.0.2.10:3306) - MYSQL类型:ADDRESS…DBS_LB: ENABLED Done 

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

5.5.5.5 MYSQL 3306 

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

add lb monitor mysql-monitor1 MYSQL-ECV -userName user1 -sqlQuery "show databases" -evalRule "MYSQL.RES.TYPE.NE(ERROR)"-storedb ENABLED完成显示lb monitor mysql-monitor1 1)名称.......: mysql-monitor1类型……: MYSQL-ECV状态……:使…特殊的参数:数据库……:“用户名…:“user1”查询. .:show databases EvalRule...:MYSQL.RES.TYPE.NE(ERROR) STORE_DB...:ENABLED Done