ドメインネームシステム (DNS) では、SRV レコード (サービスロケーションレコード) は、クライアントがサービス、プロトコルおよびドメインを示す名前を指定できるようにするリソースレコードのタイプです。 名前の DNS ルックアップは、必要なサービスを提供するドメイン内の複数の使用可能なサーバーの名前を含む応答を返します。 リストされたサーバーの優先順位をレコードで定義する方法など、DNS SRV の詳細は、RFC 2782 を参照してください。
MySQL では、サーバーへの接続に DNS SRV レコードの使用がサポートされています。 DNS SRV ルックアップ結果を受信するクライアントは、DNS 管理者によって各ホストに割り当てられた優先度および重みに基づいて、リストされた各ホスト上の MySQL サーバーへの接続を優先順位に従って試行します。 接続の失敗は、クライアントがどのサーバーにも接続できない場合にのみ発生します。
サーバーのクラスタなどの複数の MySQL インスタンスがアプリケーションに同じサービスを提供する場合、DNS SRV レコードを使用してフェイルオーバー、ロードバランシングおよびレプリケーションサービスを支援できます。 アプリケーションが接続試行の候補サーバーのセットを直接管理するのは面倒であり、DNS SRV レコードには次の代替方法があります:
DNS SRV レコードを使用すると、DNS 管理者は単一の DNS ドメインを複数のサーバーにマップできます。 DNS SRV レコードは、サーバーが構成に対して追加または削除されたとき、またはサーバーのホスト名が変更されたときに、管理者が一元的に更新することもできます。
DNS SRV レコードを集中管理することで、個々のクライアントが接続リクエストで可能な各ホストを識別したり、追加のソフトウェアコンポーネントで接続を処理したりする必要がなくなります。 アプリケーションでは、サーバー情報自体を管理するかわりに、DNS SRV レコードを使用して候補 MySQL サーバーに関する情報を取得できます。
DNS SRV レコードは接続プーリングと組み合せて使用できます。この場合、DNS SRV レコードの現在のリストにないホストへの接続は、アイドル状態になるとプールから削除されます。
MySQL では、DNS SRV レコードを使用して、次のコンテキストでサーバーに接続できます:
いくつかの MySQL コネクタには、DNS SRV サポートが実装されています。コネクタ固有のオプションを使用すると、X プロトコル 接続と クラシック MySQL プロトコル 接続の両方に対して DNS SRV レコード参照をリクエストできます。 一般的な情報は、Connections Using DNS SRV Records を参照してください。 詳細は、個々の MySQL コネクタのドキュメントを参照してください。
C API には、
mysql_real_connect()
に似たmysql_real_connect_dns_srv()
関数が用意されていますが、引数リストには接続先の MySQL サーバーの特定のホストが指定されていない点が異なります。 かわりに、サーバーのグループを指定する DNS SRV レコードを指定します。 mysql_real_connect_dns_srv()を参照してください。mysql クライアントには、サーバーのグループを指定する DNS SRV レコードを示す
--dns-srv-name
オプションがあります。 セクション4.5.1「mysql — MySQL コマンドラインクライアント」を参照してください。
DNS SRV 名は、サービス、プロトコルおよびドメインで構成され、それぞれにアンダースコアが付いたサービスおよびプロトコルがあります:
_service._protocol.domain
次の DNS SRV レコードは、クライアントが X プロトコル 接続を確立するために使用するなど、複数の候補サーバーを識別します:
Name TTL Class Priority Weight Port Target
_mysqlx._tcp.example.com. 86400 IN SRV 0 5 33060 server1.example.com.
_mysqlx._tcp.example.com. 86400 IN SRV 0 10 33060 server2.example.com.
_mysqlx._tcp.example.com. 86400 IN SRV 10 5 33060 server3.example.com.
_mysqlx._tcp.example.com. 86400 IN SRV 20 5 33060 server4.example.com.
ここで、mysqlx
は X プロトコル サービスを示し、tcp
は TCP プロトコルを示します。 クライアントは、_mysqlx._tcp.example.com
という名前を使用してこの DNS SRV レコードをリクエストできます。 接続リクエストで名前を指定するための具体的な構文は、クライアントのタイプによって異なります。 たとえば、クライアントは URI のような接続文字列内での名前の指定、またはキーと値のペアとしての名前の指定をサポートできます。
クラシックプロトコル接続用の DNS SRV レコードは、次のようになります:
Name TTL Class Priority Weight Port Target
_mysql._tcp.example.com. 86400 IN SRV 0 5 3306 server1.example.com.
_mysql._tcp.example.com. 86400 IN SRV 0 10 3306 server2.example.com.
_mysql._tcp.example.com. 86400 IN SRV 10 5 3306 server3.example.com.
_mysql._tcp.example.com. 86400 IN SRV 20 5 3306 server4.example.com.
ここで、mysql
という名前は クラシック MySQL プロトコル サービスを示し、ポートは 33060 (デフォルトの X プロトコル ポート) ではなく 3306 (デフォルトの クラシック MySQL プロトコル ポート) です。
DNS SRV レコード参照を使用する場合、クライアントは通常、接続リクエストに次のルールを適用する必要があります (クライアント固有またはコネクタ固有の例外がある場合があります):
リクエストには、サービス名とプロトコル名の前にアンダースコアを付けて、完全な DNS SRV レコード名を指定する必要があります。
リクエストに複数のホスト名を指定しないでください。
リクエストにポート番号を指定しないでください。
TCP 接続のみがサポートされています。 Unix ソケットファイル、Windows 名前付きパイプおよび共有メモリーは使用できません。
X DevAPI での DNS SRV ベースの接続の使用の詳細は、Connections Using DNS SRV Records を参照してください。