大设计系列:版本号

来源:互联网 发布:简述socket通信编程 编辑:程序博客网 时间:2024/04/30 14:42

Master

分布式环境下,提供服务(存储或者RPC等)的集群通常需要有一个(可以是多台)master角色的机器,来帮助client与集群内真正提供服务的机器交互。(可以思考一下如果没有master这个角色,client可以怎么来与集群交互^_^)

Metadata

上述条件下,master需要知道所有集群内机器的信息(包括机器情况服务情况等),暂且将这些信息称为metadata,通常是机器通过hearbeat的方式将metadata给到master。

master通过metadata信息来帮助client与集群内机器交互,下面我们来讨论两种设计方案:

  1. client不缓存metadata,如HDFS的设计。
  2. client缓存metadata,如Tair的设计。

HDFS

HDFS采用的方式是,client每次都先问下master(也就是Namenode)我需要去找哪个Datanode。这种情况下master的单点问题就显得比较严重。


Tair

Tair采用的方式是,client在一启动的时候就从master那里将这些metadata信息拉到本地,后续就不需要再去问master了,这样可以避免master的单点问题。但是这样又引来了一个新的问题,metadata信息过期,也就是集群有变化(机器挂掉或者扩容之类的),这时候怎么样去更新client缓存的metadata信息(缓存的通病^_^)。

Tair的设计采用了一个很巧妙的方式,给机器的metadata加上了版本号,每次metadata有变化,master就更新版本号,并将最近的版本号同步到集群内的机器上,机器会在每次给client的服务响应里面会将版本号同时返回,client收到版本号后,会与自己现在保存的metadata信息的版本号做对比,如果发现自己的版本号是比较低的,那就主动再去找master把metadata信息拉回到本地更新,问题完美解决。



参考资料

  • https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
  • http://www.oschina.net/p/tair
0 0
原创粉丝点击