使用DNS SRV记录连接服务器

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月4日 (二) 07:54的版本 (创建页面,内容为“在域名系统(DNS)中,SRV记录(服务位置记录)是一种资源记录类型,它使客户端能够指定一个指示服务、协议和域的名称。对名称进行DNS查找将返回一个回复,其中包含域中提供所需服务的多个可用服务器的名称。有关DNS SRV的信息,包括记录如何定义列出的服务器的优先级顺序,请参阅RFC 2782。 MySQL支持使用DNS SRV记录连接服务器。接收到DNS SRV查…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

在域名系统(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 Connectors实现了DNS SRV支持;连接器特定的选项可用于请求针对X协议连接和经典MySQL协议连接的DNS SRV记录查找。有关一般信息,请参阅使用DNS SRV记录进行连接。有关详细信息,请参阅各个MySQL Connectors的文档。
  • C API提供了一个mysql_real_connect_dns_srv()函数,与mysql_real_connect()类似,但参数列表不指定要连接到的MySQL服务器的特定主机。相反,它命名了一个指定了一组服务器的DNS SRV记录。请参阅mysql_real_connect_dns_srv()。
  • mysql客户端具有--dns-srv-name选项,用于指示指定了一组服务器的DNS SRV记录。


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协议服务,端口为3306(默认的经典MySQL协议端口),而不是33060(默认的X协议端口)。


使用DNS SRV记录查找时,客户端通常必须遵循以下连接请求规则(可能有客户端或连接器特定的例外情况):

  • 请求必须指定完整的DNS SRV记录名称,其中服务和协议名称以下划线为前缀。
  • 请求不能指定多个主机名。
  • 请求不能指定端口号。
  • 仅支持TCP连接。不能使用Unix套接字文件、Windows命名管道和共享内存。