二、LSM-tree model for KVS
设计系统需要考虑的内容
- 需求: key-value
- 功能接口:
- 架构:有的侧重读,有的侧重写
- 模块
- 模块内数据结构、算法
- 模块间接口
- 测试
功能需求
-
KVS的存储
- 扩展存储(多节点):一致性哈希 —— 增加机器的时候,迁移的数据少。
-
点操作:
- 操作一个数据的读和写
-
范围操作:
- 操作多个数据的读 [start_key,end_key]
-
容错(A,D)
- Durability:保证commit之后落盘,防止在内存中宕机等事故,丢失数据 —— 日志可以保证
- Atomic: 这里只讨论一个数据的读和写,就很好保证原子性
-
一致性
-
可线性化:时间点在后面的’读’一定能读到 它 前面时间点的’写’。
-
KVS的点操作:
- 不同数据:不会出现一致性问题
- 相同数据:
- 当 写——>读 无交集,一定要保证读能读到写的内容
- 当 读——>写 or 写——>读 有交集时 可以找到一个可归约的点来保证一致性。
-
范围读操作和写操作之间:
- 能找一个满足条件的可归约的点即可
-
实现可线性化
- 简单方式无法满足一致性
- 降低一致性要求—— 但是会增大对应用层的要求
- 并发控制协议
- 加锁方式 —— 但性能不好
- 多版本控制 —— leveldb是用这个方法
- 简单方式无法满足一致性
-
KVS可能的存储结构
-
Bitcast
- 日志型的基于hash表结构的键值对的存储系统
- 数据文件采用追加写的方式
- 通过内存中的key的哈希表索引磁盘中数据位置
- bitcast on disk
- 老的文件只读不写
- active data file是可写的
- 日志型的基于hash表结构的键值对的存储系统
-
LMDB
-
LSM-tree