技术架构 #
整体架构 #
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,例如:
- 可以配置为默认使用 LDAP,这样所有用户都通过 LDAP 认证;
- 支持为用户配置 auth 属性,指定用户使用密码或 LDAP 认证,各个用户可以使用不同方式;
- 各个用户可以使用不同的 LDAP 认证器,即对接不同的 LDAP 服务;
- 支持为用户指定 DN 模板,满足复杂场景的需要;
- 支持 LDAPS 协议,可进一步提升安全等级。
管理安全 #
在 DBPlusEngine-Proxy 中,用户能够通过 DistSQL 执行多种维度的管理操作,包括但不限于:
- Proxy 配置管理,如事务类型、日志开关等;
- 逻辑库管理;
- 存储资源管理;
- 数据分片规则管理;
- 读写分离规则管理;
- 加解密规则管理;
- 数据库发现规则管理;
- 影子库规则管理;
- 元数据查看等。
由于 DistSQL 功能强大,数据库管理员可为不同用户分配不同的 DistSQL 权限,以实现 Proxy 管理安全。例如:
GRANT DIST SHOW SHARDING ON sharding_db.* TO 'sharding'@'%';
通过以上授权语句,将逻辑库 sharding_db 中的“查看分片规则”的权限授予 ‘sharding@%',则该用户能够在 sharding_db 中执行 SHOW SHARDING TABLE RULES
、SHOW 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 友好,学习及管理成本低。
- 安全稳定
不干预数据库内核,基于成熟的数据库底座提供增能力,兼顾安全性及稳定性。
- 弹性扩展
具备弹性的计算和存储能力,可满足计算及存储层不断变化的需求,在线完成数据库拆分和迁移;
- 开放生态
可插拔模型,使内核、功能组件以及生态对接完全能够灵活的方式进行插拔式扩展,用户可以像使用积木一样定制适合业务的独特系统。