Cassandra (https://en.wikipedia.org/wiki/Apache_Cassandra)
1. Data Model
SQL Concept | Cassandra Concept |
DB | Keyspace |
Table | Column Family |
Row (in table) | Row (in Column Family) |
Column | Column |
N/A | Super Column |
在column family中的每一行,类似于SQL table中的一行。但是每一行的column不需要严格定义data schema,而且column可以嵌套column。像是Map<key, Map<key, value>> 这种。
可以了解一下BigTable(https://en.wikipedia.org/wiki/Bigtable)与之类似的定义。
2. DHT存储方式
源于Amazon DynamoDB(https://en.wikipedia.org/wiki/Amazon_DynamoDB),基于分布式哈希表。
- 使用key决定如何在节点中存储。有几种可选策略
- hash (consistent hash): 计算k的哈希值,每一个节点负责一个哈希值范围。好处是保证负载均衡,缺点是不能进行range search (2.1版本后,可以使用value indexing进行range search)
- byteordered: 不进行哈希,直接按序存储。优点是支持range search,但是缺点很明显:1. 无法保证traffic均匀分布在每个节点上;2. 大量读写相似数据的情况下容易使某一个节点变成hot spot.
- replication factor: 决定数据分成几个copy
- simpleStrategy: 不考虑data center影响,按序选择节点复制
- NetworkStrategy: 定义每个data center复制几份
- 保证一致性
- Cassandra保证的是Eventually Consistency, 即:多个数据拷贝节点可能在写的时候存在一段时间不一致,但是会最终一致
- 与之对应的强一致性指所有数据节点在写后保证永远返回最新的值
- Cassandra几种一致性策略
- ALL: 每次写,要等待所有的拷贝节点都ACK写成功。这样设置可以保证强一致性
- QUORUM:每次写等待至少一半的拷贝节点都ACK写成功。注意,如果读的时候也是用这个策略(也就是读取至少一半的拷贝节点,选择timestamp最新的),则能保证强一致性,因为读写至少会共用一个节点
- ONE/TWO/THREE:至少1/2/3个拷贝节点ACK写成功,弱一致性
- Cassandra保证的是Eventually Consistency, 即:多个数据拷贝节点可能在写的时候存在一段时间不一致,但是会最终一致
3. 读/写
类似bigtable
- 不直接写入硬盘,写时先写入内存中的memTable.达到一定条件后,转移到硬盘中的SSTable (类似于Write back cache, 保障了写的QPS).
- 以Column Family为单位写入
- 读取时,一个Column Family可能存储在多个SSTable上,使用Bloom Filter决定是在哪一个上进行检索
- 节点级别,维护着一个commit log,可以用来恢复MemTable数据
- periodically进行compaction,把一个Column Family对应的多个SSTable进行合并。