在域名系统 (DNS) 中,SRV 记录(服务位置记录)是一种资源记录,它使客户端能够指定一个名称,该名称指示服务、协议和域。对该名称进行 DNS 查询将返回一个回复,其中包含域中提供所需服务的多个可用服务器的名称。有关 DNS SRV 的信息,包括记录如何定义列出服务器的优先级顺序,请参阅 RFC 2782。
MySQL 支持使用 DNS SRV 记录连接到服务器。接收 DNS SRV 查询结果的客户端会尝试按优先级顺序连接到每个列出的主机上的 MySQL 服务器,优先级基于 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 支持;连接器特定的选项允许为 X 协议连接和经典 MySQL 协议连接请求 DNS SRV 记录查找。有关一般信息,请参阅 使用 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 记录连接。