SRV RR

SRVレコードのメモ.


SRVリソースレコードを一言で説明すると,サービスとサーバ&ポートを結びつけるためのDNSレコード. ポート指定まで出来る汎用MXレコード,というイメージ. MXと同じく,冗長構成および負荷分散もサポートしている.

例えば,IM用プロトコルであるJabberは,サーバ間での通信で宛先サーバを決定するためにSRVレコードを利用している. Jabberを利用している代表的なサービスであるGoogle Talkは,次のようなJabberSRVレコードを持っている.

$ dig _jabber._tcp.gmail.com srv
_jabber._tcp.gmail.com. 86400   IN      SRV     5 0 5269 xmpp-server.l.google.com.
_jabber._tcp.gmail.com. 86400   IN      SRV     20 0 5269 xmpp-server1.l.google.com.
_jabber._tcp.gmail.com. 86400   IN      SRV     20 0 5269 xmpp-server2.l.google.com.
_jabber._tcp.gmail.com. 86400   IN      SRV     20 0 5269 xmpp-server3.l.google.com.
_jabber._tcp.gmail.com. 86400   IN      SRV     20 0 5269 xmpp-server4.l.google.com.
$ dig _xmpp-server._tcp.gmail.com srv
_xmpp-server._tcp.gmail.com. 86372 IN   SRV     20 0 5269 xmpp-server4.l.google.com.
_xmpp-server._tcp.gmail.com. 86372 IN   SRV     5 0 5269 xmpp-server.l.google.com.
_xmpp-server._tcp.gmail.com. 86372 IN   SRV     20 0 5269 xmpp-server1.l.google.com.
_xmpp-server._tcp.gmail.com. 86372 IN   SRV     20 0 5269 xmpp-server2.l.google.com.
_xmpp-server._tcp.gmail.com. 86372 IN   SRV     20 0 5269 xmpp-server3.l.google.com.
$ dig _xmpp-client._tcp.gmail.com srv
_xmpp-client._tcp.gmail.com. 86400 IN   SRV     5 0 5222 talk.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN   SRV     20 0 5222 talk1.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN   SRV     20 0 5222 talk2.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN   SRV     20 0 5222 talk3.l.google.com.
_xmpp-client._tcp.gmail.com. 86400 IN   SRV     20 0 5222 talk4.l.google.com.

Google Talkのユーザsomebody@gmail.comに他のJabberサービスのユーザsomeone@other-jabber.comがIMを送った場合の動作は次のようになる.

  1. other-jabber.comはドメインgmail.comの場所を知るために,_xmpp-server._tcp.gmail.com.SRV レコードを問い合わせる
  2. 応答レコードのなかで最もプライオリティ値の高いxmpp-server.l.google.com.5269/tcpに接続に行く
  3. xmpp-server.l.google.com.が落ちていた場合,セカンダリ Jabber サーバ xmpp-server{1-4}.l.google.com.にアクセスする.どれを選ぶかは クライアントがランダムに決定 する.

上記の動作は,メールシステムがMTAを利用する場合と非常に良く似ている.

SRVレコードの書式は以下の通り.

_Service._Proto.Name  TTL Class  SRV Priority  Weight  Port  Target

PriorityはMXレコードで言うところのpreference値,Weightは負荷分散のためのパラメータだ. MXラウンドロビンでは均一な負荷分散しか出来なかったが,Weightを設定することで重み付けを行えるようになっている.

負荷分散に関して言えば,DNSラウンドロビンSRVレコードでは分散を実現する仕組みが異なる. DNSラウンドロビンDNSサーバが返答するレコードを分散させていたが,SRVレコードの場合はクライアントが選ぶレコードを分散させる.