# 分布式数据库 ## 1. 基础 ### 1.1 什么是分布式数据库? - 由表及里、由外到内是人们认识事物的普遍规律,所以我们让也从内外部两个视角来观察。 - 外部视角:外部特性 - 外部视角,就是看看分布式数据库具备哪些特性,能解决什么问题。 - 业务应用系统可以按照交易类型分为联机交易(OLTP)场景和联机分析(OLAP)场景两大类。OLTP 是面向交易的处理过程,单笔交易的数据量小,但是要在很短的时间内 给出结果,典型场景包括购物、缴费、转账等;而 OLAP 场景通常是基于大数据集的运算,典型场景包括生成个人年度账单和企业财务报表等。 - 定义 1.0 OLTP 关系型数据库 - OLTP 场景的通常有三个特点: - **写多读少**,而且读操作的复杂度较低,一般不涉及大数据集的汇总计算; - **低延时**,用户对于延时的容忍度较低,通常在 500 毫秒以内,稍微放大一些也就是秒级,超过 5 秒的延时通常是无法接受的; - **高并发**,并发量随着业务量而增长,没有理论上限。 - **分布式数据库是服务于写多读少、低延时、高并发的 OLTP 场景的数据库。** - 定义 2.0 + 海量并发 - 这个“海量并发”的下限大致是 10,000TPS - 基于这些理解,我们可以再得到一个 2.0 版本的定义:**分布式数据库是服务于写多读少、低延时、海量并发 OLTP 场景的关系型数据库**。 - 定义 3.0 + 高可靠 - 可靠性还要更复杂一点,包括两个度量指标,恢复时间目标(Recovery Time Objective, RTO)和恢复点目标(Recovery Point Objective, RPO)。RTO 是指故障恢复所花费的时间,可以等同于可靠性;RPO 则是指恢复服务后丢失数据的数量。 - 数据库高可靠意味着 RPO 等于 0,RTO 小于 5 分钟。 - 3.0 版本的定义,**分布式数据库是服务于写多读少、低延时、海量并发 OLTP 场景的,高可靠的关系型数据库**。 - 定义 4.0 + 海量存储 - 最后,我们终于得到一个 4.0 终极版本的定义,**分布式数据库是服务于写多读少、低延时、海量并发 OLTP 场景的,具备海量数据存储能力和高可靠性的关系型数据库**。 - 内部视角:内部构成 - 4.0 版本的定义很相似。但是,它们向用户暴露了太多的内部复杂性。在我看来,对用户约束太多、使用过程太复杂、不够内聚的方案,不能称为成熟的产品。 - 客户端组件 + 单体数据库 - 通过独立的逻辑层建立数据分片和路由规则,实现单体数据库的初步管理,使应用能够对接多个单体数据库,实现并发、存储能力的扩展。其作为应用系统的一部分,对业务侵入 较为深。 - 这种客户端组件的典型产品是 Sharding-JDBC。 - ![分布式数据库ShardingJDBC](pic/分布式数据库ShardingJDBC.png) - 代理中间件 + 单体数据库 - 以独立中间件的方式,管理数据规则和路由规则,以独立进程存在,与业务应用层和单体数据库相隔离,减少了对应用的影响。随着代理中间件的发展,还会衍生出部分分布式事 务处理能力。这种中间件的典型产品是 MyCat。 - ![分布式数据库MyCAT](pic/分布式数据库MyCAT.png - 单元化架构 + 单体数据库 - 单元化架构是对业务应用系统的彻底重构,应用系统被拆分成若干实例,配置独立的单体数据库,让每个实例管理一定范围的数据。例如对于银行贷款系统,可以为每个支行搭建 独立的应用实例,管理支行各自的用户,当出现跨支行业务时,由应用层代码通过分布式事务组件保证事务的 ACID 特性。 - ![分布式数据库单元化架构](pic/分布式数据库单元化架构.png) - 根据不同的分布式事务模型,应用系统要配合改造,复杂性也相应增加。例如 TCC 模型下,应用必须能够提供幂等操作。 - 在分布式数据库出现前,一些头部互联网公司使用过这种架构风格,该方案的应用系统的改造量最大,实施难度也最高。 - **分布式数据库则是将技术细节收敛到产品内部,以一个整体面对业务应用**。