Citrix ADC

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

数据库服务器群必须不仅基于服务器的状态,而且基于每台服务器上数据库的可用性进行负载平衡。服务可能处于up状态,负载平衡设备可能将其显示为up状态,但请求的数据库可能在该服务上不可用。如果查询被转发到数据库不可用的服务,则该请求不会被服务。因此,负载均衡设备必须了解每个服务上的数据库的可用性。在做出负载平衡决策时,它必须只考虑数据库可用的那些服务。

例如,考虑数据库服务器server1、server2和server3承载数据库mydatabase1和mydatabase2。如果server2上的mydatabase1变得不可用,负载平衡设备必须知道这种状态变化。它必须只在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缩合词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添加数据库用户

在命令提示符下,键入

添加db用户 - password  

例子

添加数据库用户dd260427edf 

该任务指导管理员通过图形方式添加数据库用户

导航到系统>用户管理>数据库用户,并配置数据库用户。

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

该任务指导管理员通过CLI重置数据库用户密码

在命令提示符下,键入

设置db user  -password  

例子

设置数据库用户dd260538abs 

该任务指导管理员通过GUI方式重置数据库用户密码

导航到系统>用户管理>数据库用户,选择用户,并输入新的密码。

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

该任务指导管理员通过命令行删除数据库用户

在命令提示符下,键入

Rm db user  

例子

Rm dbuser nsdbuser 

该任务指导管理员通过GUI方式删除数据库用户

导航到系统>用户管理>数据库用户,选择用户,单击删除

配置一个监视器来检索活动数据库的名称

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

从sys中选择name。状态=0 

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

显示数据库

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

请注意

数据库负载均衡特性仅支持MSSQL和MySQL服务类型。因此,监视器类型必须是MSSQL-ECV或MYSQL-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.”数据库where state=0 "),规则必须是MSSQL.RES.TYPE.NE(ERROR)。对于MYSQL-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 and L2 are the listeners on AV1 and AV2 respectively. S1 is the primary service for AV1 and S2 is the primary service for 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的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
    • 添加lbvserver lbread MSSQL -dbslb enabled
    • add csvserver csv MSSQL 1.1.1.10 1433
  2. 配置两个侦听器服务,一个用于每个可用性组,五个服务S1到S5代表数据库DB1到DB4。
    • 添加服务L1 1.1.1.11 MSSQL 1433
    • 添加服务L2 1.1.1.12 MSSQL 1433
    • 添加服务s1 1.1.1.13 MSSQL 1433
    • 添加服务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
    • 添加服务s5 1.1.1.17 MSSQL 1433
  3. 将服务绑定到负载均衡虚拟服务器。
    • 绑定lbvserver lbwrite L1
    • 绑定lbvserver lbwrite L2
    • 绑定lbvserver lbread s1
    • 绑定lbvserver lbread s2
    • 绑定lbvserver lbread s3
    • 绑定lbvserver lbread s4
    • 绑定lbvserver lbread s5
  4. 配置数据库用户
    • 添加数据库用户nsdbuser1 -密码dd260427edf
    • 增加数据库用户nsdbuser2 -密码ccd1234xyzw
  5. 为每个侦听器服务配置两个监视器monitor_L1和monitor_L2,以检索可用性组中的活动数据库列表。添加监视器monitor1以检索辅助数据库服务器实例的数据库列表。
    • add lb monitor monitor_L1 MSSQL-ECV -userName user1 -sqlQuery "SELECT name FROM sys. exe "数据库内部连接系统。dm_hadr_availability_replica_states b ON a.replica_id=b。replica_id INNER JOIN系统。availability_group_listeners c on b.group_id = c.group_id INNER JOIN sys。WHERE b.role = 1 and d.ip_address like '1.1.1.11'" -evalRule "MSSQL.RES.TYPE.NE(ERROR) " -storedb ENABLED . d on c.listener_id = d.listener_id WHERE b.role = 1 and d.ip_address like '1.1.1.11'
    • add lb monitor monitor_L2 MSSQL-ECV -userNameuser1 -sqlQuery "SELECT name FROM sys. exe "数据库内部连接系统。dm_hadr_availability_replicca_states b ON a.replica_id=b。replica_id INNER JOIN系统。availability_group_listeners c on b.group_id = c.group_id INNER JOIN sys。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启用
    • add lb monitor monitor1 MSSQL-ECV -userNameuser1 -sqlQuery "SELECT name FROM sys. exe "数据库内部连接系统。dm_hadr_availability_replica_states b ON a.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. 将策略绑定到内容切换虚拟服务器。
    • 11 . bind csvserver csv -targetLBVserver lbwrite -policyName pol_write -priority
    • 12 . 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: ADDRESSDBS_LB: ENABLED Done 

配置服务

添加服务msservice1 5.5.5.5 MSSQL 1433

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

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

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: ADDRESSDBS_LB: ENABLED Done 

配置服务

添加服务msservice1 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 Done show lb monitor mysql-monitor1 1)名称.......: mysql-monitor1输入......: MYSQL-ECV State....: enabled…特殊参数:数据库.....:""用户名.....:“user1”查询. .:show databases EvalRule...:MYSQL.RES.TYPE.NE(ERROR) STORE_DB...:ENABLED Done