在域名系统(DNS)中,SRV 记录(服务位置记录)是一种资源记录,允许客户端指定一个名称,指示服务、协议和域。对名称的 DNS 查找将返回一个包含多个可用服务器名称的回复,这些服务器在域中提供所需的服务。有关 DNS SRV 的信息,包括记录如何定义服务器的优先级顺序,请参阅 RFC 2782。
MySQL 支持使用 DNS SRV 记录连接到服务器。客户端在收到 DNS SRV 查找结果后,将尝试连接到每个列出的主机,以优先级和权重的顺序,基于 DNS 管理员分配的优先级和权重。如果客户端无法连接到任何服务器,则连接失败。
当多个 MySQL 实例(例如服务器集群)为应用程序提供相同的服务时,DNS SRV 记录可以用于故障转移、负载均衡和复制服务。应用程序直接管理候选服务器集的连接尝试非常麻烦,DNS SRV 记录提供了一种替代方案:
-
DNS SRV 记录使 DNS 管理员能够将单个 DNS 域映射到多个服务器上。DNS SRV 记录也可以由管理员在服务器添加或删除配置或更改主机名时集中更新。
-
DNS SRV 记录的集中管理消除了客户端识别每个可能主机的需要,或者连接需要由其他软件组件处理。应用程序可以使用 DNS SRV 记录来获取候选 MySQL 服务器的信息,而不是自己管理服务器信息。
-
DNS SRV 记录可以与连接池结合使用,在这种情况下,连接到不再在当前 DNS SRV 记录列表中的主机将在闲置时从池中删除。
MySQL 支持在以下上下文中使用 DNS SRV 记录连接到服务器:
-
多个 MySQL 连接器实现了 DNS SRV 支持;连接器特定的选项启用了 DNS SRV 记录查找,用于 X 协议连接和经典 MySQL 协议连接。有关一般信息,请参阅 使用 DNS SRV 记录的连接。有关详细信息,请参阅各个 MySQL 连接器的文档。
-
C API 提供了一个
mysql_real_connect_dns_srv()
函数,该函数类似于mysql_real_connect()
,只是参数列表不指定要连接的特定 MySQL 服务器主机,而是指定了一个 DNS SRV 记录,该记录指定了一组服务器。请参阅 mysql_real_connect_dns_srv()。 -
客户端 mysql 有一个
--dns-srv-name
选项,用于指定一个 DNS SRV 记录,该记录指定了一组服务器。请参阅 第 6.5.1 节,“mysql — MySQL 命令行客户端”。
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 命名管道和共享内存不能被使用。
有关在 X DevAPI 中使用基于 DNS SRV 的连接的更多信息,请参阅 使用 DNS SRV 记录的连接。