数据库或者分布式文件系统如何维护数据的一致性
分布式存储解决的是单机存储的性能, 单点故障问题, 容量一开始到还在其次, 但随着应用规模的发展, 要解决容量也得必须分布式了.
- 分布式存储解决容量问题即可扩展性的方式, 就是数据分片.
可扩展性是分布式的已经解决的问题, 任何关于分布式存储的现存问题的讨论, 都不会再涉及可扩展性. - 数据分片也能部分的解决性能问题. 而解决性能问题的方法还包括数据复制.
- 分布式存储解决单点故障问题的手段, 也许是唯一的手段, 就是复制.
- 而复制会带来一致性问题.
鉴于解决容量问题的手段并没有引入新问题, 因而如果要实现一种分布式存储机制, 需解决或者需平衡的是性能(或者说可用性), 单点故障(或者说分区容忍性), 及一致性
基础结构
分层,一般是两到三层
- 最底层分布式文件系统, 解决数据分块,复制, 读写等需求
- 往上是数据结构层, 解决数据模型, 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以后,根据配置策略以及缓存控制策略的不同,最终所有的客户都会看到最新的值。