KVStore-MetaServer中的观察者模式

  • 场景
    • MetaServer是一个单独的服务,其管理了graphspce/partition的元信息(当然还有Host、Schema元信息)
    • KVStore存储其负责的partition数据, 一个host上只有一个KVStore。KVStore中负责的graphspace和partition元信息存储在MetaServer中。KVStore实例化后会根据host从MetServer中获取其管理的Partition元信息。然后根据元数据信息为每个graph创建对应的KVEngine和RaftPart实例(KVStore为Storage的底层存储接口)。
      • 用户对顶点和边的增删查改操作,到KVStore层都转换成对具体某个RaftPart或KVEngine的操作(KVStore的对外方法中都有spaceId和partitionID两个参数),在每个操作中都需要先根据spaceid和partitionID两个参数找到对应KVEngine或RaftPart,然后在调用KVEngine或RaftPart实例执行具体的操作。所以当MetaServer中关于某个host的Partition元信息变了,那么该host上的KVStore就应该对Partition元信息影响到的KVEngine和RaftPart实例做修改。
      • 比如,有5个graphspace,每个space有10个partition,每个partition 3副本,共6台机器(host), 那么host=125.45.124.201机器在MetaServer中负责的partition元信息可能为如下,但是经过一段时间后这个元信息可能会变化(用户通过MetaServer进行了修改),那么此时KVStore需要知道这个修改。
{
   host1: 125.45.124.201
   spaces : [
     { spaceid: 1,  part: [ {id :2,  peers: [host3, host6] },  {id :3,  peers: [host5, host2] } ] },
     { spaceid: 2,  part: [ {id :1,  peers: [host1, host6] },  {id :5,  peers: [host5, host2] } ] },
     { spaceid: 5,  part: [ {id :7,  peers: [host3, host6] } ] }
   ]
}
  • MetaServer和MetaClient是基于Thrift协议的服务端和客户端,KVStore是运行在Storage服务中的存储library,KVStore中通过MetaClient来和MetaServer服务做交互。

  • 类设计


    image.png
image.png
  • MetaChangedListener接口(观察者接口):将MetaServer中graphspace/partition变化产生的动作抽象成接口,实现该接口就可以感知到相应的变化。

  • MetaClient类(被观察者):

    • 对用户提供了createSpace、dropSpace操作(目前移动/删除某个space的Partition操作还没有),这几个操作会有graph层调用,其会影响graphspace/partition的变化。

    • MetaClient通过registerListener来注册观察者。

    • client从MetaServer获取到host上的Partition元信息后会缓存在本地,这样当KVStore中需要获取Partition元数据信息时可以从缓存中获取,缓存也会定期更新。

    • graphspace/partition的变化的感知,MetaClient采用pull的方式来实现,即其会开启一个线程定期的执行loadDataThreadFunc方法,该方法会获取MetaServer中Metaclient所在host管理的最新garphspace/partition元信息,然后和client端之前缓存的旧的元信息做比较就可以得到此时该host上graphspace/partiton的变化情况,得到变化情况后MetaClient就调用listener(注册的观察者)相应方法实现partition元信息变化的通知,接着会将最新partition元信息的结果缓存在client端。

      • push方式应该是:MetaServer层执行createSpace、dropSpace等操作后就主动去通知KVStore。
  • PartManager接口: 将对Partition的管理操作封装成一个接口,KVStore实现类通过PartManager接口实现对Partition元信息的查询/判断操作。(为什么不将PartManager中的方法直接放到KVStore中,而是单独封装成一个接口,然后KVStore依赖该接口来获取Partition元数据信息?答:遵循设计模式中的单一职责原则), KVStore通过PartManager组件可以得到自己负责的Partition元信息,从而为每个graph创建对应的KVEngine和RaftPart实例 。

  • Handler接口:实现MetaChangedListener可以让我们知道host上Partition元信息的变化情况,知道变化就要处理:即根据Partition元信息修改KVStore的KVEngine和RaftPart实例,那么这个处理动作有谁来做呢?答:有能力对KVEngine和RaftPart实例做出修改的类,即KVStore的实现类NebulaStore。 至于对Partition元信息的变化的处理操作又单独封装成了一个Handler接口, 实现这个Handler就可以对Partition元信息的变化做出处理了。总结:listener可以知道metaclient中partition元信息的变化,变化的处理交给handler来处理。

  • MetaServerBasedPartManager ( 具体的观察者): 基于MetaClient的PartManager接口实现类,同时也实现了MetaChangedListener接口。

    • 对PartManager的实现:通过MetaClient提供的方法来实现,MetaClient提供的方法实现中是基于本地缓存数据。

    • 对MetaChangedListener的实现:metaClient会通过registerListener方法注册观察者,MetaServerBasedPartManager没有通过自己来处理Part/Space的变化情况,而是通过registerHandler来处理,该Handler收到Part/Space的变化情况后可以对其受影响Engine/Partition实例做出相应改变。该handler的实现类之一是NebulaStore.

  • KVStore接口:封装了面向Storage层对graph的kv操作,这些操作都需要指定spaceID和parttitionID。

  • KVOptions类:对KVStore实例化所需参数的一个封装,包含host(KVStore实例的host信息)、dataPaths(KVStore数据存储路径)、partManager(KVStore依赖的PartManger获取元信息)

  • NebulaStore实现类:KVStore、Handler接口实现类,其依赖PartManager组件提供Partition的元信息数据。

    • KVStore接口实现:通过PartManager获取host的Partition元信息,然后为graph创建对应的KVEngine和Partition实例,比如:dataPaths中有两个目录,则NebulaStore会为每个Graph创建两个KVEngine实例,并将其RaftPart实例按照平均原则分配给这两个KVEngine,KVStore的KV操作实际就是先根据spaceid,partId找到对应KVEngine或RaftPart实例,然后在调用KVEngine或RaftPart的操作(增删改操作会调用RaftPart实例,因为需要先通过Raft实现副本间的一致性,然后在调用KVEngine操作,如果是查询操作则直接调用KVEngine操作)
      • KVEngine是一个接口,封装了KV操作,其中一个实现类是基于RocksDb的RocksEngine。

---待细化中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容