天天看点

《大规模分布式存储系统》第十章 数据库功能

  • 只读事务

    首先,MergeServer模块中SQL层进行SQL语句解析、词法分析、申城语法树,其中查询优化是MySQL的核心和难点,但是OceanBase在本部分并没有很多工作。其次,无论是单表查询还是多表查询都会根据需求拆分为子请求,分发到目的ChunkServer上执行。最后,OceanBase 原则上尽量保持存储节点与计算节点一致,即ChunkServer可以计算的,尽量在ChunkServer上计算,减少MergeServer的计算。

    注:MergeServer 会汇聚多个子表的结果,内存、CPU等资源可能成为瓶颈。

  • 读写事务

    多版本并发控制:UpdateServer内部维护B树,叶子节点存储修改链表,根据版本区分不同链表。通过两阶段实现并发事务。预提交阶段,先锁住行数据(跨行事务,超时释放解决死锁),然后修改操作添加到未提交链表,最后将事务添加到任务队列中。提交阶段,提交线程(多线程)从任务队列取任务,然后写日志缓冲区,达到一定大小同步给从,然后写日志文件,写完后将操作从未提交链表中取出加入已提交队列,并释放锁。事务中所有的读操作都是读制定某个版本的数据,为保证更高的并发度,没有提供更高的隔离级别。

    备UpdateServer并发回放日志,日志分发线程批量的获取日志,分发给多个日志回放线程,回放完成后交给日志提交线程(提交到内存表,然后写日志)。感觉日志提交线程需要控制提交顺序,多回放线程提升了速度,貌似在一些极端情况提交线程会成为瓶颈。

  • OLAP业务支持

业务特点:查询量大,百万、千万级别。只查询部门列。

并发查询:MergeServer拆分自请求给ChunkServer,然后Merge结果,MergeServer更容易成为瓶颈;

列式存储:减少子请求,提升效率,且压缩比高。OceanBase支持列组,包括三种:第一种是所有列属于一个列组(OLTP业务),第二种是每个列属于一种列组(比较少用)、第三种是部分列属于一个列组(OLAP业务)。对于SSTable文件的组织形式也是不同的,第一种是按行存储,第二种是按列存储。第三种是行列混合存储。且OceanBase支持一个列属于多列组。

    注:作者介绍OceanBase初期由于内存设计问题,内存膨胀、CPU使用高等问题严重影响了列式存储的性能优势。

  • 特色功能

大表左连

    两个表需要左连运算,表很大的话,计算量很大(每个用户收藏的商品,将用户id分发给所有手上商品表所在的ChunkServer),延时不可接受。另一种方案是,两个表在底层存储时,存在一个表中,但是冗余度高带来了更新繁琐的问题,一个商品被几十万用户收藏,人气、收藏数等等数据实时更新困难。

    OceanBase的解决方案是,ChunkServer上的极限数据采用冗余的方式,UpdateServer的增量数据采用分表方式,这样可以规避上述两个问题。

数据过期与批量删除

    用于用户设置过期规则,例如,删除某一个时间段等操作,在查询时会进行物理删除。这个功能主要是针对OLAP业务,数据量较大,一旦存储错误数据,逐条删除不方便。

继续阅读