概览
Dynamo 是一个高可用的 KV 存储系统。为了保证高可用和高性能,Dynamo 采用了最终一致性模型,它对开发人员提供一种新型 API,使用了版本机制,并通过用户侧辅助解决冲突。Dynamo 目标是提供不间断的服务,同时保证性能和可扩展性。由于亚马逊大量采用了去中心化、高度解耦微服务架构,因此对微服务状态的存储系统的可用性要求尤其高。
S3 (Simple Storage Service)是 Amazon 另一款有名的存储服务,虽然也可以理解为 KV 存储,但它和 Dynamo 的目标场景并不一致。S3 是面向大文件的对象存储服务,主要存储二进制文件,不提供跨对象的事务。而 Dynamo 是一款面向小文件的文档存储服务,主要存储结构化数据(如 json),并且可以对数据设置索引,且支持跨数据条目的事务。
相对于传统的关系型数据库,Dynamo 可以认为是只提供主键索引,从而获取更高的性能和更好的扩展性。
为了实现可扩展性和高可用性,并保证最终一致性,Dynamo 综合使用了以下技术:
- 使用一致性哈希对数据进行分片(partition)和备份(replicate)。
- 使用版本号机制(Vector Clock)处理数据一致性问题。
- 使用多数票(Quorum)和去中心化同步协议来维持副本间的一致性(Merkle Tree)。
- 基于 Gossip Protocol 进行失败检测和副本维持。
实现上来说,Dynamo 有以下特点:
- 完全去中心化,没有中心节点,所有节点关系对等。
- 采用最终一致性,使用版本号解决冲突,甚至要求用户参与解决冲突。
- 使用哈希值进行数据分片,组织数据分布,均衡数据负载。