端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV

转载自公众号:玩转MySQL
作者:洪斌

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

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

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

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

c8d00b9cfe3c3cd718047a8a2c3313db.png

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 做服务发现。

bfa925c61e01cd3cee6b6d026da7cdca.png

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 集群

for i in `seq 4000 4002`; doecho "Deploy mysql  sandbox $i"mysqlsh -- dba deploy-sandbox-instance $i --password=root
doneecho "Create innodb cluster..."
mysqlsh root@localhost:4000 -- dba create-cluster cluster01
mysqlsh root@localhost:4000 -- cluster add-instance --recoveryMethod=clone --password=root root@localhost:4001
mysqlsh root@localhost:4000 -- cluster add-instance --recoveryMethod=clone --password=root root@localhost:4002

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

for i in 6446 6556; doecho "Bootstrap router $i"mysqlrouter --bootstrap root@localhost:4000 --conf-use-gr-notifications -d router_$i --conf-base-port $i --name router_$ised -i 's/level = INFO/level = DEBUG/g router_$i/mysqlrouter.confsh router_$i/stop.shsh router_$i/start.sh
done

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

echo "Install consul..."
brew install consul
consul agent -dev &

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

echo "Services register..."
consul services register -name router -id router1 -port 6446 -tag rw
consul services register -name router -id router2 -port 6556 -tag rw

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

echo "Test dns srv..."
dig router.service.consul SRV -p 8600
;; QUESTION SECTION:
;router.service.consul.        IN    SRV;; ANSWER SECTION:
router.service.consul.    0    IN    SRV    1 1 6556 MBP.node.dc1.consul.
router.service.consul.    0    IN    SRV    1 1 6446 MBP.node.dc1.consul.;; ADDITIONAL SECTION:
MBP.node.dc1.consul.    0    IN    A    127.0.0.1
MBP.node.dc1.consul.    0    IN    TXT    "consul-network-segment="
MBP.node.dc1.consul.    0    IN    A    127.0.0.1
MBP.node.dc1.consul.    0    IN    TXT    "consul-network-segment="

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

echo "Install dnsmasq..."
brew install dnsmasq
echo 'server=/consul/127.0.0.1#8600' > /usr/local/etc/dnsmasq.d/consul
sudo brew services restart dnsmasq

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

echo "Test dns forwarding..."
dig router.service.consul SRV

8. 安装 python connector

pip install mysql-connector-python

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

import mysql.connector
cnx = mysql.connector.connect(user='root', password='root', database='mysql_innodb_cluster_metadata', host='router.service.consul', dns_srv=True)
cursor = cnx.cursor()
query = ("select instance_id from v2_this_instance")
cursor.execute(query)
for (instance_id) in cursor:print("instance id: {}".format(instance_id))
cursor.close()
cnx.close()

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

40b657bf9cb6bf87a309437a1fb11c64.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录奥运-当今五大Java记录框架之间的竞赛

开发人员:Takipi会告诉您何时新代码在生产中中断– Log4J vs SLF4J简单vs Logback vs Java Util日志记录vs LOG4J2 日志记录实际上是每个服务器端应用程序中古老而固有的部分。 这是应用程序以持久且可读的方式输出实时状态的主要方法。 某些应用程序每天可能仅记录…

移动端实现元素拖拽效果插件_基于自然流布局的可视化拖拽搭建平台设计方案...

LowCode 是高效、高性能的拖拽式低代码开发平台. 也是笔者最近一直在研究的方向, 对于可视化搭建平台的实现方案笔者之前写过很多文章, 这里带大家探索一个新方向——基于自然流布局的可视化搭建平台.在我们之前实现的 h5-dooring 搭建平台中, 我们采用了网格布局的方式来实现拖…

Python数据分析前提-----pandas

pandas:知识脑图 https://bigquant.com/community/t/topic/129755 1、read_csv(url):读取数据 2、help(read_csv):打印函数相关用法 3、数据名.dtypes:读取数据的类型(int、float……) 4、type(数据名&…

07-数据类型

【转】07-数据类型 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/mysql-data-types.html mysql常用数据类型概括&#x…

小谈React、React Native、React Web

React有三个东西,React JS 前端Web框架,React Native 移动终端Hybrid框架,React Web是一个源码转换工具(React Native 转 Web,并之所以特别提出,是觉得还有些用处)。 React、React Native共同…

yii::$app-mongodb 查询纪录数_老詹总决赛有多强?12项数据领先乔丹科比,已握10项数据纪录...

勒布朗詹姆贡献了38分16个篮板和10个助攻的狂暴三双数据,并率领湖人淘汰了掘金,这使得他迈进了职业生涯第10次总决赛舞台。我们都知道,詹姆斯几乎统治着NBA季后赛大部分数据纪录,事实上,他在总决赛同样如此。根据《sta…

