Logo
技术架构

技术架构 #

整体架构 #

DBPlusEngine 的可插拔架构划分为 3 层,分别是 L1 内核层、L2 功能层、L3 生态层。

DBPlusEngine 整体架构如下图所示。

L1 内核层 #

是数据库基本能力的抽象,其所有组件均必须存在,但具体实现方式可通过可插拔的方式更换。 主要包括查询优化器、分布式事务引擎、分布式执行引擎、权限引擎和调度引擎等。

L2 功能层 #

用于提供增量能力,其所有组件均是可选的,可以包含零至多个组件。组件之间完全隔离,互无感知,多组件可通过叠加的方式相互配合使用。 主要包括数据分片、读写分离、数据库高可用、数据加密、影子库等。用户自定义功能可完全面向 DBPlusEngine 定义的顶层接口进行定制化扩展,而无需改动内核代码。

L3 生态层 #

用于对接和融入现有数据库生态,包括数据库协议、SQL 解析器和存储适配器,分别对应于 DBPlusEngine 以数据库协议提供服务的方式、SQL 方言操作数据的方式以及对接存储节点的数据库类型。

DBPlusEngine 的接入形态包括驱动端和代理端两种形态,即 DBPlusEngine-Driver 和 DBPlusEngine-Proxy。

DBPlusEngine-Driver #

轻量级的 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template 或直接使用 JDBC;
  • 支持任何第三方的数据库连接池,如:DBCP,C3P0,BoneCP,HikariCP 等;
  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库。

DBPlusEngine-Proxy #

透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的数据库)版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client、MySQL Workbench、Navicat 及 DBeaver 等)操作数据,对 DBA 更加友好。

  • 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用;
  • 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。

安全体系 #

DBPlusEngine-Proxy (下称 Proxy)提供了完善的安全体系,兼顾 Engine 安全和数据安全两大部分。

登录认证 #

Proxy 拥有严格的登录认证机制,只有经过身份认证的用户才可以成功建立连接。

密码认证

默认情况下,Proxy 使用密码认证方式,登录用户需提供正确的用户名和密码。

特别的,由于 Proxy 支持多种数据库协议(如 MySQL、PostgreSQL 等),当用户应用不同的数据库客户端时,Proxy 能够自动适配密码通信协议,在复杂场景下为用户提供一致的安全体验。

主机限制

管理员可以为 Proxy 的用户限制登录主机地址,以提高安全等级。如:

- !AUTHORITY
    users:
      - user: root@127.0.0.1
        password: root

以上配置指定了 root 用户只能从 127.0.0.1 这个地址访问 Proxy,从其他地址登录时,即使密码正确也将被拒绝。

LDAP 认证

为方便企业用户进行统一认证管理,Proxy 也提供了 LDAP(Lightweight Directory Access Protocol)认证方式,LDAP 认证现已支持 MySQL 和 PostgreSQL 客户端。 同时, Proxy 允许用户以非常灵活的方式来接入 LDAP,例如:

  1. 可以配置为默认使用 LDAP,这样所有用户都通过 LDAP 认证;
  2. 支持为用户配置 auth 属性,指定用户使用密码或 LDAP 认证,各个用户可以使用不同方式;
  3. 各个用户可以使用不同的 LDAP 认证器,即对接不同的 LDAP 服务;
  4. 支持为用户指定 DN 模板,满足复杂场景的需要;
  5. 支持 LDAPS 协议,可进一步提升安全等级。

管理安全 #

在 DBPlusEngine-Proxy 中,用户能够通过 DistSQL 执行多种维度的管理操作,包括但不限于:

  1. Proxy 配置管理,如事务类型、日志开关等;
  2. 逻辑库管理;
  3. 存储资源管理;
  4. 数据分片规则管理;
  5. 读写分离规则管理;
  6. 加解密规则管理;
  7. 数据库发现规则管理;
  8. 影子库规则管理;
  9. 元数据查看等。

由于 DistSQL 功能强大,数据库管理员可为不同用户分配不同的 DistSQL 权限,以实现 Proxy 管理安全。例如:

GRANT DIST SHOW SHARDING ON sharding_db.* TO 'sharding'@'%';

通过以上授权语句,将逻辑库 sharding_db 中的“查看分片规则”的权限授予 ‘sharding@%',则该用户能够在 sharding_db 中执行 SHOW SHARDING TABLE RULESSHOW SHARDING BINDING TABLE RULES 等 SHARDING 相关的 RQL,但无法执行其他未授权的 DistSQL。

例如 ‘sharding@%’ 用户此时执行 CREATE SHARDING TABLE RULE 语句,将会得到异常提示:

