6.2.6 使用 DNS SRV 记录连接到服务器
在 Domain Name System (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 协议连接又适用于 classic MySQL 协议连接。一般信息请见使用 DNS SRV 记录的连接。详细信息请见个别 MySQL 连接器的文档。
-
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 类似连接字符串或键值对中指定名称。
classic 协议连接的 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
指定 classic MySQL 协议服务,端口为 3306(classic MySQL 协议默认端口),而不是 33060(X 协议默认端口)。
当使用 DNS SRV 记录时,客户端通常必须遵循这些规则来请求连接:
-
请求必须指定完整的 DNS SRV 记录名称,服务和协议名称以下划线开头。
-
请求不能指定多个主机名。
-
请求不能指定端口号。
-
只支持TCP连接。Unix socket文件、Windows命名管道和共享内存不能使用。
关于在X DevAPI中使用DNS SRV记录的更多信息,请参见使用 DNS SRV 记录连接。