概述
数据大致有3类:非结构化数据,结构化数据,半结构化数据。
不同的分布式存储系统适合处理不同类型的数据。
分布式存储系统分为四类:分布式文件系统(存储关非结构化数据),分布式键值系统(存储关系较为简单的半结构化数据),分布式表格系统(存储关系较为复杂的半结构化数据),分布式数据库(存储结构化数据)。
分布式文件系统常作为分布式表格系统以及分布式数据库的底层存储。如Google File System,Elastic Bolck Store。
分布式键值系统是分布式表格系统的一种简化实现。如Amazon Dynamo,Taobao Tair,Memcache。
分布式表格系统与分布式数据库相比,主要支持单张表格操作。如Google Bigtable,Amazon DynamoDB。
分布式数据库从单机关系数据库扩展而来,采用二维表格组织数据。如Amanon RDS,Microsoft SQL Azure,OceanBase,Google Spanner。
单机存储系统
存储系统的性能主要包括两个维度:吞吐量以及访问延时,设计系统时要求能够在保证访问延时的基础上,通过最低的成本实现尽可能高的吞吐量。磁盘和SSD的访问延时差别很大,但带宽差别不大,热数据可以存储到SSD中,冷数据存储到磁盘中。
存储引擎:
哈希存储引擎支持增删改,随机读,对应键值存储系统。例如Bitcask在内存中存储主键和value的索引信息,磁盘文件中存储了主键和value的实际内容。
B树存储引擎支持增删改,随机读以及顺序读,对应关系数据库。例如MySQL InnoDB中每个页面对应B+树的一个节点,非叶子节点保存索引信息,叶子结点保存每行完整数据,根结点常驻内存,查询时从根结点二分查找直到叶子结点。
LSM树存储引擎支持增删改,随机读以及顺序读。将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改增量批量写入磁盘,读取时需要合并磁盘中历史数据和最近的修改增量。
数据模型:文件模型,关系模型,键值模型。
事务:事务是数据库操作的基本单位,它有四个基本属性,即ACID;出于性能的考虑,许多数据库允许使用者选择牺牲隔离属性来换取并发度,SQL定义了4种隔离级别,即Read Uncommitted(读取未提交的数据)、Read Committed(读取已提交的数据)、Repeatable Read(可重复读取)、Serializable(可序列化);隔离级别的降低可能导致其它问题,如Lost Update、Dirty Reads、Non-Repeatable Reads、Second Lost Updates problem、Phantom Reads。
并发控制:使用数据库锁、写时复制、多版本并发控制。
故障恢复:一般采用操作日志技术来实现故障恢复,操作日志(或称提交日志)分为回滚日志(UNDO Log)、重做日志(REDO Log)以及UNDO/REDO日志。REDO日志在修改内存中的元素之前,确保与这一修改相关的操作日志必须先刷入磁盘中。
分布式系统
系统远行过程中可能会遇到各种异常,如服务器宕机、网络异常、磁盘故障。
由于网络异常的存在,分布式存储系统中请求结果存在“三态”的概念,即成功、失败、超时。当出现超时状态时,只能通过不断读取之前操作的状态来验证RPC操作是否成功,也可把系统设计为幂等的。
一致性:
从客户端的角度,一致性分为有三种情况,即强一致性、弱一致性、最终一致性;其中最终一致性是弱一致性的一种特例,最终一致性的常见变体有读写一致性、会话一致性、单调读一致性、单调写一致性。
从存储系统角度,一致性主要包含副本一致性、更新顺序一致性。
衡量分布式系统常用的指标有:性能、可用性、一致性、可扩展性。性能通常考虑QPS和TPS;可用性可以用系统停服务的时间与正常服务的时间比来衡量;越是强的一致性模型,用户使用起来越简单;理想的分布式存储系统实现了“线性可扩展”。