听小董谝存储 三( 二 )


老鸟:这个是整个存储系统的核心,这个问题你先记着,咱们后面讲到模块的时候再说 。
2.2 上架
上架就比简单多了,在注册一下,同时把路由推送给就OK了 。
2.3 上架与mover
上架着两个组件比还简单,光在注册一下就OK 。
第三章 业务管理
老鸟:所谓的业务管理,说白了就是每次新来一个客户给他分配data shard并记录的过程 。
小菜:没听懂 。
老鸟:依然用上面的仓库举例 。村东头的王大妈找到仓库的厂长,说需要10个货篮放鸡蛋 。村西头的李大爷要13个货篮放自己产的苹果 。然后厂长就遍历一下自己管理的所有货架,看看那些货架比较空闲,挑出来还没有被用的货篮分配给二老就OK 。所谓的业务管理说白了就是分配并关联data shard与业务的过程 。
第四章 路由管理
小菜:路由管理都是具体管理什么呢?
老鸟:其实我也很不喜欢这个路由这个词,有时候是名词,有时候是动词,有时候还能是形容词 。但是在这里,它的语义就是保证各个的路由状态一致,同时也记录了里面每个data shard的状态 。
小菜:听得很模糊 。
老鸟:没事 。咱们慢慢说 。先说说data shard的状态 。这个很容易理解吧,新上架的里面的data shard 还没有分配给用户使用,后面分配给用户使用,后面还有可能服务器断电导致数据不可访问,这么多现实情况,data shard肯定也是有不同的状态与之对应的 。Data shard这些不同的状态我们一般叫它生命周期 。
4.1 data shard的数据结构
小菜:说了这么多一个路由到底是个什么数据结构呢?
老鸟:你觉得呢?
小菜:一个路由指明了某一段槽位里面的数据应该存储到哪些机器的哪个卷的哪个data shard 。【, , , , , , , , , 】如何?
老鸟:很OK,很直观 。如果某个业务有1w个,那这个业务的路由就是一个list,list里面每个元素都是上面那个结构,list的长度是1w 。对吧?
小菜:是这个意思 。
老鸟:假定槽位总数是100w,如果某个key经过hash后对100w取余,结果是 。请问时间复杂度是多少?

听小董谝存储 三

文章插图
小菜:O(N),感觉方案不行呀 。
老鸟:顺序存储只能是数组形式么?为什么不试试跳表呢?
小菜:好棒,那这样就可以把时间复杂度降低到O(logN)
老鸟:如果 发生了分裂,路由该怎么变化?
小菜:好像有点麻烦哦 。。。。
老鸟:所以简单点,如果有1w个data shard,那么就申请一个长度为100w的数组,【0,99】存储的值都指向1号data shard,【100,199】存储的值都指向2号data shard……这样一来查找的时间复杂度就变成了O(1) 。同时data shard的分裂合并都简单了直接改对应槽位的data shard编号即可 。这就是用空间换时间,换效率的思路 。
4.2 data shard的生命周期
Data shard完整的生命周期是比较复杂的,精简后大概就是如下几个状态间的跳转 。
图四 data shard的生命周期转换
老鸟:首先我说明一下,同一个有一主两副共3个副本 。因此一个data shard也有3个副本,那么自然每个副本也都有自己的状态了 。Born是个中间状态,新上架的data shard初始化完成前是born,完成后就是free了 。
Free:表明这个卷上的data shard已经是可用状态了 。可以把它分配给某个业务使用了 。
:表明业务正在使用 。是正常状态 。
Dead:如果正在使用的忽然断电,或者断网等情况而导致数据不可访问,那么就把把的状态改成dead 。Dead的数据是不能被访问的 。这个不能一方面是指网络或者电源断了,没法访问 。第二也是不应该访问,即使网络又恢复了,在断网的这一段时间里数据并没有更新到这个副本上,可能存在脏数据,因此也不应该被访问 。