▌现在
1. 特征总览
首先快速看下 Cassandra 的整体特点,对其有个整体的了解:
由于使用对等节点,因此易于扩展
由于采用 LSM 单机引擎,支持高效写入
高可用性和容错能力
可调一致性
支持 CQL 查询
弹性数据存储
易于做数据分布
2. 一致性 hash & gossip 去中心化
如果现阶段我们再去设计表格系统,猜想应该还是会设计成这样,一次性 hash 是非常经典的分布式方式。它的核心思路是通过客户端和 server 端一致认可的一种协议,找数据的分布,规避 master 节点。传统的很多设计都存在 master 节点,里面存储了数据分片,客户端先去 master 里面找到第一层路由,然后再和路由的后端节点做交互。但是通过一次性 hash,可以屏蔽掉路由表环节。客户端和后端有一种默认的公约,只要照着公约就可以直接找到后端节点。
大体思路是:gossip 上带有程序,可以取个 hash 整数,后端进行 server 其实也会有唯一节点,把唯一节点做成 id 排序,每个 server 会管理一个 range。所以对于一个主键在 Cassandra 里是会切出前半部分,算出 hash 值之后,在这个环里可以做映射。
由于 Cassandra 的元信息比较少,只有一些分布信息,以及每个 server 管理了哪些 range 等,信息非常少,没有必要额外再切出一个 master 管理信息,因此它使用 gossip 协议。Gossip 协议是一种 pear 2 pear 的消息通信传递架构,具有最终一致性。可能有很短暂的一瞬间,里面的一些元信息 ( 如 token 分布 ) 是不太一样的。
3. LSM 单机引擎
LSM 单机引擎现在已经不是一个很新的概念了,这里简单介绍一下:客户端按照一个 cql 写进来,在 Cassandra 里面这个叫做 replication,就是一次写。Cassandra 只能保证一次读和一次写是原子的,但是读跟写组合起来并不能保证是原子的。还有 cache 的操作,属于高级功能了,一次写写到后端的节点 ( node ) 里面,会先追加写 WAL ( Write-Ahead-Log ),然后会到 memtable 里面,当然里面有很多的优化,比如使用 memtable 这种方式,避免用户内存和 cornal space 内存的拷贝。
当 memtable 比较大时,列比较多的时候,会存成 SSTable,有三种 campaction 策略:基于使用窗口的,还有像 levelDB 一样基于 level 的,level0~level7,越往下数据越旧,SSTable 越大。
4. 使用现状
Cassandra 在各大公司都有广泛使用,这里列举了国内外一些大型公司的使用情况。Apple 有大范围使用 Cassandra,对外披露有 10W + nodes。国内 360 有使用,饿了么在推荐系统中也有使用。还有国外的一些巨头,像 Reddit 论坛平台和 discord 点餐平台也有在使用,比如 memcache 切到 Cassandra 主要是受限于内存。
本文转载自 DataFunTalk 公众平台。
评论