Logo
Traffic 双路由

背景 #

在复杂的业务场景下,架构师通常会使用混合部署架构,通过混合使用 DBPlusEngine-Driver 和 DBPlusEngine-Proxy,并采用统一的注册中心来配置分片策略,灵活地搭建出适用于各种场景的应用系统。

DBPlusEngine-Driver 采用无中心化架构,与应用程序共享资源,适用于 Java 开发的高性能的轻量级 OLTP 应用,但是由于 DBPlusEngine-Driver 与应用程序共享资源,当执行消耗资源较多的 SQL 时,应用程序的稳定性和性能会受到影响。同时 DBPlusEngine-Driver 消耗的连接数较多,当应用程序和数据库部署在不同的网络分区时,网络延迟对于性能的影响也会更加明显。

DBPlusEngine-Proxy 提供统一的静态入口,并且独立于应用程序部署,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。用户使用 DBPlusEngine-Proxy 来执行资源消耗较多的 SQL,可以有效避免对应用程序产生影响。

为了提升应用程序的查询性能和稳定性,我们可以考虑将 DBPlusEngine-Driver 接入端消耗资源较多的 SQL,转发至和数据库位于同一网络区域的 DBPlusEngine-Proxy 接入端,由 DBPlusEngine-Proxy 接入端计算好查询结果,再统一返回给应用程序。

架构

挑战 #

虽然通过将 DBPlusEngine-Driver 接入端消耗资源较多的 SQL 转发到 DBPlusEngine-Proxy 执行,可以有效提升应用程序的性能和稳定性,但是这也导致了部署架构更加复杂,用户需要判断哪些语句需要转发到 DBPlusEngine-Proxy,并在 DAO 层开发相关的业务逻辑来控制 SQL 的转发。

此外,在开启事务的场景下,将事务中的部分 SQL 转发到 DBPlusEngine-Proxy 执行,会对事务的一致性和可见性带来影响,从而影响业务系统对于事务的使用。

目标 #

尽量透明化 SQL 转发所带来的影响,让使用方尽量像使用一个数据库一样使用 DBPlusEngine-Driver 和 DBPlusEngine-Proxy 混合部署集群,是 DBPlusEngine Traffic 模块的主要设计目标。

核心概念 #

标签 #

DBPlusEngine-Proxy 实例配置的标签属性,用于对实例进行区分,DBPlusEngine-Driver 开启 Traffic 功能时,转发的目标就是标签对应的 DBPlusEngine-Proxy 实例;

转发策略 #

对 DBPlusEngine-Driver 接入端的 SQL 进行转发的策略,包括了:目标 Proxy 实例标签、转发算法、负载均衡算法。根据算法的不同,可以将转发策略分为事务转发策略和普通转发策略,当策略中的算法配置为 TransactionTrafficAlgorithm 时,转发策略为事务转发策略,当策略中的算法配置为其他算法时,转发策略为普通转发策略;

转发算法 #

用于判断当前 SQL 是否需要转发的算法,包括了 HintTrafficAlgorithm、SegmentTrafficAlgorithm 和 TransactionTrafficAlgorithm。

  • HintTrafficAlgorithm 基于 SQL Hint 功能进行 SQL 转发。
  • SegmentTrafficAlgorithm 则基于 SQL 语句进行转发,内部提供了基于 SQL 字符串以及 SQL 正则匹配的转发算法。
  • TransactionTrafficAlgorithm 是专门用于处理开启事务时,事务中的 SQL 语句如何进行转发的算法,目前支持 FIRST_SQL、JDBC 和 Proxy 三种策略。FIRST_SQL 表示基于事务语句中的第一条 SQL 转发结果,对事务中的 SQL 语句进行转发。JDBC 表示事务语句的 SQL 全部转发至 JDBC 接入端执行。Proxy 表示事务语句的 SQL 全部转发至 Proxy 接入端执行。

负载均衡算法 #

通过负载均衡算法将 SQL 语句转发到标签对应的不同 Proxy 实例上执行,目前支持 RANDOM 和 ROUND_ROBIN 两种负载均衡算法。

使用规范 #

支持项 #

  • 支持所有常用的 SQL 进行转发;

不支持项 #

  • 用户配置的内核功能不支持的 SQL,转发之后 SQL 仍然不支持;
  • 不支持开启事务后将 SQL 转发到不同的接入端或 Proxy 实例执行;

相关参考 #

Traffic Rule 的配置