Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member182948
Active Participant
0 Kudos

目的


本ドキュメントではSQL AnywhereがTCP/IPを介してサーバを検索して接続する方法ついて詳しく説明します。

 

概要


TCP/IP経由で遠隔地のSQL Anywhere データベースサーバへ接続することは非常に簡単です。 単純に “UID=userid;PWD=password;ENG=engine_name;LINKS=tcpip” という接続文字列を使用するだけで十分です。
しかし、TCPの動作を変更する多数のTCP接続パラメータがあり、サブネット、WAN、およびファイアウォールの存在が接続プロセスを複雑にする可能性もあります。
このドキュメントでは、SQL AnywhereクライアントがTCP / IPを介してサーバを検索して接続するアルゴリズムについて説明し、アルゴリズムの変更に使用できる各パラメータについても説明します。本書に記述されているアルゴリズムとパラメータは特に指定のない限り SQL Anywhere version 8 以降に適用されます。

 

SQL Anywhere でTCP/IPを使用する


SQL Anywhere クライアントはデータベースサーバへ接続するためにいくつものネットワークプロトコルを使用することが可能です: 共有メモリ、TCP/IP, SPX、名前付きパイプ(Ver 9以前)

TCP/IPプロトコルは、普遍的で高速なため、データベースサーバとクライアントが異なるコンピュータ上にある場合に最も一般的な選択です。SQL Anywhereでは、他のデータベースシステムとは異なり、クライアントがデータベースサーバを見つけるためにホスト名またはIPアドレスではなくデータベースサーバ名を指定する必要があります。これにより、ユーザはクライアント接続文字列を変更することなく、任意のコンピュータ上でデータベースサーバを実行できます。

この規則には、データベースサーバの構成方法やネットワークトポロジに応じて例外があります。 データベースサーバに接続するには、クライアントは少なくともデータベースサーバ名(ENG パラメータで指定 *1) と、クライアントがデータベースサーバを見つけるために使用する通信プロトコルのタイプを含む接続文字列を指定する必要があります。データベースサーバがクライアントと同じサブネット上にあり、ブロードキャストを無効にしていない場合、クライアントは通常、接続文字列の一部として "LINKS = tcpip"を指定するだけでデータベースサーバに接続できます。

次に、クライアントは、目的のデータベースサーバ名を含むUDPブロードキャストパケットを送信し、対応するデータベースサーバはUDPパケットで応答し、クライアントにIPアドレスとポート番号を通知します。 クライアントは、データベースサーバとのTCP接続を確立できます。

*1:ENGパラメータは旧式のパラメータであり、現在はServerパラメータの使用が推奨されます。

 

サーバの検索


TCP / IP経由でサーバを検索しようとすると、SQL Anywhereクライアントソフトウェアは次の手順を実行します:

  1. アドレスキャッシュの確認

  2. LDAPの確認

  3. ダイレクト接続の試行

  4. ブロードキャスト


いずれかのステップで正しいサーバが見つかると、データベースサーバの名前とアドレスがアドレスキャッシュに書き込まれ、データベースへの接続が試行されます。 エラーが発生した場合(「サーバが見つかりません」以外)、接続試行が中止されます。 4つのステップがすべて完了した後にサーバが見つからない場合、エラー “データベースサーバが見つかりません。” (SQLCODE -100) が返されます。

 

アドレスキャッシュ


SQL Anywhereクライアントは、サーバへのTCP / IP接続を成功させると、サーバの名前とIPアドレスをアドレスキャッシュに書き込みます。これはクライアントコンピュータにあるsasrv.iniというファイルです。

接続試行が行われるたびに、SQL Anywhereクライアントはキャッシュ内のデータベースサーバ名をチェックします。見つかった場合、クライアントはリストされたIPアドレスに接続しようとします。
メモ:


  • DoBroadcast=NONE または LocalOnly=YES プロトコルオプションが使用された場合、アドレスキャッシュは使用されません。

  • Unixのファイル名は .sasrv.ini です。 バージョン10より前のバージョンでは、ファイル名はasasrv.ini(Unixでは.asasrv.ini)です。

  • VERIFY = NO プロトコルオプションが指定されている場合、サーバ名検証ステップはスキップされます。


 

