技术社群的这篇文章《MySQL 9.2 新特性 Routing Guidelines》翻译自Miguel Araujo写的一篇文章,给我们讲解了MySQL 9.2推出的新特性"Routing Guideines",其中一些设计理念可以借鉴到我们的工作中。
原文链接:
https://dev.mysql.com/blog-archive/smarter-query-routing-with-mysql-routing-guidelines/

随着 MySQL Shell[1] 和 MySQL Router[2] 9.2.0 创新版的发布,我们引入了 Routing Guidelines[3](本文译为:路由指南)这一新的功能,使 MySQL 数据库架构中的查询路由更加动态、灵活且声明式。
MySQL 社区版和企业版 均提供此功能,它能够根据特定的应用需求定制查询路由,并确保在 MySQL InnoDB Cluster、ClusterSet 和 ReplicaSet 拓扑结构中无缝分配查询。借助 路由指南,管理员能够获得对查询流的更大控制权,以可扩展且弹性的方式优化性能和可用性。
1. 智能查询路由的需求
在现代数据库架构中,高效的查询路由对于实现性能、可扩展性、弹性和适应性至关重要。
MySQL Router 在 MySQL 架构中扮演着核心角色,作为中间件动态地将客户端连接引导至适当的 MySQL 服务器实例。它能够无缝集成到 MySQL 部署中,支持故障转移、负载均衡和查询分发。

然而,随着 MySQL 拓扑结构的复杂性增加,对连接路由的控制需求也变得更加明显。
虽然对于 简单部署 来说,默认的路由行为是有效的,但 MySQL Router 的默认路由行为可能不再足以应对处理多样化场景所需的特定需求。
2. 传统路由的不足之处
2.1 地理分布的拓扑结构
考虑一个跨越多个区域的 ClusterSet,例如一个主区域的主集群和另一个区域的副本集群。

通过传统路由,MySQL Router 仅应用基本的读写规则,导致次优的查询路由,从而产生:
更高的延迟 - 查询未被引导至最近的区域。 工作负载平衡效率低下 - 造成热点,同时某些节点未被充分利用。 缺乏智能故障转移 - 传统路由不考虑工作负载优先级。
2.2 读扩展和测试环境
现在,考虑一个由 InnoDB Cluster 和多个读副本组成的拓扑结构,用于 读扩展 和 测试较新的 MySQL 版本。不同的应用程序有不同的需求:
App X - 处理前端流量,需要 低延迟 读取。 App Y - 执行 资源密集型、只读 查询,应转移到 专用副本。 App Z - 在 较新的 MySQL 版本(如图所示的 9.2)上运行测试,需要 与生产工作负载隔离。

传统路由无法根据 特定用户、应用程序、平台 或 查询类型 区分流量。
它对所有连接应用相同的 读写分离,使得无法确保 前端流量被引导至副节点,资源密集型查询被引导至适当的读副本,以及测试查询在特定 MySQL 版本上隔离,而不干扰生产工作负载。
2.3 多租户应用程序和分片
另一个例子是多租户应用程序,其中不同客户的查询应被路由到特定的数据库或模式。
没有会话感知,MySQL Router 缺乏在没有复杂应用程序端逻辑的情况下强制执行基于租户的查询路由的能力。
2.4 其他现实世界的挑战
许多 现实工作负载 有 专门的路由需求,而传统路由无法处理,例如:
工作负载优先级 - 根据 CPU、内存使用率 或 查询类型 引导查询。 合规性驱动的路由 - 确保敏感数据仅从特定区域访问(例如,GDPR、CCPA)。 网络感知路由 - 根据 客户端来源 引导查询,例如 内部 与 外部流量。
这些限制表明,为什么需要一个更 适应性强 和 上下文感知 的路由解决方案。
3. 路由指南:MySQL 查询路由的新范式

