跳转至

分布式数据库简介

1.简介

分布式数据库和单机数据库相比,主要加入的考虑是网络带来的影响。虽然网络提供了连接多个单机数据库的能力,但是由于基于网络的连接是不可靠的,因此容灾是分布式的重要话题之一。

同时,相比单机的系统,网络连接的时延更大,因此需要考虑延迟的问题。

除此之外,还有许多常见的问题如分布式锁、一致性问题等,不在此处讨论。

2.分布式系统架构

注意,以下的构成如磁盘、内存可以看成是由多节点组成的逻辑单元,由软件的中转层提供抽象。常见的架构思路有三种:

  • Shared Memory:等同于水平扩展CPU,通过网络共享逻辑单机的内存和磁盘。虽然看起来共享内存对事务协调或者数据修改等操作比较便利,但并没有被广泛使用。从结构的角度上来说,计算存在对内存的大量访问,而此时通过网络去对内存进行访问无疑大大降低了运行速率。
  • Shared Disk:分布式主机共享一个磁盘,可以看成是各节点为计算节点,保存无状态数据,而有状态数据落地到磁盘当中。好处是计算节点和磁盘可以方便地进行动态水平扩展,问题存在于若多个计算节点修改同一个对象时,他们拥有的数据副本不一定是一致的,需要一种机制对计算节点数据进行同步。云原生数据库如HBASE、Oracle、HDFS等都采用这种架构。
  • Shared Nothing:每个节点都是一个完整的单机数据库,他们通过对数据进行分区、分片等手段独立地负责一部分的数据。对于不同节点的数据,需要利用网络进行数据获取和同步等操作。好处是拥有更高的性能,但扩容和一致性的保证是难点。

无论采用何种架构,分布式系统需要保证的是底层的数据分布对上层不可见,如何获取数据及其所在分区应该有系统自行获取。

3.分片

最简单的方法是基于某些粒度进行分区,如基于表。但基于表显然不是一个好主意,多个表的大小不一致,且也不是一成不变的。

更好的方法是基于key进行分析,如对key进行hash,并对分区数取模。这种做法在节点不变的时候获取分区简单且快速,但是在节点变化的时候,显然会出现问题。

采用的解决方法称为一致性哈希,该方法想象节点均匀的分布在一个环上,每个节点都负责环等长的一部分。

4.事务控制

如单机系统需要一个中心对各个数据对象进行控制权协调(该中心即单机系统的数据结构,如锁),分布式系统同样需要一个中心,称之为事务协调器。

常见的手段有两种:

  • 中心协调器:表示由一个节点或多个节点组成的集群充当管理者,所有事务都需要经过该中心协调器的同意才可以运行,并由它来对事务的执行情况进行跟踪、状态确认与协调。
  • 去中心化协调器:由参与事务的节点进行内部选举,每次都选出一个临时的协调者,扮演事务控制的角色。