官方文档: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
Cassandra - 图1
令牌不平衡:

  • 虚拟节点:vnode (官方叫令牌 token)
  • 一个物理节点 n 会对应多个虚拟节点 t
  • 2.x 中,虚拟节点的排列是随机的

缺点:

  • 如果 replicas 的虚拟节点,全部都是映射到同一个物理节点,那么 down 掉后数据就丢失了
  • 集群范围的维护操作通常会变慢
  • 跨令牌范围的操作性能可能会收到影响

3.x + 后,分配器可以智能的选择令牌,从而使环达到最佳平衡,同时每个物理节点所需要的令牌数量要少得多。

  • 分配器会将 replicas 自动复制到独立的物理节点

Cassandra - 图2

节点类型:

  • coordinator:协调者节点,没有目标数据
    • 计算和转发客户端的请求,到目标的副本节点上
  • replica:副本节点,保存了目标数据,会有多个副本节点

    复制策略:

    TODO

一致性级别:

写和读可以分别指定

  • 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