摆脱困境:从计划作业中调用安全方法

假设我们已经实现了一个Spring支持的应用程序,并使用Spring Security的方法安全性表达式对其进行了保护 。 我们的下一个任务是使用安全方法实施计划作业。 更具体地说,我们必须实现一个计划的作业,该作业从我们的服务类中获取一条消息&…

前端共享桌面_2020 前端学习路线总结,哎呦,不错哦!

2020 前端学习路线总结在 GitHub 看到一个很不错的前端学习路线图(roadmap),从前端基础到前端工程化,再到跨端,都有知识点的覆盖,非常推荐阅读。图下面是我翻译的一个文字版,可以先看图再看文字…

每日一题题目16:简单的python练习题(1-10)

#1.python程序中__name__的作用是什么?__name__这个系统变量用来表示程序的运行方式. 如果程序在当前膜快运行,__name__的名称就是__main__, 如果不在(被调用),则显示为导入模块的名称.扩展:常常这样写if __name__ "__main__":来表名这是整个工程开始运行的入口.效…

Confluence 6 高级性能诊断

请在你的系统服务请求中包括下面所有的信息,如果可能的话,你也可以在请求中包括你认为最有可能出现的问题。这样的话,可以避免我们进一步对你系统的问题进行询问。 系统信息 Confluence 服务器 你系统信息的屏幕截图 Confluences Administrat…

RequireJS使用注意地方

使用RequireJS做异步模块加载,有几点值得注意的地方: 1.模块定义两种写法 1. 存在依赖的函数式定义 如果模块存在依赖:则第一个参数是依赖的名称数组;第二个参数是函数,在模块的所有依赖加载完毕后,该函…

WildFly上具有AngularJS的Java EE 7和Java WebSocket API(JSR 356)

这篇博客文章描述了用于WebSocket协议的Java API(JSR 356) (这是Java EE 7平台的四个最新JSR之一),并提供了部署在WildFly 8上并可以在OpenShift上在线获得的具体应用程序。 [FR]版本的法语( HTML或PDF &a…

用python做自我介绍_python入门教程NO.2 用python做个自我介绍

本文涉及的python基础语法为:数据类型等数据类型1. 字符串的拼接我们在上一章中已经简单介绍了一下字符串的创建方式,这里我们简单学习一下字符串的运算和拼接。字符串的运算字符串的加法#把字符串:hello赋值给变量aa hello#把字符串&#x…

想清楚映射规则,栈、队列、双端队列的实现都差不多

今天开始,啃读算法导论第10章。既然是啃就要有啃的样子,我决定将例题和习题全部用C实现一遍,总结同一类问题的共性。 10.1节介绍了栈,队列,双端队列及一些组合形式,为了突出体现思路,让代码更加…

日期加减加1天_2小时整理了13个时间日期函数,动图演示简单易学,收藏备用吧...

Hello,大家好,今天跟大家整理汇总了13个工作中经常用到的日期与时间函数的使用方法,学会它们几乎可以解决所有工作中遇到的,关于日期与时间提取与转换的问题。话不多说,让我们直接开始吧一、了解时间与日期的本质工作中…

T-1-java语言基础

一、Linux的由来和发展Linux是开源的操作系统Linux是服务器端的操作系统java主要用于服务器端二、Linux目录结构(与Windows不同)文件系统不同:Windows是盘符,Linux是目录。外部设备映射不同:Windows是盘符,…

点云数据显示_vispy 显示 kitti 点云数据

国内博客找了一圈,居然没有发现有用 vispy 做可视化的代码,这里做一个简单的示例,代码大部分来自官方。import numpy as np import vispy.scene from vispy.scene import visuals import sys# Make a canvas and add simple view canvas vis…

python函数定义关键字_Python(2)深入Python函数定义

在Python中,可以定义包含若干参数的函数,这里有几种可用的形式,也可以混合使用:1. 默认参数最常用的一种形式是为一个或多个参数指定默认值。>>> def ask_ok(prompt,retries4,complaintYes or no Please!):while True:ok…

稳定婚姻(tarjan)

传送门 这道题一开始可能以为是二分图匹配……?不过后来发现和二分图没啥大关系。 简单分析之后发现,把夫妻之间连边(男性向女性连边),之后再将每对曾经是情侣的人连边(女性向男性连边)&#xf…

Webpack 常用命令总结以及常用打包压缩方法

前言:Webpack是一款基于node的前端打包工具,它可以将很多静态文件打包起来,自动处理依赖关系后,生成一个.js文件,然后让html来引用,不仅可以做到按需加载,而且可以减少HTTP请求,节约…