在域名系统 (DNS) 中,SRV 记录 (服务位置记录) 是一种资源记录类型,它允许客户端指定一个名称,该名称指示服务、协议和域。对该名称进行 DNS 查询将返回一个包含域中提供所需服务的多个可用服务器名称的回复。有关 DNS SRV 的信息,包括记录如何定义列出服务器的优先级顺序,请参见 RFC 2782.
MySQL 支持使用 DNS SRV 记录连接到服务器。收到 DNS SRV 查询结果的客户端会尝试根据 DNS 管理员为每个主机分配的优先级和权重,按照首选顺序依次连接到列出的每个 MySQL 服务器。只有在客户端无法连接到任何服务器时才会发生连接失败。
当多个 MySQL 实例(例如服务器集群)为您的应用程序提供相同的服务时,可以使用 DNS SRV 记录来帮助进行故障转移、负载均衡和复制服务。应用程序直接管理一组用于连接尝试的候选服务器非常麻烦,而 DNS SRV 记录提供了另一种方法。
DNS SRV 记录允许 DNS 管理员将单个 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 记录的连接.