集中式数据库是我们在日常工作使用最多的数据库,它采用的是Shared Everything(完全共享)的架构,数据库共享CPU、内存以及磁盘等资源,并行处理能力相对较差。
Tips 与Shared Everything对应的是Shared Nothing架构,即节点之间不共享CPU、内存以及磁盘等资源,往往运用于分布式数据库中。
集中式数据库系统是由一个处理器(分配若干个CPU)、与它相关联的数据存储设备(利用内存、磁盘等存储介质)以及其他外围设备(例如网卡)组成的,它被物理地定义到单个位置(分配到具体的某一台机器上)。数据库提供数据处理能力,支持用户利用终端连接该数据库,并且在终端进行操作。由于所有数据仅存储在单个位置,因此更易于访问和协调数据。
在集中数据库流行的时期,以Oracle、DB2为代表的数据库占据着主流数据库的市场,从数据的存储特点来看,此时数据库的数据存储文件都是基于单体的服务器(例如小型机、一体机以及PC服务器)的磁盘或者文件系统;从事务层面来看,以上数据库基本上都是支持事务的数据库,利用Redo 以及 Undo机制、Checkpoint机制等来保证事务的一致性;从扩展性来看,数据库无法进行横向扩展,数据库的性能依赖所在服务器的整体资源限制。
这个时期,OLTP型应用或者OLAP型数据仓库等系统都是基于集中式数据库(例如Oracle)构建的。集中式数据库以其较强的性能以及稳定性,总体上满足不同场景的需求。
虽然商业数据库性能较高,但使用成本也较高(使用以及运维成本,Oracle是按照核数收费)。随着互联网的发展,以MySQL以及PostgreSQL为代表的开源数据库逐渐被互联网公司广泛使用(并且被某些国内大厂修改之后作为云服务的基础)。DB-Engines 提供的数据库排名如图3-4所示。
图3-4 DB-Engines数据库排名
开源数据库虽然不需要商业授权,但是整体的性能比商业数据库差。为了满足业务的需求,数据库需要进行分库分表,一些分库分表组件应运而生,其中比较出名的是Mycat。
Mycat是目前最流行的基于Java语言编写的数据库中间件,它的核心功能是分库分表,支持读写分离和分库分表,而且比较易用,对原有的应用系统侵入比较小,系统改造比较易于实现。它将客户端处理的SQL按照一定的规则分配到不同的数据库节点上。Mycat分库分表原理图如图3-5所示。
图3-5 Mycat分库分表原理图
总的来看,传统关系型数据库的分库分表往往都是利用数据库中间件作为路由层将数据转发到具体的数据库节点,然后再通过数据库中间件处理后将结果返回到具体的客户端。