LDAP


SQL AnywhereサーバはLDAPサーバに登録して、クライアントがファイアウォールを介して、異なるサブネット上またはWAN上でも簡単に検索できるようにすることができます。 これを行うには、LDAPサーバの場所、認証方法、LDAPディレクトリツリー内でサーバ情報を格納する場所に関する情報を含むファイルを作成する必要があります。

デフォルトのファイル名はsaldap.iniであり、SQL Anywhere実行可能ファイルと同じディレクトリに配置する必要があります。 saldap.iniファイルの形式はドキュメントにされています。 「SQL Anywhereサーバ - データベース管理」の「LDAPサーバを使用した接続」を参照してください。

サーバを検索するとき、クライアントはLDAPサーバに照会してサーバ名を検索します。 見つかった場合は、サーバのIPアドレスがLDAPエントリから取得され、クライアントはそれらの各アドレスへのTCP接続を試みます。 接続が行われると、サーバ名が確認されます。

 
メモ:


  • Unixでは、デフォルトのファイル名は .saldap.ini です。 Adaptive Server Anywhereバージョン8および9では、デフォルトのファイル名は asaldap.ini (Unixでは.asaldap.ini)です。

  • LDAP=NO または LocalOnly=YES プロトコルオプションが指定された場合、LDAPは使用されません。

  • DoBroadcast = NONE プロトコルオプションが指定され、少なくとも1つのアドレスが HOST パラメータに指定されている場合、LDAPは使用されません。

  • ネットワークサーバ(例:dbsrv16 / dbsrv12)のみがLDAPに自身を登録できます。 パーソナルサーバ(例:dbeng16)はできません。

  • VERIFY = NO プロトコルオプションが指定されている場合、サーバ名検証ステップはスキップされます。

  • LDAPパラメータを使用して、.iniファイルの完全修飾ファイル名を指定できます。 たとえば、Unixでは、単一の.iniファイルを作成し、コンピュータ上のすべてのクライアントに "LDAP = / usr / local / SQLAnywhere / saldap.ini"を指定することで使用できます。


 

ダイレクト接続


HOSTパラメータを使用すると、SQL Anywhereクライアントはリストされた各ホストへ直接TCP / IP接続を試みます。 ホストは、リストされている順序で試行されます。 接続が確立されると、SQL Anywhereクライアントはサーバ名を検証します。

デフォルトでは、クライアントはポート2638に接続しようとしますが、異なるポート番号を指定する方法は2つあります。 コロンで区切られたIPアドレスまたはホスト名にポート番号を追加することにより、HOSTパラメータにIPアドレスの一部としてポートを指定できます。 IPv6アドレスの場合は、コロンとポート番号を追加する前にアドレスをかっこで囲みます。

また、PORTパラメータを使用することもできます。この場合、ポート番号は、独自のポート番号を指定しないすべてのアドレスに適用されます。 「シナリオ」セクションには、これらのオプションを説明するための例がいくつか含まれています。
メモ:


  • VERIFY = NO プロトコルオプションが使用されている場合、サーバ名検証ステップはスキップされます。


 

ブロードキャスト


SQL Anywhereクライアントがサーバをまだ検出していない場合、サーバ名を含むローカルエリアネットワークにブロードキャストを送信します。 その名前のサーバがネットワーク上で実行されている場合は、IPアドレスとポート番号を含むパケットで応答します。 クライアントはそのアドレスにTCP接続を行います。

パケットが送信されるブロードキャストアドレスを決定するには、Broadcast、MyIP、およびPortプロトコルオプションが必要です。 これらのオプションのどれも指定されていない場合、クライアントはコンピュータのIPアドレスをリストし、それぞれのブロードキャストアドレスを決定し(IPv4アドレスの場合はサブネットマスク、IPv6アドレスの場合はff02 :: 1を使用)、各結果アドレスのデフォルトポートに1つのパケットを送信します。

