大规模分布式存储系统: 问题, 概念, 及领域语言

JerryXia 发表于 , 阅读 (0)

问题域

分布式存储解决的是单机存储的性能, 单点故障问题, 容量一开始到还在其次, 但随着应用规模的发展, 要解决容量也得必须分布式了.

  • 分布式存储解决容量问题即可扩展性的方式, 就是数据分片. 可扩展性是分布式的已经解决的问题, 任何关于分布式存储的现存问题的讨论, 都不会再涉及可扩展性.
  • 数据分片也能部分的解决性能问题. 而解决性能问题的方法还包括数据复制.
  • 分布式存储解决单点故障问题的手段, 也许是唯一的手段, 就是复制.
  • 而复制会带来一致性问题.

鉴于解决容量问题的手段并没有引入新问题, 因而如果要实现一种分布式存储机制, 需解决或者需平衡的是性能(或者说可用性), 单点故障(或者说分区容忍性), 及一致性

基础结构

分层,一般是两到三层

  • 最底层分布式文件系统, 解决数据分块,复制, 读写等需求
  • 往上是数据结构层, 解决数据模型, CAP取舍等
  • 再往上是更高层API, 解决诸如事物等问题

实现关注点

数据分布策略

考虑因素包括读写场景, 即随机还是顺序, 包括如何保证负载均衡从而提高性能等

  • 哈希分布, 一致性哈希等
  • 顺序分布

一致性策略

  • 强一致性: 强一致性(即时一致性) 假如A先写入了一个值到存储系统,存储系统保证后续A,B,C的读取操作都将返回最新值
  • 弱一致性: 假如A先写入了一个值到存储系统,存储系统不能保证后续A,B,C的读取操作能读取到最新值。此种情况下有一个“不一致性窗口”的概念,它特指从A写入值,到后续操作A,B,C读取到最新值这一段时间。
  • 最终一致性: 最终一致性是弱一致性的一种特例。假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到最A写入的最新值。此种情况下,如果没有失败发生的话,“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数(这个可以理解为master/salve模式中,salve的个数),最终一致性方面最出名的系统可以说是DNS系统,当更新一个域名的IP以后,根据配置策略以及缓存控制策略的不同,最终所有的客户都会看到最新的值。

最终一致性变体

  • Causal consistency(因果一致性): 如果Process A通知Process B它已经更新了数据,那么Process B的后续读取操作则读取A写入的最新值,而与A没有因果关系的C则可以最终一致性。
  • Read-your-writes consistency : 如果Process A写入了最新的值,那么Process A的后续操作都会读取到最新值。但是其它用户可能要过一会才可以看到。
  • Session consistency : 此种一致性要求客户端和存储系统交互的整个会话阶段保证Read-your-writes consistency.Hibernate的session提供的一致性保证就属于此种一致性。
  • Monotonic read consistency : 此种一致性要求如果Process A已经读取了对象的某个值,那么后续操作将不会读取到更早的值。
  • Monotonic write consistency : 此种一致性保证系统会序列化执行一个Process中的所有写操作。