阿里巴巴——Oceanbase组员:•Introduction•淘宝Oceanbase是从2010年5月开始研发的,其定位是解决淘宝内部在线业务的云存储问题。我们在设计系统时,总是考虑现在及今后一段时间的需求。互联网业务大致可以分为OLTP和OLAP两类,对在线存储的需求简单归纳如下。•OLTP:今后数据规模为千亿级,数据量数百TB,要求几十万QPS和几万TPS。•OLAP:支持千万级记录的数据集上进行实时计算。•功能:支持范围查询,支持跨行跨表事务。•其他:高可用性、自动故障处理、自动扩容等。•因为OLTP和OLAP业务对性能的要求,我们必须采用分布式方案。另外,淘宝的业务发展迅猛,传统的分库/分表方法带来的扩容及运维成本太高,必须构建异构的云存储系统。由于数据爆炸性的增长,淘宝用户数量的急剧攀升,对于数据的存储更新和维护都具有很大的挑战。下图为淘宝网的一些数据从图中可以看到,数据的急剧膨胀,随着用户不断地增长,对于数据的存储也带来了极大的挑战。淘宝网站数据的存储经历了以下几个阶段:1.早期的单机式的mysql的使用方式,在业务的高速发展下,很快就达到了瓶颈。2.第二个阶段为从mysql到Oracle的迁移,比升级到小型机,高端存储后,在过去的几年里,满足了淘宝业务快速变化发展的需要。但是由于数据数量的急剧增加,技术却没有跟上相应的步伐。并且小型机的内存有限,发现了Oracle数据库有连接瓶颈,在达到5000个以后相当的吃力。然而,随着业务的快速发展,这些数据急剧膨胀,记录数从几千万条增加到数十亿条,数据量从百GB增加到数TB,未来还可能增加到数千亿条和数百TB,传统的关系型数据库已经无法承担如此海量的数据。•如何借鉴已有技术满足淘宝未来一段时间内的云存储需求?如果直接模仿国外的互联网巨头,比如模仿GFS+BigTable,淘宝的团队确实有一定的经验。然而这样的系统在两年之内很难稳定,并且不能满足跨行跨表事务等复杂的功能需求。因为淘宝的在线业务新增数据量比较小,那是否可以把最新修改的数据和以前的数据分离呢?模仿国外巨头?或者。。。•淘宝Oceanbase将数据分成动态数据和静态数据两部分:动态数据的数据量较小,侧重TPS和QPS,采用集中式的方法存放到单个节点的高品质存储介质,如内存和SSD;静态数据的数据量很大,侧重存储容量,采用分布式的方法将数据分布到多台普通PC服务器的磁盘或者SSD。由于动态数据的存储介质成本较高,需要不断地将动态数据合并到静态数据中,从而分布到多台机器以实现分布式存储。自主创新OceanBase的系统架构OceanBase的整体架构图OceanBase双机房部署OceanBase客户端OceanBase客户端与MergeServer通信,目前主要支持如下几种客户端:1.Mysql客户端:2.Java客户端:3.C客户端:OceanBase——RootServerRootServer的功能主要包括:集群管理、数据分布以及副本管理。1.管理集群中的所有ChunkServer,处理ChunkServer上下线;2.管理集群中的UpdateServer,通过租约(Lease)机制选择唯一的主UpdateServer;3.管理集群中tablet数据分布,发起tablet复制、迁移以及合并等操作;4.与ChunkServer保持心跳,接受ChunkServer汇报,处理tablet分裂;5.接受UpdateServer汇报的大版本冻结消息,通知ChunkServer执行定期合并;6.实现主备RootServer,数据强同步,支持主RootServer宕机自动切换;OceanBase——RootServerOceanBase内部使用主键对表格中的数据进行排序和存储,主键由若干列组成并且具有唯一性。在OceanBase内部,基准数据按照主键排序并且划分为数据量大致相等的数据范围,称为tablet。OceanBase——RootServer假设原来的RootTable包含四个tablet:r1(min,10],r2(10,100],r3(100,1000],r4(1000,max],ChunkServer汇报的tablet列表为:t1(10,50],t2(50,100],t3(100,1000],表示r2发生了tablet分裂,那么,RootServer会将RootTable修改为:r1(min,10],r2(10,50],r3(50,100],r4(100,1000],r5(1000,max]。RootServer——Tablet复制与负载均衡每台ChunkServer记录了tablet迁移相关信息,包括:ChunkServer上tablet的个数以及所有tablet的大小总和,正在迁入的tablet个数、正在迁出的tablet个数以及tablet迁移任务列表。RootServer包含一个专门的线程定期执行Tablet复制与负载均衡任务,步骤如下:1.Tablet复制:扫描RootTable中的tablet,如果某个tablet的副本数小于阀值,选取某台包含tablet副本的ChunkServer为迁移源,另外一台符合要求的ChunkServer为迁移目的地,生成tablet迁移任务。2.负载均衡:扫描RootTable中的tablet,如果某台ChunkServer包含的某个表格的tablet个数超过平均个数以及可容忍个数(默认值为10)之和,以这台ChunkServer为迁移源,并选择一台符合要求的ChunkServer,生成tablet迁移任务。OceanBase——MergeServerMergeServer的功能主要包括:协议解析、SQL解析、请求转发、结果合并、多表操作等。OceanBase客户端与MergeServer之间的协议为Mysql协议。MergeServer首先解析Mysql协议,从中提取出用户发送的SQL语句,接着进行词法分析和语法分析,生成SQL语句的逻辑查询计划和物理查询计划,最后根据物理查询计划调用OceanBase内部的各种操作符。MergeServer缓存了tablet分布信息,根据请求涉及的tablet将请求转发给该tablet所在的ChunkServer。如果是写操作,还会转发给UpdateServer。MergeServer支持并发请求多台ChunkServer,即将多个请求发给多台ChunkServer,再一次性等待所有请求的应答。OceanBase——ChunkServerChunkServer的功能包括:存储多个tablet、提供读取服务、执行定期合并以及数据分发。OceanBase将大表划分为大小约为256MB的tablet,每个tablet由一个或者多个SSTable组成(一般为一个),每个SSTable由多个块(Block,大小为4KB~64KB之间,可配置)组成,数据在SSTable中按照主键有序存储。查找某一行数据时,需要首先定位这一行所属的tablet,接着在相应的SSTable中执行二分查找。SSTable支持两种缓存模式,BlockCache以及RowCache。BlockCache以Block为单位缓存最近读取的数据,RowCache以行为单位缓存最近读取的数据。OceanBase——UpdateServerUpdateServer是集群中唯一能够接受写入的模块,每个集群中只有一个主UpdateServer。UpdateServer中的更新操作首先写入到内存表,当内存表的数据量超过一定值时,可以生成快照文件并转储到SSD中。快照文件的组织方式与ChunkServer中的SSTable类似,因此,这些快照文件也称为SSTable。另外,由于数据行的某些列被更新,某些列没被更新,SSTable中存储的数据行是稀疏的,称为稀疏型SSTable。为了保证可靠性,主UpdateServer更新内存表之前需要首先写操作日志,并同步到备UpdateServer。定期合并&数据分发定期合并和数据分发都是将UpdateServer中的增量更新分发到ChunkServer中的手段,二者的整体流程比较类似:1.UpdateServer冻结当前的活跃内存表(ActiveMemTable),生成冻结内存表,并开启新的活跃内存表,后续的更新操作都写入新的活跃内存表。2.UpdateServer通知RootServer数据版本发生了变化,之后RootServer通过心跳消息通知ChunkServer。3.每台ChunkServer启动定期合并或者数据分发操作,从UpdateServer获取每个tablet对应的增量更新数据。定期合并&数据分发新的Tablet=旧的Tablet+冻结内存表架构剖析——一致性选择OceanBaseUpdateServer为主备高可用架构,更新操作流程如下:1.将更新操作发送到备机;2.将更新操作的redo日志写入主机硬盘;3.将redo日志应用到主机的内存表格中;4.返回客户端写入成功。架构剖析——数据结构架构剖析——可靠性与可用性分布式系统需要处理各种故障,例如软件故障,服务器故障,网络故障,数据中心故障,地震,火灾,等。与其它分布式存储系统一样,OceanBase通过冗余的方式保障了高可靠性和高可用性。1.OceanBase在ChunkServer中保存了基准数据的多个副本。2.OceanBase在UpdateServer中保存了增量数据的多个副本。3.ChunkServer的多个副本可以同时提供服务。4.UpdateServer主备之间为热备,同一时刻只有一台机器为主UpdateServer提供写服务。架构剖析——可靠性与可用性UpdateServer主备同步原理数据库功能•整体架构•只读事务•写事务•特色功能整体架构解析出SQL语句词法分析。。。实现写事务计算SQL请求只读事务•只读事务(SELECT语句),经过词法分析、语法分析,预处理后,转化为逻辑查询计划和物理查询计划。单表操作单表相关的物理运算符:1.TableScan:扫描某个表格2.Filter:针对每行数据,判断是否满足过滤条件。3.Projection:对输入的每一行,根据定义的输出表达式,计算输出结果行。4.GroupBy:把输入数据按照指定列进行聚集,对聚集后的每组数据可以执行count、sum、min、max、avg等聚集操作。5.Sort:对输入数据进行整体排序,如果内存不够,需要使用外排序6.Limit:返回行号在[offset,offset+count)范围内的行。7.Distinct:消除某些列相同的重复行。。物理查询计划举例-单表查询物理查询计划举例-多表查询写事务•写事务,包括UPDATE、INSERT、DELETE、REPLACE,由MergeServer解析后生成物理执行计划,•物理执行计划最终将发给UpdateServer执行。•写事务可能需要读取基线数据,用于判断更新或者插入的数据行是否存在,判断某个条件是否满足,等等,这些基线数据也会由MergeServer传给UpdateServer。OceanBase的特色功能1.大表左连接2.数据过期与批量删除大表左连接需求来源:淘宝收藏夹业务(1)收藏夹业务:包含收藏表collect_info以及商品表collect_item◆collect_info:存储用户的收藏信息,如收藏时间、标签等◆collect_item:存储用户收藏的商品或者店铺的信息,包括价格、人气等(2)收藏夹业务的数据量◆collect_info的数据条目达到100亿条◆collect_item的数据条目接近10亿条◆每个用户平均收藏了50~100个商品或者店铺大表左连接(3)传统做法•采用Join操作:根据collect_info中存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。•冗余:在collect_info表中冗余商品的价格、人气等信息,读取时就不需要读取collect_item表了。