パケットが送信されると、クライアントは最大1秒間応答を待ちます。 応答が受信されない場合、プロセスがタイムアウトするまで、プロセスが繰り返されます(ブロードキャストパケットが再送信され、クライアントは1秒間待機します)。 タイムアウトは、TIMEOUT接続パラメータを使用して指定します。デフォルトは5秒です。 UDPパケットは保証されていないため、クライアントはブロードキャストパケットを再送します。
ブロードキャスト応答が受信されると、サーバのIPアドレスとポート番号が含まれます。 その後、そのアドレスにTCP / IP接続が行われます。
メモ:


  • DoBroadcast=DIRECT または DoBroadcast=NONE プロトコルオプションが使用されている場合、このステップはスキップされます。


 

DBNS


SQL Anywhereのバージョン10.0.0リリースでは、dbns( "ns"はネームサービスの略)という新しいユーティリティが導入されました。 このユーティリティを使用すると、クライアントの接続文字列でサーバのIPアドレスまたはホスト名をハードコーディングせずに、LDAPサーバを構成することなく、異なるサブネット上のクライアントとサーバを検索することができます。

dbnsユーティリティはブロードキャストリプリケータであり、SQL Anywhereブロードキャスト用に2つのサブネットを接続するために使用できます。 dbnsユーティリティは、接続する各サブネット内の1台のコンピュータで実行されます。 このように、任意の数のサブネットを接続することができ、各サブネット内で1つのdbnsが実行されます。 あるDBNSが別のDBNSに接続すると、それぞれが既知のDBNSのリストを他のDBNSのリストに送信するので、ネットワーク内のすべてのDBNSがすべてのDBNSに接続されます。

DBNSが接続されると、1つのDBNSで受信されたUDPブロードキャストがTCP / IP経由で他のDBNSに送信され、ブロードキャストメッセージはそれぞれのサブネットで再送信されます。 これらのブロードキャストへの応答は、元のDBNSに返送され、元のDBNSは元のクライアントに返送されます。 クライアントはブロードキャストに応答したサーバのIPアドレスとポートを持っていて、直接接続できます。

DBNSを使用する利点は、クライアント上で設定が必要ないことです。クライアントは、サーバのIPアドレス、ホスト名、またはポート番号を知る必要はありません。
メモ:


  • バージョン9.0.1以前のクライアントはDBNSを使用できません。 これらのクライアントによって送信されたブロードキャストは、DBNSによって転送されません。

  • DBNSユーティリティは、すでにSQL Anywhereサーバを実行しているコンピュータでは使用しないでください。 場合によっては、DBNSは同じコンピュータ上のサーバ向けのブロードキャストメッセージを「横取り」します。 サーバがメッセージを受信しないと、サーバは応答せず、サーバはリモートコンピュータのクライアントに見えなくなります。


 

MYIP 接続パラメータ


最も混乱を招くTCP接続パラメータは、MyIPパラメータです。 このパラメータは、マルチホームのホスト上でどのネットワークを使用するか、無視するかをサーバまたはクライアントソフトウェアに伝えるために使用できます。 このパラメータは常にホスト名ではなく1つ以上のIPアドレスを使用することに注意してください。 このパラメータは、クライアントとデータベースサーバで異なる方法で使用されます。 各用途について以下に説明します。

 

データベースサーバ

デフォルトでは、サーバは検出されたすべてのネットワークアダプタでUDPブロードキャストとTCP接続を受信しますが、マルチホームホストでは、1つのアダプタでのみ接続を受信する必要があります。 たとえば、コンピュータが有線ネットワークとワイヤレスネットワークの両方に接続されているが、ワイヤレスネットワークからの接続を許可したくないとします。 これを行うには、MyIPパラメータを使用して、有線ネットワーク上のコンピュータのIPアドレスを指定します。

