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 DevAPI 的 mysqlx.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 的 Connector/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)