为了解决这些挑战,MySQL 数据库架构引入了路由指南 - 一种旨在使用声明式规则动态调整查询路由的功能,这些规则考虑了各种因素。
与传统的自动路由不同,路由指南允许管理员定义声明式规则,智能地根据以下因素在 MySQL 实例之间分配查询:
服务器 属性(例如,副本与主节点) 客户端 会话属性(例如,数据库模式、用户名或客户端属性) 路由器 特定信息(例如,RW 端口、主机名)
这提供了一种 可定制的、规则驱动的方法,可用于各种目的,例如:
通过将查询路由到最近或最有效的数据库节点来最小化延迟。 通过动态分配查询来增强负载均衡。 改善故障转移处理,确保查询始终被路由到可用资源而无需手动干预。
通过提供 细粒度的控制,路由指南允许 MySQL Router 做出更智能的决策,根据应用程序的具体需求量身定制。
4. 它是如何工作的
路由指南使用 MySQL Shell 中的 AdminAPI 定义,允许管理员声明式地创建和管理路由规则。
路由指南由 两个关键组件 组成:
目的地 - 使用模式匹配表达式定义拓扑结构内的 MySQL 实例组。目的地充当候选实例池,确保查询仅被路由到符合特定标准的服务器。 路由 - 确定客户端会话如何匹配到适当的目的地。使用表达式,路由根据模式、用户或工作负载类型等因素对客户端会话进行分类,并将它们引导至最合适的 MySQL 服务器。
示例路由指南:
{
"destinations": [
{
"match": "$.server.memberRole = PRIMARY AND $.server.clusterRole = PRIMARY",
"name": "Primary"
},
{
"match": "$.server.memberRole = SECONDARY AND $.server.clusterRole = REPLICA",
"name": "ReplicaClusterSecondary"
},
{
"match": "$.server.memberRole = READ_REPLICA AND $.server.clusterRole = REPLICA",
"name": "ReplicaClusterReadReplica"
}
],
"name": "default",
"routes": [
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": ["Primary"],
"priority": 0,
"strategy": "round-robin"
}
],
"enabled": true,
"match": "$.session.targetPort = $.router.port.rw",
"name": "rw"
},
{
"connectionSharingAllowed": true,
"destinations": [
{
"classes": ["ReplicaClusterSecondary", "ReplicaClusterReadReplica"],
"priority": 0,
"strategy": "round-robin"
},
{
"classes": ["Primary"],
"priority": 1,
"strategy": "round-robin"
}
],
"enabled": true,
"match": "$.session.targetPort = $.router.port.ro",
"name": "ro"
}
],
"version": "1.0"
}复制
在这个路由指南中:
目的地 根据服务器的 成员角色 将服务器分类为 三组:
主服务器 - $.server.memberRole = PRIMARY AND $.server.clusterRole = PRIMARY
副本集群副服务器 - $.server.memberRole = SECONDARY AND $.server.clusterRole = REPLICA
副本集群读副本 - $.server.memberRole = READ_REPLICA AND $.server.clusterRole = REPLICA
路由 定义客户端会话如何匹配到这些目的地:
"rw" 路由将读写流量引导至主服务器。 "ro" 路由优先考虑副本集群的副服务器和读副本,同时以轮询方式平衡流量。如果这些节点不可用,则最后回退到主服务器。
这个示例展示了路由指南如何提供对查询路由的细粒度控制,实现跨拓扑结构的高效负载均衡和故障转移管理。
5. 匹配表达式:路由指南的核心
路由指南依赖于 匹配表达式,这些表达式作为管理查询路由的规则。这些表达式允许管理员:
使用逻辑条件识别 服务器、会话 或 路由器。 使用 变量、运算符、函数 和 值 定义匹配。 使用 AND
、OR
和NOT
组合 条件,以获得更高级的灵活性。
通过利用匹配表达式,路由指南提供了精确且动态的查询路由,确保每个查询由最合适的 MySQL 实例处理。
6. 常见匹配表达式及其用法
在上面的示例中,我们使用了具有以下预定义变量的匹配表达式:
$.server.memberRole | PRIMARY, SECONDARY, READ_REPLICA | |
$.server.clusterRole | REPLICA, PRIMARY | |
$.session.targetPort | 3306 | |
$.router.port.rw | 6446 | |
$.router.port.ro | 6447 | |
然而,还有许多其他预定义变量[4] 和函数可用。
除了 预定义变量,路由指南支持 各种内置函数,这些函数允许更高级的路由逻辑。
这些函数允许执行诸如 匹配网络子网、字符串操作 和 评估正则表达式 等操作。
这里有一些示例:
NETWORK('str', 'int') | 以字符串形式返回网络地址。 | NETWORK('10.1.1.120', 24) 10.1.1.0 到 10.1.1.255 。 |
CONTAINS('str1', 'str2') | str2 是否是 str1 的子字符串,不区分大小写。 | CONTAINS('foobar', 'foo') true 。 |
REGEXP_LIKE('str1', 'str2') | str1 是否匹配 str2 中定义的正则表达式。 不区分大小写,并使用修改后的 ECMAScript 正则表达式语法。 | REGEXP_LIKE('foobarbaz', 'foo.*baz') true 。 |
这些只是路由指南中可用函数的几个示例。完整列表[5] 包含更多。
7. 匹配表达式的实际示例
以下是一些匹配表达式及其解释的示例:
7.1 基于模式路由查询
"match": "$.session.schema = 'analytics' AND $.session.user = 'reporting_user'"
复制
此规则确保来自用户 "reporting_user" 的所有针对 "analytics" 模式的查询都根据相应的路由指南进行路由。
7.2 基于网络子网路由查询
"match": "NETWORK($.session.sourceIP, 24) = NETWORK('192.168.1.0', 24) OR
NETWORK($.session.sourceIP, 8) = NETWORK('10.0.0.0', 8)"复制
此规则根据客户端 IP 地址的网络子网进行匹配:
第一个条件检查客户端的 IP 是否属于 192.168.1.0/24 子网(匹配本地办公室或数据中心的客户端)。 第二个条件检查客户端是否属于 10.0.0.0/8 子网(匹配公司 VPN 或内部网络)。
如果任一条件为真,则查询将被路由到一组特定的服务器。
7.3 将备份操作路由到专用服务器
"match": "$.session.connectAttrs.program_name = 'mysqldump'"
复制
此规则检测 MySQL Dump(mysqldump)是否作为客户端使用。来自 mysqldump 的查询将被路由到特定服务器(例如,备份服务器),以避免影响主数据库节点的性能。
7.4 为运行 MySQL 9.2.0 的暂存服务器定义目的地
"match": "$.server.tags.environment = 'staging' AND $.server.version = 90200"
复制
此规则创建一个目的地,仅包含在暂存环境中运行(标记)且 specifically 在 MySQL 版本 9.2.0(90200)上运行的 MySQL 服务器。
8. 工作流程
路由指南通过一个结构化的工作流程操作,确保查询根据实时条件动态路由到最合适的 MySQL 实例。该过程包括以下通用步骤:
分类目的地 服务器可以属于多个目的地类(一对多关系)。 根据模式匹配表达式将 MySQL 服务器分组到目的地类。 匹配路由规则 一个路由可以有多个候选目的地类(一对多关系)。 对传入的客户端请求进行分类,并将其映射到预定义的路由。 应用路由策略 first-available - 将查询路由到第一个可用服务器。 round-robin - 将查询均匀分布在可用服务器之间。 确定查询如何在选定的目的地中分布。 支持两种路由策略: 监控拓扑结构 根据实时拓扑结构变化持续重新分类服务器。 动态更新路由以反映服务器可用性的变化。 如果目的地不再有效,则断开无效连接。
9. 关键优势
路由指南提供了一种强大且灵活的查询路由方法,使管理员能够精确控制查询在 MySQL 架构中的路由方式。以下是一些关键优势:
声明式路由 - 以结构化方式定义路由规则,无需修改应用程序。 动态适应性 - 路由可以基于会话属性,实现智能查询分发。 细粒度控制 - 允许对查询路由行为进行精细调整。 与 MySQL Shell 和 AdminAPI 集成 - 通过 MySQL Shell 轻松管理路由指南。 支持 Cluster、ClusterSet 和 ReplicaSet - 与受支持的 MySQL 数据库架构完全集成。
10. 部署考虑和要求
MySQL Router 被设计为用于 无状态连接扩展,因为所有配置都直接存储在 MySQL 中。
这也确保了路由指南保持灵活且集中化,避免了不必要的 Router 配置文件复杂性。
此外,路由指南需要 MySQL Shell 和 MySQL Router 9.2.0 或更高版本,但它们不依赖于特定的 MySQL Server 版本,使其在不同部署中兼容。
11. 结论
在 MySQL 社区版和企业版中,路由指南解锁了 MySQL 查询路由的新灵活性,使优化不同 MySQL 部署的性能、可扩展性和弹性比以往任何时候都更加容易。
这篇介绍为理解路由指南奠定了基础。在下一篇博文中,我们将探讨如何使用 MySQL Shell 的 AdminAPI 配置和管理路由指南,并提供实际示例和用例。敬请关注!
有关更多详细信息,请查看 MySQL 官方文档 或立即使用 MySQL Shell 和 MySQL Router 尝试路由指南。
MySQL Shell: https://dev.mysql.com/doc/mysql-shell/9.2/en/
[2]MySQL Router: https://dev.mysql.com/doc/mysql-router/9.2/en/
[3]Routing Guidelines: https://dev.mysql.com/doc/mysql-shell/9.2/en/admin-api-routing-guidelines.html
[4]routing guidelines syntax: https://dev.mysql.com/doc/mysql-shell/9.2/en/admin-api-routing-guidelines-syntax.html
[5]routing guidelines full list: https://dev.mysql.com/doc/mysql-shell/9.2/en/admin-api-routing-guidelines-syntax.html
如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,
