本文使用的平台:Cloudflare
SRV记录(摘自Wikipedia)
SRV记录(英语:Service Record,中文又名服务定位记录)是域名系统中用于指定服务器提供服务的位置(如主机名和端口)数据。此数据于RFC 2782中定义,类型代码为33。部分协议,如会话发起协议(SIP)及可扩展消息与存在协议(XMPP)通常需要服务记录的支持。
服务记录的格式为:(Linux dig出来的记录)
_服务._协议.名称. TTL 类别 SRV 优先级 权重 端口 主机.
- 服务:服务的符号名称。
- 协议:服务的传输协议,通常为TCP或UDP。
- 名称:此记录生效的所在域名,以半角逗号结尾。
- TTL:标准DNS存活时间值。
- 类别:标准DNS类别值(此值总为IN)。
- 优先级:目标主机的优先级,值越小越优先。
- 权重:相同优先度记录的相对权重,值越大越优先。
- 端口:服务所在的TCP或UDP端口。
- 主机:提供服务的规范主机名,以半角句号结尾。
SRV服务列表(摘自Wikipedia)
- CalDAV或CardDAV
- Ceph
- DANE
- DNS服务探索(DNS-SD)
- 主机标识协议
- Kerberos
- LDAP
- SMTP邮件投递、POP及IMAP
- Matrix.org
- Minecraft
- IMPS
- Puppet
- 会话发起协议
- STUN
- Teamspeak 3
- XMPP
Cloudflare上SRV解析处理

- 名称:用户连接的域名
- 服务:对应的SRV解析服务,需要对照上文的表选择
- 协议:你SRV服务需要走的连接方式
- TTL:解析修改生效时间
- 优先级:解析先后顺序,数字越大,解析越后
- 权重:在同一优先级情况下的负载均衡分配,权重越高,负载越大
- 端口:目标解析使用的端口
- 目标:一个解析(必须是A、AAAA解析,否则该SRV无效)
例子:

这时的srv解析情况为mc.srv.example.com使用Minecraft服务通过TCP协议将mc.example.com:39999映射出来,用户只需输入srv解析mc.srv.example.com(不需要另加端口)就会指向到mc.example.com:39999
优先级与权重的关系
假设我们有这些解析
# _服务._协议.名称. TTL 类别 SRV 优先级 权重 端口 主机.
_sig._tcp.box.example.com. 86400 IN SRV 10 80 5060 main.box.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 10 10 5060 box.1.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 10 5 5060 box.2.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 10 5 5060 box.3.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 20 70 5060 main.2.box.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 20 10 5060 box2.1.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 20 10 5060 box2.2.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 20 10 5060 box2.3.example.com.
_sig._tcp.box.example.com. 86400 IN SRV 30 0 5060 box.all.server.is.down.example.com.
以这些解析为例,我们不难看出box.example.com对应多个主机目标,因为优先级为10/20/30,所以设备默认先解析优先级为10的解析,即main.box.example.com,box.1.example.com,box.2.example.com,box.3.example.com,其中,设备优先使用权重较大的解析,所以优先使用main.box.example.com,因此,设备在使用该SRV解析时会有80%的时间连接在main.box.example.com,10%的时间用在box.1.example.com上,剩下的10%的时间分别用在box.2.example.com,box.3.example.com上并共享负载(权重都为5)。
此时,如果主机main.box.example.com进入维护状态不可使用,那么设备将优先连入box.1.example.com,然后再连入box.2.example.com,box.3.example.com并共享负载(权重都为10)。
如果优先级为10的主机都进入了不可使用的状态,那么设备将去连接优先级为20的解析。以此类推,如果优先级为10/20的主机全部都不可使用。那么就会解析优先级为30的主机(因为优先级为30的只有一个解析,所以权重可以设成0)。