端口如何支持非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 搭建平台中, 我们采用了网格布局的方式来实现拖…

07-数据类型

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

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

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

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

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

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…

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

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

点云数据显示_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…

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

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

CSS3 Filter详解(改变模糊度 亮度 透明度等方法)

文章目录 1.模糊2.灰度3.亮度4.对比度5.饱和度6.色相旋转7.反色8.阴影9.透明度10.褐色CSS3 Filter(滤镜)属性提供了提供模糊和改变元素颜色的功能。CSS3 Fitler 常用于调整图像的渲染、背景或边框显示效果。 -webkit-filter是css3的一个属性,…

laravel中使用offsetSet

首先不用offsetSet方法,使用laravel的硬添加属性如下: 下边使用offsetSet 转载于:https://www.cnblogs.com/qaing123/p/9672241.html

转3d视图快捷键_最全Solidworks快捷键,值得收藏!

SOLIDWORKS软件提供了很多实用的快捷键,如果我们熟练掌握这些快捷键无疑可以减轻工作强度和提高工作效率。当然我们也可以点击【工具】-【自定义】-【键盘】,自己定义一些快捷键。本文为大家整理一些常用的快捷键,多使用快捷键可以帮助我们节…

构建前端自动化工作流环境

目标:建一个自动化工作流环境 自动编译 自动合并 自动刷新 自动部署 工作流: 1 全局安装webpack 执行命令: npm install webpack webpack-cli -g 其中webpack-cil 是命令接口工具 2 初始化当前项目:npm init 然后一路回车…

大型布线:Java云应用程序缺少的技术

您是否曾经想过,为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务? 我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 (跳至第32分钟),这使我在云平台的背景下思考了这个问题。 主题…

java cpu过高排查_涨薪秘籍:JAVA项目排查cpu负载过高

背景我负责的其中一个项目在空负载的情况下,CPU占用率依然保持着100%左右,线上、测试、开发的服务都一样;是什么导致的呢?在开发环境我查看了请求流量,这个流量可以忽略但CPU占用率一直在60%-100%之间浮动。分析问题流…

巧用css的border属性完成对图片编辑功能的性能优化

一、需求场景: 最近闲来无事,boss提出了一个要求,研究相关代码并完成一个关于编辑图片功能的性能优化,该功能的主要界面展示如下: 通过了几分钟的短暂试用,发现就是一个简单的裁剪并保存用户选择并上传的图…

求数的绝对值一定是正数_人教版初中数学七年级上册绝对值公开课优质课课件教案视频...

绝对值(习题课)导学案(教师版)【教学目标】1、能利用绝对值的性质求值。 2、通过复习绝对值,让学生对绝对值的理解更加深透。 3、通过复习,让学生掌握利用绝对值的代数和几何意义,并学会灵活运用…

使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全

企业应用程序的常见要求是在登录页面后面保护所有JSF页面。 有时,您甚至希望在应用程序内部具有保护区,只有拥有特定角色的用户才能访问这些保护区。 Java EE标准附带实现受某些安全性约束保护的Web应用程序所需的所有方法。 在此博客文章中,…