Access denied for operation [CREATE] of subject sharding_db.table_name:SHARDING.]

若要向 ‘sharding@%’ 用户授予所有 DistSQL 权限,可以通过如下方式:

GRANT DIST RDL,RQL,RAL ON sharding_db.* TO 'sharding'@'%';

访问安全 #

数据访问安全,是企业级数据库必备的能力之一。DBPlusEngine-Proxy 作为分布式数据库集群的入口,为用户提供了全面的访问控制能力。 与传统集中式数据库或单协议数据库不同,DBPlusEngine 拥有管理多类型底层数据库和对接多协议客户端的能力,在进行访问控制时就会面临诸多挑战:

  • 不同数据库类型拥有不同的逻辑概念;
  • 不同数据库类型使用不同的方言;
  • 不同数据库提供了不同的存储结构。

为了给用户提供一致的安全体验,Proxy 屏蔽了底层数据库的差异,提供统一易用的安全体系,具有如下特点:

  • 细粒度权限管理:支持库级、表级、列级访问控制;
  • 统一的交互语言:使用 DistSQL 进行用户和权限的管理,适用于不同的数据库协议;
  • 存储独立:权限的信息保存在 DBPlusEngine 的治理中心,不依赖于底层数据库;
  • 实时生效:对用户和权限的管控实时生效,无需重启或手动刷新。

例如,若管理员向 ‘sharding@%’ 授予 sharding_db 中 t_order 表的查询和写入权限,可以执行这样的 DistSQL:

GRANT DIST SELECT, INSERT ON sharding_db.t_order TO sharding@'%';

操作完成之后,‘sharding@%’ 用户立即获得相应授权。若用户执行未授权的操作,如 DELETE,将会收到拒绝提示:

=> DELETE FROM sharding_db.t_order WHERE id = 1;
Access denied for operation [DELETE] of subject sharding_db.t_order]

存储安全 #

近年来,数据安全和隐私保护越来越受到重视,处理数据加密和数据脱敏也成为了许多企业的一项重要任务。在这样的趋势下,技术团队面临了新的挑战:

  • 加密的过程,在应用端还是在数据库?
  • 如果是应用端,各个项目团队都会有编码任务,后期修改算法影响的范围也极大;
  • 如果在数据库,不同数据库的加密方式不同,企业中将存在多种加密手段,不能很好的复用。

为此,DBPlusEngine 提供了崭新的思路,通过在数据引擎中支持可配置的加密规则,在简化开发团队工作量的同时,提供了更通用的数据安全服务。DBPlusEngine 中的数据加密功能具有众多优势:

  • 对应用无侵入,不需修改源码;
  • 广泛可用,适用于任何通过 DBPlusEngine 接入的数据库;
  • 多种加密算法可选,包括 SHA、SM3、SM4 等内置算法支持;
  • 定制灵活:用户可根据 SPI 自定义加密算法,满足个性化需求。

以用户手机号加密场景为例,在应用接入 DBPlusEngine 后,只需要通过 YAML 或 DistSQL 定义一个 ENCRYPT RULE,如:

CREATE ENCRYPT RULE t_user (
COLUMNS(
(NAME=mobile,CIPHER=mobile,TYPE(NAME="AES",PROPERTIES("aes-key-value"="123456abc"'")))));

这样,当应用向 t_user 表写入新记录时,DBPlusEngine 会自动对 mobile 字段进行加密,存储密文内容。反之,查询时也能将密文自动解密,应用得到的查询结果将会恢复为明文。

这样,既保证了应用对数据加密过程的无感,又保证了存储数据的安全。如果发生“脱库”一类的黑客事件,泄露的也仅仅是密文内容,安全风险大大降低。

架构优势 #

  • 高性能

驱动程序端历经多年打磨,效率接近原生 JDBC,性能极致。主流竞品中,目前只有 ShardingSphere 提供驱动端接入形态。

  • 高兼容

代理端适用于任何兼容 MySQL/PostgreSQL 协议的的客户端,驱动程序端支持任意实现 JDBC 规范的数据库。

  • 高扩展

面对数据库替换场景,DBPlusEngine 可满足业务平滑迁移,对业务零侵入。

  • 低成本

保留原有数据库技术栈,对 DBA 友好,学习及管理成本低。

  • 安全稳定

不干预数据库内核,基于成熟的数据库底座提供增能力,兼顾安全性及稳定性。

  • 弹性扩展

具备弹性的计算和存储能力,可满足计算及存储层不断变化的需求,在线完成数据库拆分和迁移;

  • 开放生态

可插拔模型,使内核、功能组件以及生态对接完全能够灵活的方式进行插拔式扩展,用户可以像使用积木一样定制适合业务的独特系统。