### 4.2.6 使用 DNS SRV 记录连接到服务器

[](<>)[](<>)

在域名系统 (DNS) 中，SRV 记录（服务位置记录）是一种资源记录类型，它使客户端能够指定表示服务、协议和域的名称。对名称的 DNS 查找会返回一个回复，其中包含域中提供所需服务的多个可用服务器的名称。有关 DNS SRV 的信息，包括记录如何定义所列服务器的优先顺序，请参阅[RFC 2782](https://tools.ietf.org/html/rfc2782).

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 连接器实现了 DNS SRV 支持；特定于连接器的选项支持为 X 协议连接和经典 MySQL 协议连接请求 DNS SRV 记录查找。有关一般信息，请参阅[使用 DNS SRV 记录的连接](https://dev.mysql.com/doc/x-devapi-userguide/en/connecting-dns-srv.html).有关详细信息，请参阅各个 MySQL 连接器的文档。

-   C API 提供了一个[`mysql_real_connect_dns_srv()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-real-connect-dns-srv.html)类似的功能[`mysql_real_connect()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-real-connect.html)，除了参数列表没有指定要连接的 MySQL 服务器的特定主机。相反，它命名一个指定一组服务器的 DNS SRV 记录。看[mysql\_真实的\_连接\_dns_srv()](https://dev.mysql.com/doc/c-api/8.0/en/mysql-real-connect-dns-srv.html).

-   这[**mysql**](mysql.html)客户有一个[`--dns-srv 名称`](mysql-command-options.html#option_mysql_dns-srv-name)用于指示指定一组服务器的 DNS SRV 记录的选项。看[第 4.5.1 节，“mysql - MySQL 命令行客户端”](mysql.html).

    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 协议。客户端可以使用名称请求此 DNS SRV 记录`_mysqlx._tcp.example.com`.在连接请求中指定名称的特定语法取决于客户端的类型。例如，客户端可能支持在类似 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 记录的连接](https://dev.mysql.com/doc/x-devapi-userguide/en/connecting-dns-srv.html).
