Citrix ADC

使用例 4: データベース固有の負荷分散

データベースサーバーファームは、サーバーの状態だけでなく、各サーバーのデータベースの可用性にも基づいて負荷分散する必要があります。サービスが稼働している可能性があり、負荷分散デバイスでは稼働状態と表示されますが、要求されたデータベースがそのサービスでは利用できない可能性があります。データベースが使用できないサービスにクエリが転送された場合、要求は提供されません。したがって、負荷分散デバイスは、各サービス上のデータベースの可用性を認識する必要があります。また、負荷分散を決定する際には、データベースが使用可能なサービスのみを考慮する必要があります。

たとえば、データベースサーバー server1、server2、および server3 がデータベース mydatabase1 および mydatabase2 をホストしているとします。mydatabase1 が server2 で使用不能になった場合、負荷分散デバイスはその状態の変化を認識する必要があります。mydatabase1 に対する要求を server1 と server3 に対してのみ負荷分散する必要があります。mydatabase1 が server2 で使用可能になったら、負荷分散の決定に server2 を含める必要があります。同様に、mydatabase2 が server3 で使用不能になった場合、デバイスは mydatabase2 に対する要求を server1 と server2 に対してのみ負荷分散する必要があります。mydatabase2 が使用可能になった場合にのみ、負荷分散の決定に server3 を含める必要があります。この負荷分散の動作は、サーバーファームでホストされているすべてのデータベース間で一貫している必要があります。

Citrix ADCアプライアンスは、サービス上でアクティブなすべてのデータベースのリストを取得することによって、この動作を実装します。アクティブなデータベースのリストを取得するには、アプライアンスは適切なSQLクエリで構成されたモニターを使用します。要求されたデータベースがサービス上で利用できない場合、アプライアンスはサービスを使用可能になるまで負荷分散の決定から除外します。この動作により、クライアントへのサービスが中断されることはありません。

データベース固有の負荷分散は、MSSQL および MySQL サービスタイプでのみサポートされます。このサポートは、Microsoft SQL Server 2012年の高可用性展開でも利用できます。

データベース固有の負荷分散を設定するには、以下を設定する必要があります。

  • 負荷分散機能を有効にし、タイプが MSSQL または MySQL の負荷分散仮想サーバーを構成します。
  • データベースをホストするサービスを構成し、サービスを仮想サーバーにバインドします。モニターでデータベースサーバーにログオンするには、有効なユーザー資格情報が必要です。そのため、各サーバーでデータベースユーザーアカウントを構成し、そのユーザーアカウントをCitrix ADCアプライアンスに追加する必要があります。
  • 次に、MSSQL-ECV または MYSQL-ECV モニターを構成し、モニターを各サービスにバインドします。
  • 最後に、設定をテストして、意図したとおりに動作していることを確認する必要があります。これらの構成タスクを実行する前に、データベース固有の負荷分散の仕組みを理解しておいてください。

データベース固有のロード・バランシングの仕組み

データベース固有のロード・バランシングでは、各データベース・サーバにあるすべてのアクティブなデータベースの名前を定期的に照会するモニターを設定します。Citrix ADCアプライアンスは結果を格納し、監視によって取得した情報に基づいてレコードを定期的に更新します。クライアントが特定のデータベースに問い合わせると、アプライアンスは設定された負荷分散方式を使用してサービスを選択し、そのレコードをチェックして、そのサービスでデータベースが使用可能かどうかを判断します。レコードでデータベースが使用できないことが示されている場合、構成された負荷分散方法を使用して次に使用可能なサービスを選択し、チェックを繰り返します。アプライアンスは、データベースがアクティブである最初に使用可能なサービスにクエリーを転送します。

負荷分散の有効化

負荷分散機能が無効になっている場合、サービスや仮想サーバーなどの負荷分散エンティティを構成できます。エンティティは、この機能を有効にするまで機能しません。

コマンドラインインターフェイスを使用して負荷分散を有効にするには

コマンドプロンプトで次のコマンドを入力して、負荷分散を有効にし、構成を確認します。

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)     Load Balancing                 LB                   ON
 .
 .
 .
 24)    NetScaler Push                 push                 OFF
 Done

構成ユーティリティを使用して負荷分散を有効にするには

[システム] > [設定] に移動し、[基本機能の構成] で [負荷分散] を選択します。

データベース固有のロード・バランシング用のロード・バランシング仮想サーバーの構成

可用性に基づいてデータベースを負荷分散するように仮想サーバーを構成するには、仮想サーバーでデータベース固有の負荷分散パラメーターを有効にします。このパラメータを有効にすると、負荷分散ロジックが変更され、Citrix ADCアプライアンスが選択したサービスに送信された監視プローブの結果を参照してから、そのサービスにクエリが転送されます。

データベース固有のロード・バランシング用にロード・バランシング仮想サーバーを構成するには

コマンドプロンプトで次のコマンドを入力して、データベース固有の負荷分散用に負荷分散仮想サーバーを構成し、構成を確認します。

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

show lb vserver <name>

サービスを構成しています

負荷分散機能を有効にした後、負荷分散設定に含めるアプリケーションサーバーごとに少なくとも 1 つのサービスを作成する必要があります。構成するサービスは、Citrix ADCアプライアンスと負荷分散サーバー間の接続を提供します。各サービスには名前があり、IP アドレス、ポート、および提供されるデータの種類を指定します。

最初にサーバオブジェクトを作成せずにサービスを作成する場合、サービスの IP アドレスもサービスをホストするサーバの名前になります。サーバーを IP アドレスではなく名前で識別する場合は、サーバーオブジェクトを作成し、サービスの作成時に IP アドレスの代わりにサーバー名を指定できます。

データベース・ユーザーの構成

