MySQL 8.0.19支持DNS SRV

本文转载自mysqlplayer,做者洪斌

MySQL Router是InnoDB Cluster架构的访问入口,在架构部署上,官方给出的建议是router与应用端绑定部署,避免router单点问题。python

以前还有客户咨询,可否router不与应用端绑定部署,不便于部署,在此以前都须要在router前面加VIP或者一层负载均衡。mysql

我还在想这事儿就应该由MySQL Connector来实现访问链路的Failover和Loadbalance, 如今有了DNS SRV的支持,router没必要和应用端绑定部署,也能够省了VIP和负载均衡,MySQL InnoDB Cluster方案更加完善,配合consul等服务发现组件,更容易适配service mesh架构。 sql

DNS SRV是DNS记录的一种,用来指定服务地址。SRV记录不只有服务目标地址,还有服务的端口,而且能够设置每一个服务地址的优先级和权重。shell

MySQL Connector 8.0.19 覆盖多种语言支持DNS SRV,包括经典协议和X协议。遵循RFC 2782实现,支持Priority和Weight客户端必须链接优先级值最低的可达地址,若优先级相同,权重值越大的访问几率越高。架构

  • Connector/NET 
  • Connector/ODBC 
  • Connector/J 
  • Connector/Node.js
  • Connector/Python 
  • Connector/C++

咱们来演示下应用是如何使用DNS SRV的,这里使用consul作服务发现。负载均衡

  1. consul agent与MySQL Router部署在相同节点,检查服务活性,并向consul server 注册服务信息。
  2. 应用端的Connector配置了服务地址,访问DB时先向consul server发起DNS SRV服务请求。
  3. consul server回复应用端 MySQL Router的服务地址和端口,应用端再去访问MySQL Router。

我在本机作了测试。 测试

1. 首先使用mysql shell建立一组InnoDB Cluster集群spa

for i in `seq 4000 4002`; do

2. 部署两个mysql router做为访问代理代理

for i in 6446 6556; do

3. 安装 consul用做服务注册和DNS解析,在测试环境咱们使用开发模式,只部署一个consul节点,若用在生产环境须要部署多个agent和server日志

echo "Install consul..."

4. 在consul中注册两个router代理服务

echo "Services register..."

5. 测试下DNS SRV是否能正常解析,SRV记录的应答返回服务端口和服务地址,服务地址有对应的A记录,是127.0.0.1地址。

echo "Test dns srv..."

6. consul的DNS服务端口是8600 ,须要在本机设置DNS 转发,将应用对consul服务的DNS请求转发到consul的端口,这里我使用dnsmasq作本地转发,对于生产环境可以使用BIND服务。

echo "Install dnsmasq..."

7. DNS转发设置完成后,不指定DNS端口,测试转发是否依然正常解析SRV记录。

echo "Test dns forwarding..."

8. 安装 python connector

pip install mysql-connector-python

9. 在设置connector链接参数是注意host填写在consul注册的服务地址,并加上dns_srv参数,不须要指定端口。

import mysql.connector

从MySQL Router 日志中能够看到请求以负载均衡方式发送到两边。

相关文章
相关标签/搜索