您的位置:首页 > 大数据 > 人工智能

2015.6.17(Tair)

2015-08-27 09:49 274 查看
Tair是一个高性能,分布式,可扩展,高可靠的nosql存储系统。

Tair 作为一个分布式存储系统,由中心控制节点和一系列的服务节点组成。我们称中心控制节点为ConfigServer,服务节点是DataServer,ConfigServer 负责管理所有的DataServer,维护DataServer的状态信息,目前采用一主一备的形式来保证其可靠性,如果其中一台ConfigServer节点挂点,其他ConfigServer节点会在秒级内迅速启动工作,不会影响整个集群的作业,所以tair的ConfigServer是轻量级的。DataServer对外提供各种数据服务,并以心跳的形式将自身状况汇报给ConfigServer,所有的 DataServer地位都是等价的。

1. 负载均衡

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

2. 增加或者减少DataServer的时候会发生什么

当有某台DataServer故障不可用的时候,ConfigServer会发现这个情况,ConfigServer负责重新计算一张新的桶在DataServer上的分布表,将原来由故障机器服务的桶的访问重新指派到其它的DataServer中,这个时候,可能会发生数据的迁移。比如原来由DataServer A负责的桶,在新表中需要由B负责。而B上并没有该桶的数据,那么就将数据迁移到B上来。同时ConfigServer会发现哪些桶的备份数目减少了,然后根据负载情况在负载较低的DataServer上增加这些桶的备份。当系统增加DataServer的时候,ConfigServer根据负载,协调DataServer将他们控制的部分桶迁移到新的DataServer上,迁移完成后调整路由。当然,系统中可能出现减少了某些DataServer同时增加另外的一些DataServer.。处理原理同上,每次路由的变更, ConfigServer都会将新的配置信息推给DataServer,在客户端访问DataServer的时候,会发送客户端缓存的路由表的版本号,如果DataServer发现客户端的版本号过旧,则会通知客户端去ConfigServer取一次新的路由表, 如果客户端访问某台DataServer 发生了不可达的情况(该 DataServer可能宕机了),客户端会主动去ConfigServer取新的路由表。

3. 发生迁移的时候DataServer如何对外提供服务

当迁移发生的时候,我们举个例子,假设DataServer A 要把桶 3,4,5 迁移给DataServer B。因为迁移完成前,客户端的路由表没有变化,客户端对 3, 4, 5 的访问请求都会路由到A。现在假设 3还没迁移,4 正在迁移中,5已经迁移完成,那么如果是对3的访问,则没什么特别,跟以前一样;如果是对5的访问,则A会把该请求转发给B,并且将B的返回结果返回给客户,如果是对4的访问,在A处理,同时如果是对4的修改操作,会记录修改log。当桶4迁移完成的时候,还要把log发送到B,在B上应用这些log,最终A B上对于桶4来说,数据完全一致才是真正的迁移完成。当然,如果是因为某DataServer宕机而引发的迁移,客户端会收到一张中间临时状态的分配表,这张表中,把宕机的DataServer所负责的桶临时指派给有其备份DataServer来处理,这个时候,服务是可用的,但是负载可能不均衡,当迁移完成之后,才能重新达到一个新的负载均衡的状态。

4. 桶在DataServer上分布时候的策略

程序提供了两种生成分配表的策略,一种叫做负载均衡优先,一种叫做位置安全优先:先看负载优先策略,当采用负载优先策略的时候,ConfigServer会尽量的把桶均匀的分布到各个DataServer上,所谓尽量是指在不违背以下两个原则的条件下尽量负载均衡:

1) 每个桶必须有COPY_COUNT份数据 ;

2) 一个桶的各份数据不能在同一台主机上。

位置安全优先原则是说,在不违背上面两个原则的条件下,还要满足位置安全条件,然后再考虑负载均衡。位置信息的获取是通过 _pos_mask计算得到。一般我们通过控制_pos_mask 来使得不同的机房具有不同的位置信息。那么在位置安全优先的时候,必须被满足的条件要增加一条,一个桶的各份数据不能都位于相同的一个位置(不在同一个机房)。这里有一个问题,假如只有两个机房,机房1中有100台DataServer,机房2中只有1台DataServer,这个时候,机房2中DataServer的压力必然会非常大,于是这里产生了一个控制参数 _build_diff_ratio(机房差异比率),当机房差异比率大于这个配置值时,ConfigServer不再build新表。

机房差异比率是如何计出来的呢? 首先找到机器最多的机房,设为RA,DataServer数量是SA, 那么其余的DataServer的数量记做SB,则机房差异比率=|SA – SB|/SA。因为一般我们线上系统配置的COPY_COUNT是3,在这个情况下,假设只有两个机房RA和RB,那么两个机房什么样的DataServer数量是均衡的范围呢? 当差异比率小于0.5的时候是可以做到各台DataServer负载都完全均衡的。这里有一点要注意,假设RA机房有机器6台,RB有机器3台,那么差异比率 = 6 – 3 / 6 = 0.5. 这个时候如果进行扩容,在机房A增加一台DataServer,扩容后的差异比率 = 7 – 3 / 7 = 0.57。也就是说,只在机器数多的机房增加DataServer会扩大差异比率,如果我们的_build_diff_ratio配置值是0.5,那么进行这种扩容后,ConfigServer会拒绝再继续build新表。

5. tair 的一致性和可靠性问题

分布式系统中的可靠性和一致性是无法同时保证的, 因为我们必须允许网络错误的发生,tair 采用复制技术来提高可靠性,并且为了提高效率做了一些优化,事实上在没有错误发生的时候,tair 提供的是一种强一致性,但是在有DataServer发生故障的时候,客户有可能在一定时间窗口内读不到最新的数据,甚至发生最新数据丢失的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息