データベースでは、接続は常にステートフルです。つまり、接続が確立されると、認証される必要があります。

Citrix ADCでデータベースのユーザー名とパスワードを設定する必要があります。たとえば、データベースにユーザー John が設定されている場合は、ADC にもユーザー John を設定する必要があります。ADC でデータベースユーザー名とパスワードを追加すると、nsconfig ファイルに追加されます。

名前では、大文字と小文字が区別されます。

ADC は、これらのユーザー資格情報を使用してクライアントを認証し、データベースサーバーとのサーバー接続を認証します。

コマンドラインインターフェイスを使用してデータベースユーザーを追加するには

コマンドプロンプトで、次のように入力します。

add db user <username> - password <password>

:

add db user nsdbuser -password dd260427edf

構成ユーティリティを使用してデータベース・ユーザーを追加するには

[システム] > [ユーザ管理] > [データベースユーザ] に移動し、データベースユーザを設定します。

データベースサーバーでデータベースユーザーのパスワードを変更した場合は、Citrix ADCアプライアンスで構成されている対応するユーザーのパスワードをリセットする必要があります。

コマンドラインインターフェイスを使用してデータベースユーザーのパスワードをリセットするには

コマンドプロンプトで、次のように入力します。

set db user <username> -password <password>

:

set db user nsdbuser -password dd260538abs

構成ユーティリティを使用してデータベースユーザーのパスワードをリセットするには

[システム] > [ユーザー管理] > [データベースユーザー] に移動し、ユーザーを選択して、パスワードの新しい値を入力します。

データベースサーバー上にデータベースユーザーが存在しなくなった場合は、Citrix ADCアプライアンスからユーザーを削除できます。ただし、ユーザがデータベースサーバ上に存在し続け、ADC アプライアンスからそのユーザを削除すると、このユーザ名のクライアントからの要求は認証されません。したがって、ユーザー名はデータベースサーバーにルーティングされません。

コマンドラインインターフェイスを使用してデータベースユーザーを削除するには

コマンドプロンプトで、次のように入力します。

rm db user <username>

:

rm db user nsdbuser

構成ユーティリティを使用してデータベース・ユーザーを削除するには

[システム] > [ユーザ管理] > [データベースユーザ] に移動し、ユーザを選択して [削除] をクリックします。

アクティブなデータベースの名前を取得するためのモニタの設定

モニタを作成して、データベース・インスタンス上のすべてのアクティブ・データベースのリストを取得できます。モニターは、有効なユーザー資格情報を使用してデータベースサーバーにログオンし、適切な SQL クエリを実行します。使用する必要がある SQL クエリは、SQL サーバーのデプロイメントによって異なります。たとえば、MSSQL データベースミラーリングのセットアップでは、次のクエリを使用して、サーバーインスタンスで使用可能なアクティブなデータベースの一覧を取得できます。

select name from sys.databases where state=0

MySQL データベース設定では、次のクエリを使用して、サーバーインスタンスで使用可能なアクティブなデータベースのリストを取得できます。

データベースの表示:

また、エラー状態の応答を評価し、エラーがない場合は結果を保存するようにモニターを構成します。応答にエラーが含まれている場合、モニタはサービスを DOWN としてマークします。アプライアンスは、エラーが返されなくなるまで、サービスを負荷分散の決定から除外します。

データベース固有の負荷分散機能は、MSSQL および MySQL サービスタイプでのみサポートされます。したがって、モニタタイプは MSSQL-ECV または MYSQL-ECV である必要があります。

コマンドラインを使用して、サービスでホストされているすべてのアクティブなデータベースの名前を取得するようにモニターを構成するには

コマンドプロンプトで次のコマンドを入力して、サービスでホストされているすべてのアクティブなデータベースの名前を取得し、構成を確認します。

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

show lb monitor <monitorName>

構成ユーティリティを使用して、サービスでホストされているすべてのアクティブなデータベースの名前を取得するようにモニターを構成するには

  1. [トラフィック管理] > [負荷分散] > [モニ ター] に移動し、MSSQL-ECV または MYSQL-ECV タイプのモニタを設定します。
  2. 特殊パラメータ」で、ユーザー名、クエリー、およびルールを指定します。たとえば、MSSQL-ECV の場合、クエリは「状態 = 0 の sys.databases から名前を選択」である必要があります)。また、ルールは MSSQL.RES.TYPE.NE (エラー) である必要があります。MYSQL-ECVの場合、クエリは「データベースの表示」でなければならず、ルールはMYSQL.RES.TYPE.NE(エラー)でなければなりません。

MSSQL の可用性グループの展開サポート

高可用性グループの展開で、データベース固有の負荷分散が構成される次のシナリオを検討します。S1 ~ S5 は、ADC アプライアンス上のサービスです。DB1 ~ DB4 は、サービス S1 ~ S5 で表されるサーバ上のデータベースです。AV1 と AV2 は可用性グループです。各可用性グループには、プライマリデータベースサーバーインスタンスとセカンダリデータベースサーバーインスタンスが 4 つまで含まれます。可用性グループ内のサーバーを表すサービスは、ある可用性グループのプライマリ、別の可用性グループのセカンダリにすることができます。各可用性グループには、異なるデータベースと、サービスである 1 つのリスナーが含まれます。すべての要求は、プライマリ・データベースに存在するリスナー・サービスに到着します。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. 可用性グループごとに 1 つずつ、データベース DB1 から DB4 を表す 5 つのサービス S1 から S5 の 2 つのリスナーサービスを構成します。
    • 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 の 2 つのモニターを構成して、その可用性グループ内のアクティブなデータベースの一覧を取得します。モニタ 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

サービスを構成するには、次の手順に従います。

サービスの追加 msservice1 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

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

サービスを構成するには、次の手順に従います。

add service 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)     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