
1.伸缩性
1.1 分布式存储打破数据库数据的上限
传统数据库均采用本地文件系统或者磁盘阵列的方式进行数据存储,理论上,这种存
储方式是有上限的,其上限取决于本地磁盘系统的容量或者磁盘阵列服务器的容量。
而分布式存储是没有上限的,只要在分布式集群中增加数据服务的结点就可以无限的
增加数据存储的量。
分布式存储,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中
的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性
的焦点,不能满足大规模存储应用的需要。分布式存储采用可扩展结构,利用多台存
储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠
性、可用性和存取效率,还易于扩展。
1.2 分布式存储提升数据访问性能
磁盘的 I/O 一直是数据库产品的软肋,尤其当数据增加到 TB 甚至 PB 级别之后,这种
I/O 的延迟将变得更为明显。采用分布式存储就是为了解决数据增加到 TB 甚至 PB 级
别之后的 I/O 瓶颈问题。众所周知,相对于网络技术的发展,磁盘 I/O 的发展要远远滞
后(这里提及的磁盘是 HDD、SSD),分布式系统将数据访问分散在不同的数据服务节
点上,其效果是多个硬盘的同时读写操作(并发处理),该方式将传统数据库的磁盘
I/O 的压力转化为网络 I/O,从而提升整体性能。
2.高可用性
2.1 分布式存储集群和容错
UXDB 是将数据处理(数据库引擎)和数据存储(分布式存储)分离的数据库系统。
当数据处理和数据存储分离之后,数据库引擎将不再参与数据的复制(replication),该
工作将由分布式存储接管,UXDB 的分布式存储系统支持:无复制(none replication)、
读复制(read only replication)和读写复制(read-write replication)。当启动了复制功能
后,同一份数据会分别存储在不同的数据内容服务节点上(缺省为 3 份 replication 的副
本),当集群中任何一台数据内容服务结点失败时,分布式存储都将能够提供完整的数
据,这将不会影响数据库引擎的正常工作。
此外,分布式存储还包括 DIR-目录服务器、元数据和复制服务器,这两种服务器均支
持 Hot-Standby 的集群。
2.2 数据库引擎的 Hot-Standby 集群
数据库引擎支持 Hot-Standby 集群方式,该方式是通过以流方式实时复制 WAL
(write、head log)实现的。
流复制传递日志的方式有两种,一种是异步方式,一种是同步方式。异步方式是事务
提交后不必等日志传递到 Standby 即可返回,所以 Standby 数据库通常比 Primary 数据
库落后很少;同步方式在 Primary 数据库提交事务时,一定会等到 WAL 日志传递到
Standby 后才会返回,这样当主备库切换时可以做到零数据丢失。
3.数据一致性
3.1 支持 ACID
UXDB 数据库支持 ACID。
ACID 是指数据库事务正确执行的四个基本要素的缩写,包含:原子性(Atomicity)、
一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。UXDB 支持事务的
这四种特性,可以使开发人员的开发工作得到最大限度的简化,不必考虑过于复杂的
并发问题,有易于保证程序在并发状态下的正确性。
表 1 事务的 4 个特征 ACID 及响应的实现技术
| ACID | 实现技术 |
|---|---|
| 原子性 | MVCC |
| 一致性 | 约束(主键、外键等) |
| 隔离性 | MVCC |
| 持久性 | WAL |
3.2 MVCC
MVCC(Multiversion Concurrency Control)即多版本并发控制,它可以避免读写事务
之间的互相阻塞,与通常的封锁技术相比极大的提高了业务的并发性能。UXDB 中的
MVCC 实现原理可简单概括如下:
- 数据文件中存放同一逻辑行的多个行版本(称为 Tuple);
- 每个行版本的头部记录创建以及删除该行版本的事务的 ID(分别称为 xmin 和
- xmax);
- 每个事务的状态(运行中,中止或提交)记录在 ux_clog 文件中;
- 根据上面的数据并运用一定的规则每个事务只会看到一个特定的行版本;
通过 MVCC 读写事务可以分别在不同的行版本上工作,因此能够在互不冲突的情况下
并发执行。
3.3 WAL
当系统意外宕机后,恢复时需要回退未完成事务所做的更改,并确保已提交事务所作
的更改均已生效。在 UXDB 中通过前面提到的 MVCC 很容易做到的第一点,只要把所
有 ux_clog 文件中记录的所有“运行中”的事务的状态置为“中止”即可,这些事务在
宕机时都没有结束。对于第二点,必须确保事务提交时修改已真正写入到永久存储
中。但是直接刷新事务修改后的数据到磁盘很费时,为解决这个问题引入了
WAL(Write-Ahead Log)。
WAL 的基本原理如下:
- 更新数据页前先将更新内容记入 WAL 日志;
- 异步刷新数据 Buffer 的脏页和 WAL Buffer 到磁盘;
- Buffer 管理器确保绝不会先于对应的 WAL 记录刷新脏数据到磁盘;
- 事务提交时,将 WAL 日志同步刷新到磁盘;
- Checkpoint 发生时,将数据 Buffer 的所有脏页刷新到磁盘。
4. 支持多租户
4.1 基于数据库的多租户
UXDB 支持基于数据库的多租户,采用该种方式的多租户使得数据库的隔离较为彻
底,从认证层面就开始隔离,数据库与数据库之间无法直接访问,必须登陆到对方的
数据库中才能访问记录。
同时,UXDB 支持进一步的通过预先配置的方式进行来源 IP 控制,即只允许某些 IP
白名单中的 IP 访问数据库。
4.2 基于 SCHEMA 的多租户
UXDB 支持基于 SCHEMA 的多租户方式,该方式是单库多 SCHEMA 的方式,通过
UXDB 的权限体系进行隔离用户,访问不同的 SCHEMA。
4.3 基于数据和访问的的多租户
除了上述两种传统的基于数据库和 SCHEMA 的多租户方式之外,UXDB 还可提供第三
种基于数据和访问的多租户模式,该方式是在同一个数据库,同一个 SCHEMA 下,针
对每个用户建立一个不同的角色,对需要进行隔离的数据库表设置针对角色和操作的
行级数据访问控制(参见安全性 4.5.4)来达到多个用户在同一个数据库中的数据访问
和操作范围的控制和隔离。
5. 安全性
5.1 全数据库级别加密
UXDB 支持全数据库级别数据加密,即数据在持久化到分布式存储之前就进行了数据
加密。
5.2 列数据加密
UXDB 支持对关键表的关键列进行加密设置,该设置将在该列数据持久化到分布式存
储之前就进行了数据加密。
5.3 表级访问控制
UXDB 支持基于用户级别的对象访问控制。
5.4 行级数据访问控制
UXDB 支持对行级数据的访问授权,这是一种基于用户的访问控制,用来根据用户权
限来进行数据访问的控制。可以限制查询返回以及数据操作的结果。该控制可以加载
命令上也可以加载用户角色上,或者两者都加。
5.5 行级数据访问控制通信信道加密
UXDB 支持全程通信信道的加密,全程通信信道指的是从客户端到数据库处理引擎,
数据库处理引擎到分布式存储的所有通信信道。
5.6 基于会话的访问隔离
UXDB 采用多进程的方式处理请求,这确保了每个连接会话都将由一个独立的 UXDB
服务进程来处理。
5.7 内置数据库审计
UXDB 提供可定制的基于会话和操作的数据库审计功能,实时记录数据库活动,对数
据库操作进行细粒度审计(谁在什么时候做了什么以及结果)。它通过对用户访问数据
库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时
加强内外部数据库网络行为记录,提高数据资产安全。
6.二次开发和扩展
UXDB 是基于扩展设计的云数据库系统,该系统提供了针对扩展外部数据源和自定义
数据处理的二次开发和扩展的框架。
对于外部数据源的扩展,UXDB 提供了外部数据连接器框架,该框架可以为用户提供
和自定义的外部数据源的对接,用户将通过 UXDB 的引擎统一对外部数据进行操作,
该操作使得对外部数据源的操作就像操作本地数据库一样。
对于自定义数据处理扩展,UXDB 提供了一套插件的框架,用户可以通过该框架植入
自定义的处理模块(如自定义的函数,数据处理模块等),通过该插件框架植入的自定
义模块并可通过在 SQL 中进行调用,就像调用其他 UXDB 内置的函数一样。
本文节选至《优炫数据库 UXDB 技术白皮书》,前往查看更多内容。




