SRV 记录是什么
SRV 是一种 DNS 记录类型,用来回答「某个服务在哪个主机、哪个端口」:它一次给出目标主机、端口、优先级与权重。这样客户端就不必把服务器地址和端口写死在配置里,改服务位置只需改 DNS。它常用于 SIP、LDAP、XMPP、Minecraft、Matrix 等需要动态定位服务的场景,Kubernetes 的无头 Service 也用 SRV 做成员发现。
基本信息
| 类型号 | SRV(TYPE 33) |
|---|---|
| 规范 | RFC 2782 |
| 名字格式 | _service._proto.name,如 _sip._tcp.example.com |
| 记录格式 | 优先级 权重 端口 目标主机 |
| 优先级 | 数值小者优先;不同优先级间先按优先级选 |
| 权重 | 同一优先级内按权重随机分流 |
典型使用场景
- SIP/VoIP 与统一通信:客户端靠 _sip._tcp 定位注册服务器与端口
- LDAP/Kerberos 服务发现:域内客户端自动找到目录服务
- 游戏或自研客户端:把集群入口与端口写进 DNS,便于扩容与迁移
- Kubernetes 无头服务:用 SRV 查询拿到各 Pod 的地址与命名端口
- 多实例负载:同优先级下用不同权重把流量按比例分摊
查询与配置示例
查询与配置示例
# 查询 SIP 服务的 SRV 记录
dig +short _sip._tcp.example.com SRV
# 10 60 5060 sip1.example.com.
# 10 40 5060 sip2.example.com.
# 用 dig 指定类型也可
nslookup -type=SRV _ldap._tcp.example.com
# 区文件写法(BIND 风格)
_ldap._tcp.example.com. 3600 IN SRV 0 100 389 ldap.example.com.字段读法
| 字段 | 含义 | 要点 |
|---|---|---|
| 优先级 | 越小越优先 | 先选最小的优先级组 |
| 权重 | 组内分流比例 | 全为 0 时退化为均匀随机 |
| 端口 | 服务监听端口 | 需与目标主机实际监听一致 |
| 目标 | 主机名(A/AAAA) | 不应指向 CNAME |
| 目标为 . | 该域明确不提供此服务 | 用于显式拒绝而非缺省 |
| 名字前缀 | 下划线加服务与协议 | 客户端按此规则拼查询名 |
权重 0 不等于禁用:RFC 2782 的选路算法在存在非零权重记录时,给权重 0 的记录留了很小但非零的命中概率;只有当同优先级下所有记录权重都为 0 时,才退化为均匀随机。想真正停用某台服务器,应从记录里删掉而不是把权重写 0。
SRV 的目标字段应是具备 A/AAAA 记录的主机名,不宜指向 CNAME;把目标写成 . 表示该域名明确不提供这项服务,这与「记录不存在」的含义不同。