在域名系统(DNS)中,SRV记录(服务位置记录)是一种资源记录,它使客户端能够指定指示服务、协议和领域的名称。DNS查找该名称会返回一个回复,其中包含该领域中提供所需服务的多个可用服务器的名称。有关DNS SRV的信息,包括记录如何定义所列服务器的首选顺序,请参见RFC 2782。
MySQL支持使用DNS SRV记录连接服务器。收到DNS SRV查找结果的客户端会根据域名系统管理员分配给每个主机的优先级和权重,按优先顺序尝试连接到每个列出主机上的MySQL服务器。只有当客户端无法连接到任何服务器时,才会发生连接失败。
当多个MySQL实例(如服务器集群)为您的应用程序提供相同的服务时,域名系统SRV记录可用于协助故障转移/切主、负载均衡和复制服务。应用程序直接管理连接尝试的候选服务器集很麻烦,域名系统SRV记录提供了另一种选择:
-
域名系统SRV记录使域名系统管理员能够将单个域名系统领域映射到多个服务器。当服务器从配置中添加或删除或更改主机名时,管理员也可以集中更新域名系统SRV记录。
-
域名系统SRV记录的集中管理消除了单个客户端在连接请求中识别每个可能主机或由附加软件组件处理连接的需要。应用程序可以使用域名系统SRV记录来获取关于候选MySQL服务器的信息,而不是管理服务器信息本身。
-
域名系统SRV记录可以与连池组合使用,在这种情况下,不再在当前域名系统SRV记录列表中的主机连接将在空闲时从池中删除。
MySQL支持在以下情况下使用域名系统SRV记录连接服务器:
- 一些MySQL连接器实现了DNS SRV支持;特定于连接器的选项允许为X协议连接和经典MySQL协议连接请求DNS SRV记录查找。有关一般信息,请参阅使用DNS SRV记录的连接。有关详细信息,请参阅单个MySQL连接器的留档。
- C API提供了一个类似于mysql_real_connect()的mysql_real_connect_dns_srv()函数,只是参数列表没有指定要连接的MySQL服务器的特定主机。相反,它命名了一个指定一组服务器的DNS SRV记录。参见mysql_real_connect_dns_srv()。
- mysql客户端有一个--dns-srv-name选项来指示指定一组服务器的域名系统SRV记录。请参阅“mysql-MySQL命令行客户端”。
域名系统SRV名称由服务、协议和领域组成,服务和协议都以下划线为前缀:
_service._protocol.domain
以下域名系统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协议。客户端可以使用名称请求此域名系统SRV记录_mysqlx._tcp.example.com
。在连接请求中指定名称的特定语法取决于客户端的类型。例如,客户端可能支持在类似URI的连接字符串中指定名称或作为键值对。
经典协议连接的域名系统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协议端口)。
当使用域名系统SRV记录查找时,客户端通常必须对连接请求应用这些规则(可能存在特定于客户端或连接器的例外):
-
请求必须指定完整的域名系统SRV记录名称,服务和协议名称以下划线为前缀。
-
请求不得指定多个主机名。
-
请求不得指定端口号。
-
仅支持TCP连接。不能使用Unix套接字文件、Windows命名管道和共享内存。