サーバコンピュータが有線ネットワークとワイヤレスネットワークの両方にありますが、ワイヤレスネットワークからの接続を許可しないとします。 コンピュータのIPアドレスは、有線ネットワークでは172.16.20.145、無線ネットワークでは172.24.96.200です。 ワイヤレスネットワークからの接続を拒否するには、データベースサーバの開始行にMyIPパラメータが含まれている必要があります:

dbsrv16 ... -x tcpip(MyIP=172.16.20.145)

カンマで区切って複数のIPアドレスを指定できます。

 

クライアント

クライアントでは、サーバを探すときにブロードキャストパケットを送信する場所を決定するためにMyIPパラメータが使用されます。 デフォルトでは、クライアントは検出されたすべてのネットワークアダプタを使用します。 これは、コンピュータが複数のネットワークに接続されていても、SQL Anywhereデータベースサーバがどのネットワーク上にあるかを知っている場合に便利です。 MyIPパラメータを使用することにより、他のネットワーク上でUDPブロードキャストを送信することは避けられます。

クライアントはIPアドレスとして特別なキーワード "none"もサポートしています。このキーワードはクライアントソフトウェアにアドレッシング情報の決定を行わないように指示します。ブロードキャストパケットは255.255.255.255とff02 :: 1に送信されます。 これは、RASソフトウェアを使用している場合など、この操作が高コストなコンピュータで役立ちます。

 

シナリオ

次の例は、接続シナリオと、データベースサーバを見つけるために必要なLINKSパラメータを示しています:

 

  1. データベースサーバはローカルサブネットで実行されています。 それは通常、homer というコンピュータで実行されていますが、そうでないかもしれません。
    メモ:


    • SQL Anywhereクライアントは、まずサーバーのキャッシュとLDAPをチェックし、”homer”(ポート2638)のホストへの接続を試みます。

    • これらの試行後にクライアントがサーバを検出しなかった場合、クライアントはローカルサブネットにブロードキャストします。 データベースサーバが homerで実行されていて、デフォルトのポートで実行されていない場合は、この手順で検索されます。



  2. データベースサーバーは、homerというコンピュータ上で実行されており、ポート8910で待機しています。 Homer はファイアウォールの向こう側にあります。
    LINKS=tcpip(HOST=homer;DoBroadcast=NONE;PORT=8910)
    メモ:


    • DoBroadcast = NONEが指定されているため、クライアントはアドレスキャッシュを無視してLDAPステップをスキップします。homer上にサーバが見つからない場合は、ブロードキャストは行われません(UDPパケットはファイアウォールを通過しないため)、接続は失敗します。

    • ファイアウォールは、ポート8910を介したTCP / IP接続を許可するように設定する必要があります。ファイアウォールも特定のポートからの接続のみを許可するように設定されている場合は、ClientPort =パラメータも追加する必要があります。

    • これは、dbnsユーティリティが使用されていないことを前提としています。 2つのサブネット上で使用されている場合は、 "LINKS = tcpip"を使用する必要があります。



  3. データベースサーバはミラーリング構成に関係しています。 2つのデータベースサーバは、コンピュータ homer (port 8910) と marge (port 8911) で実行されています。LINKS=tcpip(HOST=homer:8910,marge:8911)
    または
    LINKS=tcpip(HOST=homer,marge;PORT=8910,8911)
    メモ:


    • クライアントは、ホストに直接接続する前に、まずアドレスキャッシュとLDAPをチェックします。

    • いずれかのホスト上のサーバへの接続に成功すると、クライアントはサーバ名を確認します。

    • クライアントがサーバを検出しなかった場合、クライアントはブロードキャストパケットをローカルサブネットに送信し、応答のために5秒待機します。

    • 上記の2つの接続文字列の違いは、最初のケースでは各ホストに特定のポート番号があるため、クライアントは homer:8910 と marge:8911 のみをチェックすることです。 それは homer:8911 や marge:8910 をチェックしません。 後者の場合、クライアントは両方のコンピュータの両方のポートをチェックします。


     


このページは、以下の英語ページの抄訳です。

Finding SQL Anywhere Server over TCPIP