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