Tair学习小记

Tair架构

Tair架构

本文只关注Client,ConfigerServer,DataServer三者之间的交互,不关注DataServer的存储引擎

Client,ConfigServer,DataServer三者之间的交互

  1. 情况1:Client在访问dataserver时,先对自身进行检测,查看是否有缓存的路由表,如果没有,则访问configserver获取路由表并缓存,之后,再去访问dataserver获取数据
  2. 情况2:client访问dataserver获取数据时,会携带路由表,dataserver对路由表的版本进行检测,若版本过旧,则通知client去configserver获取最新的路由表后再来访问
  3. 情况3:client访问dataserver时,若出现超时,则判定访问的dataserver已经宕机,然后主动的去访问configserver获取最新的路由表

什么情况下dataserver会进行数据迁移?迁移策略?

当dataserver数量增加时或者数量减少时比如宕机,会进行数据迁移

tair 的分布采用的是一致性哈希算法, 对于所有的key, 分到Q个桶中, 桶是负载均衡和数据迁移的基本单位. config server 根据一定的策略把每个桶指派到不同的data server上. 因为数据按照key做hash算法, 所以可以认为每个桶中的数据基本是平衡的. 保证了桶分布的均衡性, 就保证了数据分布的均衡性.

假设有3台机子,有3个桶,初始化的时候路由表信息如下,Tair不允许一台机子上存在相同的桶(为什么?你懂的):

192.168.1.1 桶A 桶B

192.168.1.2 桶B 桶C

192.168.1.3 桶C 桶A

  1. 情况1:当192.168.1.1发生宕机时,configserver会计算哪些桶的备份少了,在这里桶A和桶B只存在一个备份,故需要将桶A的数据从192.168.1.3迁移到192.168.1.2上,桶B的数据从192.168.1.2上迁移到192.168.1.3。
  2. 情况2:当新增加机器192.168.1.4后,configserver会重新根据负载均衡算法,进行数据迁移
    当上述迁移完成后,configserver会重新更新路由表的信息,然后通过心跳发给所有的dataserver,所以说dataserver上的路由表信息永远都是最新的,且一致。

当dataserver正在进行数据迁移时,客户端访问该怎么办

  • 正常情况下引发的迁移比如机器新增, 我们举个例子, 假设192.168.1.1 要把 桶 A,B,C 迁移给192.168.1.4
    因为迁移完成前, 客户端的路由表没有变化, 客户端对桶 A, B, C 的访问请求都会路由到192.168.1.1 现在假设
    桶A还没迁移, 桶B又正在迁移中, 桶C已经迁移完成.

    情况1:对桶A的访问, 则没什么特别, 跟以前一样.访问192.168.1.1

    情况2:对桶C的访问, 则192.168.1.1会把该请求转发给192.168.1.14,并且将192.168.1.4的返回结果返回给客户

    情况3:对桶B的访问, 则在192.168.1.1上处理, 这里有一种特殊的情况:假设客户端对桶B是put操作, 则192.168.1.1会记录修改 log.当桶B迁移完成的时候, 还要把log发送到192.168.1.4, 然后根据这些log完成数据同步. 最终两台机器对于桶B来说, 数据完全一致才是真正的迁移完成.

  • 宕机时引发的迁移,客户端会收到一张中间临时状态的分配表. 这张表中, 把宕机的data server所负责的桶临时指派给有其备份dataserver来处理. 这个时候, 服务是可用的, 但是负载可能不均衡. 当迁移完成之后, 才能重新达到一个新的负载均衡的状态.

桶在dataserver上的分布策略

  • 负载均衡优先
    具体参考文档 http://code.taobao.org/p/tair/wiki/intro/
  • 位置安全优先
    举个例子,比如192.168.1.1上存在桶A,桶B,桶C 192.168.1.2也存在桶A,桶B,桶C 位置安全优先就是说机器192.168.1.1和机器192.168.1.2不要同时放在同一个机房上,不然机房着火了,你的机器全都挂掉了,还有什么意义呢?

总结

ConfigServer的功能

  • 通过维护和dataserver心跳来获知集群中存活节点的信息
  • 根据存活节点的信息来构建数据在集群中的分布表。
  • 提供数据分布表的查询服务。
  • 调度dataserver之间的数据迁移、复制。

    DataServer的功能

  • 提供存储引擎
  • 接受client的put/get/remove等操作
  • 执行数据迁移,复制等
  • 插件:在接受请求的时候处理一些自定义功能
  • 访问统计

    Client的功能

  • 在应用端提供访问Tair集群的接口。
  • 更新并缓存数据分布表和invalidserver地址等。
  • LocalCache,避免过热数据访问影响tair集群服务。
  • 流控

你可能感兴趣的:(Tair)