官方文档:https://cassandra.apache.org/doc/latest/ Amazon Dynamo 数据库:https://zhuanlan.zhihu.com/p/98640498 使用 Gossip 协议 AP 模型
高性能
Cassandra 写数据时,会先写入 Commit Log,然后再写入内存中的 Memtable,超过容量或者定时同步内存数据到磁盘的 SSTable,并定期异步对 SSTable 做数据合并,以减少数据读取时的查询时间。
- 写操作只涉及到顺序写入和内存操作,所以非常快。
- 读操作像 Level DB 一样,数据分层存储,将热点数据放到 Memtable 和相对较小的 SSTable 中,所以也很快
部署结构:
数据分片+复制
去中心化,P2P,所有节点组成一个环
使用令牌环的一致性哈希算法
- 将每个节点映射到连续哈希环上的一个或多个令牌
- 然后沿一个方向“遍历”环来定义所有权,类似于 Chord 算法
- 复制因子 RF(Replication factor) 为 Replicas 的数量**
例子:RF = 3
令牌不平衡:
- 虚拟节点:vnode (官方叫令牌 token)
- 一个物理节点 n 会对应多个虚拟节点 t
- 2.x 中,虚拟节点的排列是随机的
缺点:
- 如果 replicas 的虚拟节点,全部都是映射到同一个物理节点,那么 down 掉后数据就丢失了
- 集群范围的维护操作通常会变慢
- 跨令牌范围的操作性能可能会收到影响
3.x + 后,分配器可以智能的选择令牌,从而使环达到最佳平衡,同时每个物理节点所需要的令牌数量要少得多。
- 分配器会将 replicas 自动复制到独立的物理节点上
节点类型:
一致性级别:
写和读可以分别指定
- ONE:一个 replica 节点响应成功
- TWO、THREE
- LOCAL_ONE:本地数据中心,一个 replica 节点响应。可以保证读取请求不会发到其他数据中心
- QUORUM:半数 replica 节点响应
- LOCAL_QUORUM:本地数据中心的半数 replica 节点响应
- EACH_QUORUM:每个数据中心的半数 replica 节点响应
- ALL:所有 replica 节点响应
- ANY:
- 一个 replica 节点响应,或者 coordinator 节点保存一个记录,如果保存成功,则响应
- coordinator 稍后会尝试运行这个记录,并将变化发送给 replicas
- 这个级别只适用于写操作
Snitch:
https://cassandra.apache.org/doc/latest/operating/snitch.html#snitch