背景 #
在复杂的业务场景下,架构师通常会使用混合部署架构,通过混合使用 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 实例执行;