OceanBase是阿里集团开发的可扩展关系数据库,实现了数千亿条记录、数百TB数据的跨行、跨表交易。截至2012年8月,已支持收藏夹、直通车报表、天猫评价等OLTP和OLAP在线服务,在线数据量突破1000亿。
从模块划分来看,阿里数据库oceanbase可以分为四个模块:主服务器RootServer、UpdateServer更新服务器、基线数据服务器ChunkServer和MergeServer Mergeserver。根据时间轴,OceanBase系统中的数据分为基线数据和增量数据。只有基线数据被阅读,所有的修改都将升级到增量数据。通过合并操作,增量数据可以定期合并到基线数据中。
oceanbase系统架构阿里数据库
OceanBase由以下部分组成:
●用户端:用户使用OceanBase的方法与MySQL数据库完全相同,支持JDBC、C客户端浏览等。基于MySQL数据库开发的应用工具等可以直接迁移到OceanBase。
●RootServer:管理集群中所有服务器、子表的数据分发和副本管理。根部服务器通常是一主一备,主备之间的数据是强同步的。
●UpdateServer:存储OceanBase系统的增量更新数据。UpdateServer通常是一主一备,主备之间可以配置不同的同步模式。UpdateServer进程和RootServer进程通常共享物理服务器。
●ChunkServer:存储OceanBase系统的基线数据。基线数据通常存储在两个或三个副本中,这是可以配置的。
●MergeServer:通过词法分析、语法分析、查询优化等一系列操作,对用户的SQL请求进行接收和分析,然后转发给相应的ChunkServer或UpdateServer。MergeServer还将合并多个ChunkServer返回结果,如果要求的数据分布在多个ChunkServer上。原生MySQL通信协议用于客户端和MergeServer之间,MySQL客户端可以直接访问MergeServer。
支持部署多个机房的阿里数据库oceanbase。每一个机房都配备了完整的OceanBase集群,包括RootServer、MergeServer、Server和ChunkUpdateServer。每个集群负责数据划分、负载平衡和集群服务器管理。通过主集群业主更新服务器对备用集群的同步增量更新操作日志,实现集群之间的数据同步。客户端配备了多个集群的RootServer地址列表,客户可以设置每个集群的流量分配比例。根据这个比例,客户端将读写操作发送到不同的集群:
阿里数据库oceanbase客户服务
要求RootServer在集群中获得MergeServer的地址列表。
选择MergeServer,按照一定的策略发送读写请求。MergeServer与客户端的通信协议适应原始MySQL协议,只需调用MySQLJDBC驱动或MySQLC客户端等标准库即可。客户支持随机分散和一致分散两种主要策略。为了方便MergeServer缓存查询记录,哈希的目的是向同一MergeServer发送相同的SQL请求。
如果对MergeServer的请求失败,请从MergeServer列表中选择另一个MergeServer,然后再次尝试。如果对MergeServer的请求失败超过一定频率,则将MergeServer列入黑名单,并从MergeServer列表中删除。另外,客户端会定期要求根服务器更新MergeServer地址列表。
如果OceanBase部署了多个集群,客户端必须处理多个集群的流量分配。用户可以在多个集群之间设置流量分配比例。客户端获得流量分配比例后,可以根据这个比例向不同的集群发送请求。
根服务器
集群管理、数据分发和副本管理是RootServer的主要功能。
所有集中在RootServer管理组的MergeServer、Server和ChunkUpdateServer。在每一个集群中,只有一个UpdateServer可以同时提供写作服务,而这个UpdateServer已经成为主UpdateServer。这种方法通过牺牲一些可用性来实现强大的一致性。RootServer通过租赁机制选择唯一的主更新服务器。RootServer可以在原始租赁到期后选择新的更新服务器作为主更新服务器。另外,RootServer和Mergeserver&Chunkserver保持心跳,因此它能感知到在线Mergeserver&Chunkserver机器的目录。
使用主键对阿里数据库oceanbase表中的数据进行内部排序和存储,主键由几列组成,并且是唯一的。在OceanBase中,基线数据按主键排序,并分为信息量基本相同的数据范围,称为子表。默认情况下,每个子表的大小为256MB(可配置)。OceanBase的数据分发模式与Bigtable相同,不同之处在于OceanBase没有使用RootTable)元数据表的二级索引结构,而是采用了根表的一级索引结构。
在[1,100]中,主键值的表分为1~25。、26~50、51~80、81~100四个子表。RootServer中的根表记录了每个子表所在的ChunkServer的位置信息,每个子表包括分布在多个chunkserver中的多个副本(通常有三个副本,可以配置)。RootServer可以在其中一个ChunkServer出现故障时检测到它,并触发在ChunkServer上的子表上添加副本的操作;另外,RootServer会定期进行负载平衡,选择一些子表从负荷较低的机器。
RootServer选择了一主一备的结构,主备之间的数据同步性很强,通过LinuxHA(http://www.linux-ha.org)软体可扩展性。备用根服务器共享VIP。当主茎服务器出现故障时,VIP可以自动漂移到备用根服务器所在的设备上。在备用根服务器检测到后,它被转换为为主茎服务器提供服务。
合并服务器
MergeServer的功能主要有:协议分析、SQL分析、请求转发、结果合并、多表操作等。
MySQL协议是OceanBase客户端和MergeServer之间的协议。首先,MergeServer分析MySQL协议,提取客户发送的SQL语句,然后进行词法分析和语法分析,生成SQL语句的思维查询计划和物理查询计划,最后根据物理查询计划调用OceanBase内部的各种运算符。
根据请求中涉及的子表,MergeServer缓存子表的分布信息将请求转发给子表所在的ChunkServer。如果是写作操作,它也会被转发到更新服务器。一些请求需要跨越多个子表。此时,MergeServer将请求拆分并发送给多个chunkserver,并合并这些chunkserver返回的结果。MergeServer需要先从ChunkServer中获取每个表的数据,然后进行多个关卡查询。
MergeServer支持多个chunkserver的并发请求,即多个请求被发送到多个chunkserver,然后所有请求都被一次性回答。另外,在SQL执行过程中,如果子表所在的ChunkServer出现故障,MergeServer将请求转发给子表的其它副本所在的ChunkServer。通过这种方式,ChunkServer故障不会影响用户的查询。
MergeServer本身没有状态,所以MergeServer的停机不会影响用户,客户端会自动屏蔽MergeServer的故障。
ChunkServer
ChunkServer的功能包括:存储多个子表,提供阅读服务,定期实施并分发数据。
阿里数据库oceanbase将一个大表分为大小约256MB的子表。每一个子表由一个或多个SSTable(通常是一个)组成,每一个SSTable由多个块组成(可配置块,大小从4KB到64KB不等)。数据按主键顺序存储在表中。要找到一行数据,首先要找到该行所属的子表,然后在相应的表中实施二分搜索法。SSTable支持两种缓存方式,即块缓存和行缓存。最近,块缓存以块为基准获取数据,行缓存最近以行为单位获取数据。
MergeServer向子表所在的ChunkServer发送每个子表的读取请求,ChunkServer。首先,Chunkserver读取SSTable中包含的基线数据,然后要求UpdateServer获取相应的增量更新数据,然后将基线数据与增量更新相结合,得到最终结果。
由于每一次阅读都需要从UpdateServer获得最新的增量更新,所以为了保证阅读性能,需要在UpdateServer中限制增量更新信息量,最好将所有数据存储在内存中。OceanBase会定期触发合并或数据分发操作,其中ChunkServer将在前一段时间从UpdateServer获得更新操作。一般而言,OceanBase集群将达到服务高峰(凌晨1:00开始,可配置)每天进行一次合并操作。这一合并操作通常被称为每日合并。
更新服务器
UpdateServer是群集中唯一可以接受写入的模块,而且每个群集中只有一个主更新服务器。首先,将UpdateServer中的更新操作写入内存表。当内存表中的数据量超过一定值时,可以生成快照文件并将其转储到SSD。快照文件的组织方式与ChunkServer中的SSTable相似,因此这些快照文件也被称为SSTable。另外,由于数据行中的一些列已经更新,一些列没有更新,所以存储在SSTable中的数据行被称为稀疏。
为了保证可靠性,主更新服务器需要在更新内存表之前写下操作日志,并同步到备用更新服务器。当主更新服务器失败时,根服务器上维护的租赁将失败。此时,RootServer将在备用更新服务器列表中选择最新的备用更新服务器,并将其转换为主更新服务器,继续提供写入服务。UpdateServer关机重启后,需要先加载转储的快照文档(SSTable文档),然后回顾快照点后的操作日志。
由于集群中只有一个提供写作服务的UpdateServer,OceanBase可以在不使用传统两个阶段提交协议的情况下轻松实现跨银行和跨表事务。当然,这也带来了一系列的问题。UpdateServer的性能对于整个集群的所有读写操作都必须经过updateserver至关重要。OceanBasecluster通过两种机制不断向ChunkServer分发UpdateServer的增量更新:定期合并和数据分发。但是,UpdateServer只需要在短时间内提供新的数据,所有这些信息通常都可以存储在内存中。另外,在系统进行UpdateServer的内存操作、网络结构、磁盘操作时,还需要进行大量的改进。
定期整合阿里数据库oceanbase和数据分发
定期整合和数据分发是将增量更新从UpdateServer分发到ChunkServer的一种方法,它们的整个过程是相似的:
UpdateServer冻结当前活动内存表,生成冻结内存表,打开新的活动内存表,然后更新操作,写入新的活动内存表。
UpdateServer通知RootServer数据版本发生变化,随后RootServer通过心跳消息通知ChunkServer。
每一个ChunkServer开始定期合并或数据分发操作,从UpdateServer那里获得每个子表对应的增量更新数据。
定期合并和数据分发的区别在于,在数据分发过程中,ChunkServer只在当地缓存UpdateServer中冻结内存表中的增量更新数据,而ChunkServer需要在定期合并过程中将当地s表中的基线数据与冻结内存表中的增量更新数据合并一次,然后在新的s表中生成新的基线数据并存储在一起。定期合并对系统的服务能力影响很大,通常安排在日常服务的高峰期(例如凌晨1:00开始),而且数据分发可以不受限制。