分布式关系型数据库
数据服务正在转型微服务架构,因此,数据库的“资源池化”成为了分布式数据库发展的核心需求。分布式在线交易场景也在围绕这一方向进行架构改造升级。如今,应用程序从传统烟囱式构建向微服务转型,其中每一个微服务对应一个独立的数据库已经不可能了。
在这种情况下,数据服务资源池必须拥有能直接面向上层几百上千个来自不同开发商、不同团队、开发能力不一、应用类型不同、以及 SLA (Service-Level Agreement) 安全级别不同等各类需求的能力 。因此,资源池必须具备可弹性扩张、资源隔离、多租户、可配置一致性、多模式(支持各类 SQL 协议)、集群内可配置容灾策略等一系列功能。
采用计算层与存储层分离设计,数据库底层存储采用 Raft 算法实现分布式环境下数据一致性技术,并且结合多分区、事务隔离等技术,为用户提供完整的分布式事务功能。计算层是数据库的应用服务接入层,支持多种解析协议,包括:MySQL 协议、PostgreSQL 协议、Spark SQL 协议、Hive SQL 协议、S3 协议、Posix 协议和 API 协议。用户可以根据不同场景,选择使用合适的计算层协议,完成应用服务开发。
支持多种类型的数据库实例。7 种不同的实例类型。
实例类型 | 实例分类 | 描述 |
---|---|---|
MySQL | 结构化数据 | 适用于纯联机交易场景,与 MySQL 保持 100% 兼容 |
PostgreSQL | 结构化数据 | 适用于联机交易场景与中小量数据的分析类场景,与 PostgreSQL 基本保持兼容 |
SparkSQL | 结构化数据 | 适用于海量数据的统计分析类场景,与 SparkSQL 保持 100% 兼容 |
MariaDB | 结构化数据 | 适用于联机交易场景,与 MariaDB 的语法和协议保持完全兼容 |
JSON API | 半结构化数据 | 适用于基于 JSON 数据类型的联机业务场景,与 MongoDB 保持部分兼容 |
S3 对象存储 | 非结构化数据 | 适用于对象存储类的联机业务与归档类场景,与 S3 保持 100% 兼容 |
POSIX 文件系统 | 非结构化数据 | 适用于使用传统文件系统向分布式环境迁移的业务场景,与标准 Ext3/XFS 等基本保持兼容 |
数据库存储引擎
数据库存储引擎采用分布式架构。集群中的每个节点为一个独立进程,节点之间采用 TCP/IP 协议进行通讯。
同一个操作系统可以部署多个节点,节点之间采用不同的端口进行区分。

节点分为三种不同的角色:协调节点、编目节点与数据节点。
协调节点
协调节点不存储任何用户数据。作为外部访问的接入与请求分发节点,协调节点将用户请求分发至相应的数据节点,最终合并数据节点的结果应答对外进行响应。
编目节点
编目节点主要存储系统的节点信息、用户信息、分区信息以及对象定义等元数据。在特定操作下,协调节点与数据节点均会向编目节点请求元数据信息,以感知数据的分布规律和校验请求的正确性。
数据节点
数据节点为用户数据的物理存储节点,海量数据通过分片切分的方式被分散至不同的数据节点。在关系型与 JSON 数据库实例中,每一条记录会被完整地存放在其中一个或多个数据节点中;而在对象存储实例中,每一个文件将会依据数据页大小被拆分成多个数据块,并被分散至不同的数据节点进行存放。
数据库存储引擎与数据库实例均支持水平弹性扩展,任何角色的节点均提供高可用冗余机制,不存在单点故障的可能。

