Foundationdb源码阅读--数据分布模块实现机制
数据分布模块实现机制
数据分布模块管理着存储服务器的整个生命周期,决定着哪些数据放在哪个存储服务器上,确保数据均匀地分布到不同的存储服务器(SS)上。接下来从三个方面讨论数据分布的实现机制:下面提到的DD指的是Data Distribution,即数据分布
1、DD的数据结构
2、DD的状态迁移
3、DD的功能实现机制
和数据分布相关的代码在
fdbserver目录下,包含如下文件:
一、DD包含的数据结构如下面类图所示:

为了让不同的进程(commit proxies,tLogs和存储服务)看到一致的全局视图,DD把自己的状态保存到system keyspace中,以便从故障中恢复。
serverKeys sub-space(\xff/serverKeys/):记录每个shard的第一个key,格式为\xff/serverKeys/[serverID]/[start_key]。如果要获取某个服务器上所有shard的key,DD可以读取前缀为\xff/serverKeys/[serverID]的key范围,并解码对应的value值。
keyServers sub-space(\xff/keyServers/):记录每个key的源和目标服务器ID,格式为\xff\keyServers/[start_key]/[src_server][dst_server],其中start_key是shard的第一个key,src_server是shard当前所在的服务器,dst_server是shard将要被重分布到的新服务器。要获取shard所有的源服务器和目标服务器,DD可以读取前缀为\xff/keyServers/[start_key]的所有key,并解码对应的[src_server]和[dst_server]。如果要获取每个shard的边界,DD可以读取前缀为\xff/keyServers/的所有key,并收集所有的[start_key],两个连续的[start_key],比如start_key1和start_key2构成一个shard的边界,即[start_key1,start_key2)。
MoveKeysLockOwnerKey(\xff/moveKeysLock/Owner)和moveKeysLockWriteKey(\xff/moveKeysLock/Write):当DD需要重分布某个key时,必须同时先获得由owner key和write key组成的moveKeysLock。moveKeysLockOwnerKey指定了当前哪个DD持有锁。moveKeysLockWriteKey指定了当前哪个DD正在修改key和服务器之间的映射。如果DD在重分布数据时,发现不能同时持有这两把锁,它将会自杀,然后cluster controller将会创建一个新的DD。
当初始化新的DD时,它将随机的UUID设置为moveKeysLockOwnerKey,并将自身设置为拥有者。由于owner key只有一个值,因此,最多一个DD拥有与DD相关的system subspace,这就避免了在DD创建期间可能同时退出的多个DD之间存在潜在的竞争关系。
事务状态存储:它是special keyspace的一个副本,用来存储集群的状态,比如哪个存储服务器负责存储哪个shard。因为commit proxies使用txnStateStore来决定哪个tLog和存储服务器应该接收更改,所以commit proxies必须具有txnStateStore的全局一致性视图。因此,对txnStateStore的更改必须按全局一致性顺序提交到commit proxies。为了实现这个需求,使用特殊事务(applyMetaMutations)来更新txnStateStore,并使用resolvers来确保全局一致性顺序。
二、DD的状态迁移
对DD状态的修改是通过actor来实现的,每个actor只负责一项特定的任务,接下来介绍一些最重要的actor:
1、storageServerTracker:每当创建存储服务器时,都会同时创建一个tracker。用来监控服务器的状态,当服务器不可用或进程退出时,tracker会发出删除服务器上数据的请求。一旦所有数据都从服务器移出后,tracker会从DD中删除服务器信息。当服务器的存储接口由于进程重启或数据重分布而发生变化时,tracker会更新服务器信息并相应的更改所属的组,以确保始终满足复制策略。
具体实现在fdbserver/DataDistribution.actor.cpp中的storageServerTracker函数中
2、teamTracker:创建server team的时候会同时创建一个team tracker,用来监控team的状态。当team状态异常时,team tracker会找到team中的所有shard,创建RelocateShard请求,并将请求发送到dataDistributionQueue。
3、buildTeams:在DD初始化时会创建Team builder,发生以下事件时会被调用:
(1)创建新server并添加到DD时;
(2)从DD中删除已存在的server时;
(3)系统中没有team时。
无论何时调用team builder,目的都是构建指定数量的server teams。为了确保每个server team属于一个machine team,首先构建指定数量的machine team;然后选择一个machine team。
4、dataDistributionQueue actor:在DD初始化时创建,用来处理RelocateShard请求。比如,它等待RelocateShard请求到来。当teamTracker发送新的RelocateShard请求时,它将请求排队,取消与该请求重叠的RelocateShard请求。
三、DD的功能实现机制
1、DD是如何初始化的?
当创建DD角色时,它从system keyspace中恢复上一个DD的状态。
首先将自己设置为MoveKeysLock的持有者;
然后通过读取DD相关的system keyspace(比如serverKeys sub-space),收集server和shard信息,server和shard之间的映射以及复制配置信息;根据这些信息DD创建与之前DD状态匹配的相关组件(比如server、team和tracker)。tracker根据复制策略查看当前server和team的状态是否正常。如果复制策略发生改变,将删除状态异常的server和team,并创建新的server和team。
2、什么时候需要对key进行重分布?
(1)某个服务器使用率过高,这里的使用率指的是磁盘使用率
(2)为了让各个服务器的磁盘使用率尽量均衡,DD对shard进行合并和拆分
(3)当team的数量大于期望的数量时,删除冗余的team
(4)当某个服务器故障时,DD按照复制因子将shard从一台服务器拷贝到另一台服务器,以满足高可用的目的。
会创建actor来监控key重分布的原因:
(1)MountainChopper和ValleyFiller actor会定期在team内随机选择一台服务器,检查利用率,并与team内的其他服务器进行负载均衡;
(2)shardMerger和shardSplitter actor会评估一个shard是否应该合并和分裂,当需要创建新shard时,actor会创建shard的tracker并将RelocateShard请求添加到DD的队列;
(3)serverTeamRemover和machineTeamRemover actor定期检查server team和machine team的数量是否超过期望值,如果超过期望值,则删除冗余的server team和machine team;
(4)teamTracker actor监控team的状态,当team中的server状态异常时,发起RelocateShard请求,确保副本的数量满足复制因子。team中的server越少,RelocateShard请求的优先级越高。
3、如何对key进行重分布?
一个key范围组成一个shard,shard是数据重分布的最小单位。哪个存储服务器拥有哪些shard是保存在system keyspace的serverkeys(\xff/serverKeys/)和keyServers(\xff/keyServers/)中。为了简化解释,把存储服务器对shard的拥有权称为shard的拥有权。
Shard的拥有权在Transaction system和存储服务器之间必须保持一致,以便写入操作可以发给正确的存储服务器。从一台存储服务器迁移shard到另一台存储服务器需要在满足ACID特性的条件下迁移。ACID特性通过Foundationdb的事务特性实现。对serverKeys和keyServers的更改称为Foundationdb内的私有事务,与正常事务相比,私有事务会更改txnStateStore。
shard从源服务器移动到目标服务器需要经过四个步骤:
(1)DD将目标服务器作为shard的拥有者;
(2)目标服务器发起事务读取shard范围并以key-value的形式写入,key-value对将被路由到目标服务器,最终保存在目标服务器的存储引擎中;
(3)DD通过修改system keyspace删除源服务器对shard的拥有权;
(4)DD从server team中删除源服务器拥有的shard信息(比如shardsAffectedByTeamFailure)。

浙公网安备 33010602011771号