Logo
流量管理

流量管理 #

随着数据规模的不断膨胀,使用多节点集群的分布式方式逐渐成为趋势。对集群整体视角的统一管理能力,和针对单独组件细粒度的控制能力,是基于存算分离的现代数据库体系中不可或缺的功能。管控的挑战之一,在于对集群的集中化管理的统一管理能力以及在单点出现故障时精细化的操作能力。

集中化管理的挑战体现在将包括数据库存储节点和中间件计算节点的状态统一管理,并且能够实时的探测到分布式环境下最新的变动情况,进一步为集群的控制和调度提供依据。面对超负荷的流量下,针对某一节点进行熔断和限流,以保证整个数据库集群得以继续运行,是分布式系统下对单一节点控制能力的挑战。

熔断 #

阻断节点和数据库的连接。 当某个 SphereEx-DBPlusEngine 节点超过负载后时或其他需要停止该节点对数据库的访问时,可通过命令停止对与数据库的链接,使数据库能够保证足够的资源为其他节点提供服务。当需要时,也可恢复状态,重新连接数据库对外提供服务。

相关操作 #

sql> DISABLE COMPUTE NODE IP=127.0.0.1,PORT=3306;
sql> SHOW COMPUTE NODES;

具体参见启用/禁用 Proxy

限流 #

面对超负荷的请求开启限流,以保护部分请求可以得以高质量的响应。可通过影子库功能,将部分流量导向其他库,间接起到限流功能。

相关操作 #

具体参见影子库

读写分离 #

读写分离,将根据语句是否对数据修改将访问流量发送到数据库主库或从库。这一方式,可提升数据库的吞吐量,对读多写少的场景非常适合。

相关操作 #

具体参见读写分离

智能路由 #

针对复杂业务场景,可通过混合使用 SphereEx-DBPlusEngine 与 SphereEx-DBPlusEngine-Driver,后者是一种轻量化、编程态产品,支持与用户方 Java 应用部署在一起,可将其视为标准 JDBC Driver 的增强。两者的结合支持将业务访问流量,从 SphereEx-DBPlusEngine-Driver 一端转发到 SphereEx-DBPlusEngine 端处理,后者可充分利用其独享的资源,适合于重度的工作负载。这一功能被称为 Traffic Route。具体参见智能路由

产品特点 #

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

  • SphereEx-DBPlusEngine 提供统一的静态入口,并且独立于应用程序部署,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。用户使用 SphereEx-DBPlus Engine 来执行资源消耗较多的 SQL,可以有效避免对应用程序产生影响。为了提升应用程序的查询性能和稳定性,我们可以考虑将 SphereEx-DBPlus Driver 接入端消耗资源较多的 SQL,转发至和数据库位于同一网络区域的 SphereEx-DBPlusEngine 接入端,由 SphereEx-DBPlusEngine 接入端计算好查询结果,再统一返回给应用程序。

部署架构 #

部署架构图

相关概念 #

  • 标签

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

  • 转发策略

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

  • 转发算法

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

  • 负载均衡算法

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

使用规范 #

  • 支持项
    • 支持所有常用的 SQL 进行转发。
  • 不支持项
    • 用户配置的内核功能不支持的 SQL,转发之后 SQL 仍然不支持。
    • 不支持开启事务后将 SQL 转发到不同的接入端或 SphereEx-DBPlusEngine-Proxy 实例执行。

使用方法 #

虽然通过将 SphereEx-DBPlusEngine‑Driver 接入端消耗资源较多的 SQL 转发到 SphereEx-DBPlusEngine-Proxy 执行,可以有效提升应用程序的性能和稳定性,但是这也导致了部署架构更加复杂,用户需要判断哪些语句需要转发到 DBPlusEngine‑Proxy,并在 DAO 层开发相关的业务逻辑来控制 SQL 的转发。此外,在开启事务的场景下,将事务中的部分 SQL 转发到 SphereEx-DBPlusEngine‑Proxy 执行,会对事务的一致性和可见性带来影响,从而影响业务系统对于事务的使用。

强制路由 #

数据分片 #

可以通过 SQL Hint 的方式强制 SQL 在指定分片上运行。该功能的注释格式暂时只支持 /* */,内容需要以 SPHEREEX_HINT: 开始,可选的属性包括:

  • {table}.SHARDING_DATABASE_VALUE:用于添加 {table}表对应的数据源分片键值,多个属性使用逗号分隔;
  • {table}.SHARDING_TABLE_VALUE:用于添加 {table} 表对应的表分片键值,多个属性使用逗号分隔。

分库不分表情况下,强制路由至某一个分库时,可使用 SHARDING_DATABASE_VALUE 方式设置分片,无需指定 {table}。

/* SPHEREEX_HINT: t_order.SHARDING_DATABASE_VALUE=1, t_order.SHARDING_TABLE_VALUE=1 */
SELECT * FROM t_order;

读写分离 #

可通过 SQL Hint 的方式强制 SQL 运行在主库。SQL Hint 功能的注释格式暂时只支持 /* */,内容需要以 SPHEREEX_HINT: 开始,属性名为 WRITE_ROUTE_ONLY。

/* SPHEREEX_HINT: WRITE_ROUTE_ONLY=true */
SELECT * FROM t_order;

也可通过 SQL Hint 强制 SQL 运行在某个数据源。 注释格式暂时只支持 /* */,内容需要以 SPHEREEX_HINT: 开始,属性名为 DATA_SOURCE_NAME。 如果使用 MySQL 客户端连接需要添加 -c 选项保留注释,客户端默认是 –skip-comments 过滤注释。

/* SPHEREEX_HINT: DATA_SOURCE_NAME=ds_0 */
SELECT * FROM t_order;

会话管理 #

SphereEx-DBPlusEngine 支持会话管理,可通过 DistSQL 查看当前会话或杀掉会话。目前此功能仅限于存储节点为 MySQL 的情况。

相关操作 #

  • 查看会话

    针对不同关联数据库支持不同的查看会话方法,关联 MySQL 数据库可使用 show processlist 命令查看会话。SphereEx-DBPlusEngine 会自动生成唯一的 UUID 标识作为 ID,并将 SQL 执行信息存储在各个实例中。当执行此命令时,SphereEx-DBPlusEngine 会通过治理中心收集并同步各个计算节点的 SQL 执行信息,然后汇总返回给用户。

mysql> show processlist;
+--------------------------------------+------+-----------+-------------+---------+------+---------------+-------------------+
| Id                                   | User | Host      | db          | Command | Time | State         | Info              |
+--------------------------------------+------+-----------+-------------+---------+------+---------------+-------------------+
| 3de4ff8d-2b06-abd0-46d0-124857919943 | root | 127.0.0.1 | sharding_db | Execute | 6    | Executing 0/1 | select sleep(100) |
| f9e5c97431567415fe10badc5fa46378     | root | 127.0.0.1 | sharding_db | Sleep   | 690  |               |                   |
+--------------------------------------+------+-----------+-------------+---------+------+---------------+-------------------+
  • 输出说明

输出模拟原生 MySQL 的输出,但 Id 字段较为特殊为随机字符串。

  • 前提条件

需要打开 show-process-list-enabled 参数,具体参见参数列表

  • 杀掉会话

    用户根据 show processlist 返回的结果,判断是否需要执行 kill 语句,SphereEx-DBPlusEngine 会根据 kill 语句中的 Id 取消正在执行中的 SQL。

  mysql> kill 3de4ff8d-2b06-abd0-46d0-124857919943;
Query OK0 rows affected (0.01 sec)

mysql> show processlist;
Empty set (0.02 sec)