分布式原理:Cassandra

这是一个分布式存储的框架,或者说,直接就是一个分布式的数据库解决方案。

它可以让任意一个用户访问到data center并作增删改查

假设让你设计一个分布式的数据库,你会怎么设计?

首先,这个数据中心的架构得是按照一致性哈希来搞的哈希环,这样才能保证新增节点的可用性。

https://zhuanlan.zhihu.com/p/457125100

那么怎么设计partitioner呢,在chord协议里,我们用了finger table来引导你找到资源的位置,但是那样太复杂了,我们直接把所有信息都写在node server里就行,这是一种工程里常用的方法,虽然不是最优的,但是效率最高。

然后我们又要考虑了,作为一个稳定的分布式数据库,你肯定不能一份资源就放在一个地方吧!如果在的那个node挂了,你的资源就无了。所以我们要做很多的副本(replicas)

如何放置这些副本呢?有几种可行的方法:

  1. 随机放,算hash 然后mod
  2. 按照信息来放,比如放用户信息,按照用户名的首字母a-z分别放

为了可拓展性,我们直接定义一个服务器就只用来放replicas,就叫它Snitches(告密者),因为它看到了信息,还自己复制了一份放在别的地方,就很像告密的人。

  • A snitch maps IPs to data centers and racks

然后如何读写呢?

写:

**先来看看客户端:**我希望我访问哈希环上任何一个节点,都能拿到我想要的资源,就很像,你去任何一个移动联通营业厅,都能办成业务。那么我就定义我去的这个节点叫营业厅(Coordinator),它负责跟其他的节点进行交互,我只需要它交互完告诉我最后我要的东西就行。

那么营业厅干了什么呢?

先通过partitioner给有你想要资源副本的node发消息(query),然后得到信息返回给用户(client)。

我们再来看看服务器,snitches会告诉许多node许多replicas,所以当node收到之后,首先会在commit log里面写上有关这条信息的log,然后再memtable(内存里的table)里加上资源。

然后你就要问了,memtable断电不就无了吗,欸,这就是为什么要写commit log!

那你又问了,那一直在内存里写东西是不是不合适!是不合适,所以,当memtable满了或者时间太长了之后,会把它flush进SSTable,SSTable就是一个kv型的表了。

因为SSTable再快也是硬盘,如果东西多了找key也是很慢的,所以需要一个方法快速找到这个SSTable里有没有这个key:

就用了一个比较常见的方法**(Bloom filters):**

就是经常用的 布隆过滤器!

首先在insert的时候,定义K个哈希函数,分别给key进行处理,比如最后K个哈希函数的结果分别是2,5,1,34,435,66445。然后找一个bit表,把这些位置上的bit从0变成1.

在查找的时候,同样用k个哈希函数对key处理,然后看看相应bit表上的值是否是1,如果有0就说明不在表里。

这里有一个疑问:感觉好像是没有问题的,但是会不会出错

有两种错误情况:

1.表里有的,但是检测出来没有: false negative

不可能出现,因为这个bit table的性质,insert过的一定能查出来

2.表里没有的,检测出来有:false positive

这个是有可能出现的,比如两个数的两个不同哈希函数的值碰巧一样。但是这个可以忍受,毕竟不是十全十美的。

改:

客户端其实是一样的,就客户跟营业厅说一下要改

然后到了服务器这边,服务器不会立刻修改,而是给新数值插入,并标一个timestamp,删除也是一样,它会给那个资源标一个tombstone。

之后会执行一个叫做Compaction的操作,它会遍历所有node里SSTable里的文件,把timestamp最晚的留下来,然后把有tombstone的文件删掉

读:

最后来说一下读,读也是很简单,营业厅帮你读所有node的replicas,然后找到timestamp最晚的那个。

成员表:

主要也是用gossip的方法来传递成员信息,也引入了怀疑机制。

https://zhuanlan.zhihu.com/p/457105107


分布式原理:Cassandra
https://yiyuwang.be/2022/01/15/2022-01-15-457609714/
作者
StevenWong
发布于
2022年1月15日
许可协议