8.3.3 RootServer
RootServer的功能主要包括:集群管理、数据分布以及副本管理。
RootServer管理集群中的所有MergeServer、ChunkServer以及UpdateServer。每个集群内部同一时刻只允许一个UpdateServer提供写服务,这个UpdateServer成为主UpdateServer。这种方式通过牺牲一定的可用性获取了强一致性。RootServer通过租约(Lease)机制选择唯一的主UpdateServer,当原先的主UpdateServer发生故障后,RootServer能够在原先的租约失效后选择一台新的UpdateServer作为主UpdateServer。另外,RootServer与MergeServer&ChunkServer之间保持心跳(heartbeat),从而能够感知到在线和已经下线的MergeServer&ChunkServer机器列表。
OceanBase内部使用主键对表格中的数据进行排序和存储,主键由若干列组成并且具有唯一性。在OceanBase内部,基线数据按照主键排序并且划分为数据量大致相等的数据范围,称为子表(tablet)。每个子表的默认大小是256MB(可配置)。OceanBase的数据分布方式与Bigtable一样采用顺序分布,不同的是,OceanBase没有采用根表(RootTable)+元数据表(MetaTable)两级索引结构,而是采用根表一级索引结构。
如图8-3所示,主键值在[1,100]之间的表格被划分为四个子表:1~25,26~50,51~80以及81~100。RootServer中的根表记录了每个子表所在的ChunkServer位置信息,每个子表包含多个副本(一般为三个副本,可配置),分布在多台ChunkServer中。当其中某台ChunkServer发生故障时,RootServer能够检测到,并且触发对这台ChunkServer上的子表增加副本的操作;另外,RootServer也会定期执行负载均衡,选择某些子表从负载较高的机器迁移到负载较低的机器上。
图 8-3 基线数据子表划分
RootServer采用一主一备的结构,主备之间数据强同步,并通过Linux HA(http://www.linux-ha.org)软件实现高可用性。主备RootServer之间共享VIP,当主RootServer发生故障后,VIP能够自动漂移到备RootServer所在的机器,备RootServer检测到以后切换为主RootServer提供服务。