这里,介绍一个底层存储引擎。它是一种基于DHT的key-value存储引擎,可实现海量大规模扩展,通过多份副本来实现数据高可靠性和高可用性。
在整个系统中的位置如下,
----------------------------------------------------------------------------------------------------------------
Storage Application
----------------------------------------------------------------------------------------------------
IB/Ethernet 网络连接层
----------------------------------------------------------------------------------------------------
Storage Service
----------------------------------------------------------------------------------------------------
Storage Engine
----------------------------------------------------------------------------------------------------
HardWare
-----------------------------------------------------------------------------------------------------------------
其中,Storage Application是应用程序,IB/Ethernet提供应用到存储服务的接口。网络连接层之下统称为统一存储,包括存储服务层、存储引擎和存储硬件3层。
存储服务层提供通用的存储服务,像虚拟块存储、对象存储、简单队列服务、数据库服务等,向应用层程序提供通用的API,并可兼容S3等接口;存储引擎则实现了一个分布式的key-value存储系统,通过DHT路由算法将数据写到对应的底层硬件存储设备,并通过副本机制实现了数据可靠性。要注意的是,这是一个弱一致性的分布式存储系统,提供最终一致性服务,并不适合应用在强一致性的实时应用场合,通过用来做备份、对象存储等。
三、关键技术方案
先注意几个关键术语:分区、虚拟节点、物理节点。
为了实现负载均衡,一般会将一个物理节点虚拟成几个虚拟节点,在DHT环上,虚拟节点和分区是一一对应的,描述了该分区应该属于哪个虚拟节点,可进一步推导出应该位于哪一个物理节点。
1. DHT
对整个系统的哈希空间进行分区;每个分区对应一个虚拟节点;建立物理节点和分区之间的映射关系。
当集群节点数目变化后,只需要动态更新分区和物理节点的映射。对一个包含m个节点的集群,新增一节点,只需移动1/(m+1)节点的数据;而减少一节点,只需移动1/m节点数据。
2. 复制和路由策略
复制:复制因子(与应用有关)、副本放置策略
路由:3种策略(客户端路由、主节点路由和代理路由)
3. 一致性策略
最终一致性。涉及的技术如下:
1)NRW
是一种quorum机制。假定,复制因子为3,即系统中一份数据有n个副本;r次读成功才认为一次读成功,w次写成功才认为一次写成功。
当r+w>n时,读取r份数据,一定能够保证其中有一份数据是最新的。至于哪份数据最新,则必须借由其它技术来识别,如向量时钟或时间戳。
2)向量时钟/时间戳
3)读修复
在r次读过程中,发现某节点数据是“旧”数据,则可以通过将新数据拷贝到此节点覆盖旧数据,以保证一致性。这就是读修复,指读操作时触发对旧数据的更新。
4) Hinted Handoff提示切换
当某节点故障时,会先将属于此节点的数据保存到别的节点C(相邻的下一节点),当节点故障恢复后重新进入系统时,由C节点负责将数据拷贝到此节点。
5)Anti-entropy
多副本不一致的检查和修复,加速数据修复过程。节点独立生成校验信息(key, version),发生此节点对应的副本节点,通过比较进行更新。会周期性的进行,避免由于某节点没有被读到不能触发readrepair,而长时间的处于不一致状态。
6)Mark-delete
标记删除。在逆熵操作时删除,避免已删除数据被恢复。