DNS SRV介绍(一种用DNS做服务发现的方法)

Tags: 系统设计 

目录

说明

DNS SRV是DNS记录中一种,用来指定服务地址。与常见的A记录、cname不同的是,SRV中除了记录服务器的地址,还记录了服务的端口,并且可以设置每个服务地址的优先级和权重。访问服务的时候,本地的DNS resolver从DNS服务器查询到一个地址列表,根据优先级和权重,从中选取一个地址作为本次请求的目标地址。

rfc-2782给出DNS SRV的建议标准。(rfc-2782在2000年的时候提出,替换了rfc-2052)。

应用场景

一个能够支持SRV的LDAP client可以通过查询域名,得知LDAP服务的IP地址和服务端口:

_ldap._tcp.example.com

这个域名的格式是rfc-2782中推荐的格式,_ldap表示LDAP服务,_tcp表示通过TCP协议访问LDAP服务。

SRV

SRV的DNS类型代码为33。

SRV的记录格式为:

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

Service: 服务名称,前缀“_”是为防止与DNS Label(普通域名)冲突。
Proto:   服务使用的通信协议,_TCP、_UDP、其它标准协议或者自定义的协议。
Name:    提供服务的域名。
TTL:     缓存有效时间。
CLASS:   类别
Priority: 该记录的优先级,数值越小表示优先级越高,范围0-65535。
Weight:   该记录的权重,数值越高权重越高,范围0-65535。     
Port:     服务端口号,0-65535。
Target:   host地址。

客户端查询到多条记录的时候,使用优先级最高的记录。

对相同优先级的记录,按照权重选择,记录的权重越高,被选择的可能性越高。

选择的时候,将所有记录的权重值累加,得到一个选择区间[0,sum],每个记录在[0,sum]中占据一段连续的、长度为自身权重值区间。然后生成一个[0,sum]中的随机数,随机数落在的区间所属的记录就是被选择的记录。

注意事项

  1. 在使用DNS SRV的时候,要注意DNS Client是否按照预期的方式处理收到的SRV记录。当前DNS SRV只能够负责提供服务地址列表,对这个列表如何解读,完全取决于Client的实现。

  2. rfc-1035中规定,通过UDP协议传输DNS响应时,UDP报文的负载不能超过512字节,在添加SRV记录的时候,要特别注意。(通过TCP传输时没有512字节的限制)

  3. 当一个服务地址有多个相同优先级的SRV记录的时候,Client会按照这些SRV的权重分配请求。下一次向服务发起的请求可能是发送到了另一个地址。

  4. 在通过SRV记录的权重来分配请求的时候,使用的是本地缓存的DNS记录,所以不能实时地感知到服务的地址列表变化。除非将TTL设置的非常短暂,但这样将会频繁地查询DNS服务器。

Client查询服务地址的过程

rfc-2782中已经做了很好地介绍,这里就不表述了。

安全考虑

  1. 使用SRV后,用户是通过DNS查询动态获得服务端口,网络管理员无法通过“禁止某一个端口的报文通过”的方式来阻止内部用户访问外部的服务。

配置举例

下面是DNS中master file,可以看到有example.com域名提供了一个名为_foobar._tcp的服务,这个服务有两个SRV记录,分别指向了sysadmins-box.example.com:9和server.example.com:9

  $ORIGIN example.com.
  @               SOA server.example.com. root.example.com. (
                      1995032001 3600 3600 604800 86400 )
                  NS  server.example.com.
                  NS  ns1.ip-provider.net.
                  NS  ns2.ip-provider.net.
  ; foobar - use old-slow-box or new-fast-box if either is
  ; available, make three quarters of the logins go to
  ; new-fast-box.
  _foobar._tcp     SRV 0 1 9 old-slow-box.example.com.
                   SRV 0 3 9 new-fast-box.example.com.
  ; if neither old-slow-box or new-fast-box is up, switch to
  ; using the sysdmin’s box and the server
                   SRV 1 0 9 sysadmins-box.example.com.
                   SRV 1 0 9 server.example.com.
  server           A   172.30.79.10
  old-slow-box     A   172.30.79.11
  sysadmins-box    A   172.30.79.12
  new-fast-box     A   172.30.79.13
  ; NO other services are supported
  *._tcp          SRV  0 0 0 .
  *._udp          SRV  0 0 0 .

参考

  1. rfc-2782
  2. rfc-135

系统设计

  1. 各大云厂商的 API 设计风格
  2. Google 是如何实践 RESTful API 设计的?
  3. Netflix 的异地多活设计: Active-Active for Multi-Regional Resiliency
  4. Facebook 的缓存系统实践经验《Scaling Memcache at Facebook》
  5. 多机数据系统的正确性与一致性
  6. 《大型网站技术架构: 核心原理与案例分析》阅读摘录
  7. 《分布式金融架构课》阅读笔记2: 线性一致的分布式数据系统的实现过程
  8. 《分布式金融架构课》阅读笔记1: 单机&多机并发/多副本读写正确性和一致性
  9. 《消息队列高手课》阅读笔记: Rabbit/Rocket/Kafka/模型/消息事务/保序等
  10. 《消息队列高手课》阅读笔记: Rabbit/Rocket/Kafka/模型/消息事务/保序等
  11. 《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等
  12. 《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等
  13. 《高并发系统设计40问》阅读笔记: 数据库/缓存/消息队列/分布式服务
  14. 《高并发系统设计40问》阅读笔记: 数据库/缓存/消息队列/分布式服务
  15. 《MySQL实战45讲》阅读笔记: 索引类型/数据可靠性/事务/间隙锁/临时表等
  16. 系统性能分析方法论: 统计图谱工具
  17. 张磊《深入剖析Kubernetes》专栏的阅读笔记
  18. 代理服务软件haproxy、nginx、envoy对比,以及开源的API网关项目对比
  19. 蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义
  20. 阿里巴巴的应用限流和服务降级是怎样实现的?|如何打造平台稳定能力
  21. 陈皓《左耳听风》专栏的阅读笔记(持续更新)
  22. 好雨云帮,一款不错的国产开源PaaS
  23. 怎样为软件的不同版本命名?
  24. 怎样选择开源项目的license?
  25. Glusterfs的架构
  26. 怎样设计一个企业级的PaaS平台?
  27. 几种常见的LDAP系统
  28. DNS SRV介绍(一种用DNS做服务发现的方法)
  29. DNS,DNS-Domain Name System
  30. 思科的网络设备
  31. 虚拟化技术汇总
  32. 认证与授权系统的汇总
  33. 高可用实现方法汇总
  34. 编译器汇总
  35. Linux系统的优化方法
  36. CentOS7的一些变化
  37. 分布式系统的一些知识
  38. 计算机编程语言的特性汇总
  39. 网络通信的一些基础知识
  40. PCIE总线的一些知识
  41. 操作系统的API
  42. 网卡的一些知识
  43. Linux系统的构建过程
  44. 数据结构与算法
  45. CPU的相关知识

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  李佶澳的博客  系统软件  程序语言  运营经验  关注方向  水库文集  网文收藏  网络课程  发现知识星球  百度搜索 谷歌搜索