X DevAPI 用户指南  / 第 2 章连接和会话概念  / 2.2 连接到会话  /  2.2.4 使用 DNS SRV 记录的连接

2.2.4 使用 DNS SRV 记录的连接

X DevAPI 支持使用 DNS SRV 记录连接到 MySQL 服务器。收到 DNS SRV 查找结果的客户端会根据 DNS 管理员分配给每个主机的优先级和权重,尝试按优先顺序连接到每个列出的主机上的 MySQL 服务器。仅当客户端无法连接到任何服务器时才会发生连接失败。本节重点介绍在 X DevAPI 应用程序中使用 DNS SRV。有关 MySQL 中 DNS SRV 支持的一般信息,请参阅 使用 DNS SRV 记录连接到服务器

实现 X DevAPI 的 MySQL 连接器可以通过指定mysqlx+srv类似 URI 的连接字符串的方案元素以及 DNS SRV 名称来请求 DNS SRV 记录查找。例如:

mysqlx+srv://_mysqlx._tcp.example.com/db?options

DNS SRV 名称由服务、协议和域组成,服务和协议均以下划线为前缀。示例中,mysqlx表示X协议服务,tcp表示TCP协议。

X DevAPImysqlx.getSession()方法和mysqlx.getClient()连接池方法使用此协议方案扩展验证连接信息,并将生成的 DNS SRV 记录作为主机列表处理,以实现故障转移行为和连接池。遵循 DNS SRV 记录中指定的优先级和权重。

MySQL 连接器还具有特定于连接器的选项,用于为 X 协议连接和经典 MySQL 协议连接请求 DNS SRV 记录查找。有关详细信息,请参阅各个 MySQL 连接器的文档。

笔记

MySQL Shell 当前不支持 DNS SRV 记录。

当使用 DNS SRV 记录查找时,客户端通常必须对连接请求应用这些规则(可能存在特定于连接器的例外情况):

  • 该请求必须指定完整的 DNS SRV 记录名称,服务和协议名称以下划线为前缀。例如,此 DNS SRV 记录与通过 TCP 实现的 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.

    客户端可以使用如下语法指定 DNS SRV 记录:

    var client = mysqlx.getClient("mysqlx+srv://_mysqlx._tcp.example.com")
  • 该请求不得指定多个主机名。

  • 该请求不得指定端口号。

  • 仅支持 TCP 连接。无法使用 Unix 套接字文件、Windows 命名管道和共享内存。

Java代码

Session mySession = new 
SessionFactory().getSession("mysqlx+srv://user:password@_mysql._tcp.example.com/db");

Node.js JavaScript 代码

mysqlx.getSession({ host: '_mysqlx._tcp.example.com', resolveSrv: true })

C#代码

var session = MySQLX.GetSession("mysqlx+srv://user:password@_mysqlx._tcp.example.com.");

使用 X DevAPI for C 的连接器/C++ 代码

mysqlx::Session sess(
    SessionOption::HOST, "_mysqlx._tcp.example.com",
    SessionOption::DNS_SRV, true,
    SessionOption::USER, "user",
    SessionOption::PWD, "password");

Python代码

session = mysqlx.get_session(host="tcp.example.com", dns_srv=True)