ADC

ユースケース4:データベース固有の負荷分散

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

例として、データベースサーバー server 1、サーバー 2、サーバー 3 が mydatabase1 と mydatabase2 というデータベースをホストしているとします。mydatabase1 が server2 で使用できなくなった場合、負荷分散デバイスはその状態の変化を認識している必要があります。mydatabase1 へのリクエストの負荷をサーバー 1 とサーバー 3 のみに分散する必要があります。mydatabase1 がサーバー 2 で使用できるようになったら、負荷分散デバイスは負荷分散の決定に server2 を含める必要があります。同様に、mydatabase2 がサーバー 3 で使用できなくなった場合、デバイスは mydatabase2 のリクエストをサーバー 1 とサーバー 2 のみに負荷分散する必要があります。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-->

サービスを構成する

負荷分散機能を有効にしたら、負荷分散設定に含めるアプリケーションサーバーごとに少なくとも 1 つのサービスを作成する必要があります。構成するサービスは、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 Server のデプロイメントによって異なります。たとえば、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.database から名前を選択 (state=0)」で、ルールは MSSQL.RES.TYPE.NE (エラー) でなければなりません。MYSQL-ECV の場合、クエリは「データベースを表示」で、ルールは MYSQL.RES.TYPE.NE (エラー) でなければなりません。

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

高可用性グループ展開でデータベース固有の負荷分散が設定されている次のシナリオを考えてみましょう。S1からS5はADCアプライアンス上のサービスです。DB1 から DB4 は、サービス S1 から S5 で表されるサーバー上のデータベースです。AV1 と AV2 は可用性グループです。各可用性グループには、最大 1 つのプライマリデータベースサーバーインスタンスと最大 4 つのセカンダリデータベースサーバーインスタンスが含まれます。可用性グループ内のサーバーを表すサービスを、ある可用性グループではプライマリに、別の可用性グループではセカンダリにすることができます。各可用性グループには、異なるデータベースと 1 つのリスナー (サービス) が含まれます。すべてのリクエストは、プライマリデータベースにあるリスナーサービスに到着します。AVI には DB1 と DB2 のデータベースが含まれています。AV2 には DB3 と DB4 のデータベースが含まれています。L1 と L2 はそれぞれ AV1 と AV2 のリスナーです。S1 は AV1 のプライマリサービスで、S2 は AV2 のプライマリサービスです。

HA デプロイメント SQL

Service サービス上のアクティブなデータベースのリスト
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 の書き込みクエリは L1 に送信されます。
  3. AV2 の READ クエリは 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. 可用性グループごとに 1 つずつ、合計 2 つのリスナーサービスと、データベース DB1 から DB4 を表す 5 つのサービス 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 の 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
<!--NeedCopy-->

サービスを設定するには:

サービス msservice1 を追加 5.5.5.5 MSQL 143

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

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-->