高可用与容灾
由于 PC 服务器内置物理磁盘不同于传统小型机加存储设备的架构,在 PC 服务器出现物理故障时无法保障存储在本地磁盘的数据不丢不坏,因此所有基于 PC 服务器内置盘架构的数据库,必须采用多副本机制以保障数据库的高可用与容灾。
数据库实例
由于数据库实例进程均为无状态节点,因此同样配置的数据库实例进程可以互为高可用冗余。不论创建 MySQL、PostgreSQL、JSON API 或 S3 实例,每个实例对外均可暴露一个或多个接入地址(IP 地址+端口)。应用程序连接到任意一个接入地址均可向数据库实例进行数据读写操作,且保证多个接入地址之间的数据一致性。用户可以为每个实例的多个接入地址前置一个类似 Ngnix 或 F5 的高可用负载均衡设备,即可轻易实现多个接入地址的高可用冗余。
协调节点
作为数据库存储引擎的路由节点,协调节点自身无状态,因此所有协调节点之间可以作为完全对等配置,对上层应用程序或计算引擎做到高可用。应用程序可以通过上层数据库实例访问数据,也可直接对数据库存储引擎进行 API 访问。当应用程序直接连接到协调节点进行 API 操作时,应用可以通过 数据库客户端连接池配置多个 IP 地址与端口实现高可用配置。如果应用通过上层数据库实例进行访问,所有数据库实例均支持多个接入地址的高可用的配置方式。
编目节点
编目节点作为数据字典,维护了数据库存储引擎的拓扑结构、安全策略、表与集合定义以及分片规则等一系列信息。在 数据库的集群配置中,编目节点以一个独立复制组的方式存在,默认使用三副本强一致同步策略。在故障发生时,任何一个节点出现问题均可将服务实时漂移到其他的对等节点中。
数据节点
数据库中所保存的用户数据由数据节点进行存放与读取。在集群部署环境中,每个数据复制组均会默认使用三副本进行数据存放。在数据复制组中,任何一个数据节点进程出现故障,该复制组内的其他节点将会实时接管其服务。具体来说,如果发生故障的节点为该复制组内的主节点,则其余的从节点将会在检测到心跳中断后发起投票请求,使用 Raft 协议选举出新的主节点;而如果发生故障的为从节点,则协调节点检测到心跳中断后将会将该数据节点存在的会话转移至其余数据节点,尽可能对应用程序保持透明。
异地容灾
在传统的多节点投票选举机制中,为了确保复制组内的节点不会发生脑裂问题,集群必须确保超半数节点存活且达成投票共识,才能将其中一个数据节点或编目节点当选为主节点以提供读写服务。但是在同城双中心或类似的环境下,用户很难保证在任何一个中心发生整体故障时,整个集群所有复制组依然会有超半数的节点存活。因此,数据库使用集群分离与合并功能,能够在同城双中心的环境中进行秒级集群分裂,将原本处于两个数据中心内的单集群分裂为两个独立部署的集群,保证在存活数据中心内的数据服务能够以秒级启动并提供完整的数据库读写服务,同时保证交易数据的稳定可靠,做到秒级 RTO、RPO=0。
分布式事务
强一致分布式事务功能。利用二段提交机制,分布式存储引擎实现对结构化与半结构化数据的强一致分布式事务功能,不论用户创建哪种数据库实例,其底层均可提供完整的分布式事务及锁能力。
HTAP混合负载
数据库既可以运行 OLTP (Online Transactional Processing) 联机交易,也可以同时运行 OLAP (Online Analytical Processing) 统计分析业务。用户可以针对复制组的多副本,在节点和会话等多个级别指定读写分离策略,同时可以通过创建数据共享但不同类型的数据库实例(例如 MySQL 实例与 SparkSQL 实例),分别服务于联机交易业务与统计分析业务,做到针对同样数据的联机交易与统计分析业务同时运行且互不干扰。
多租户隔离
应用程序微服务化的今天,分布式数据库需要以一种平台化(PaaS)的形式对上层大量的应用与微服务同时提供数据访问能力。在这种情况下,如何做到不同微服务之间所对应的底层数据逻辑与物理隔离,是保障云环境中分布式数据库安全、可靠和性能稳定的前提。
通过包括数据域、HTAP混合负载、多模式接口、水平弹性扩展在内的多种机制, 保障应用程序在云环境下的多租户隔离。