首页 今日头条正文

浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charles

【CSDN 编者按】10 月 2 日,国际事务处理功用委员会发布了数据库最新功用测验成果,在 TPC-C 基准测验中,由阿里巴巴集团蚂蚁金服自主研制的分布式联系数据库 OceanBase 打破了由 Oracle 坚持了 9 年的 TPC-C 基准功用测验国际纪录,不只成为首个登榜的我国数据库,更一举拿下国际第一,对此,我国工程院院士、核算机专家李国杰点评道:「这是我国根底软件获得的重大突破!」

本文作者 CSDN 博客专家马超对 OceanBase 的物理架构、数据及操控流程进行了分析,并解读开源部分的源码来分析 OceanBase 是怎么勇夺 TPC-C 冠军的。

作者 | 马超,CSDN 博客专家

责编 | 唐小引

出品 | CSDN 博客

封图 | CSDN 付费下载自东方 人与牛IC

权利界
医护员手术室互殴
庙坝麻柳村

我国高科技根底渠道又有重大突破,继阿里和腾讯以及许多国内老牌嵌入式厂商相继宣扬开源 IoT 操作体系之后,今日据权威机构国际事务处理功用委员会(Transaction Processing Performance Council)官网发表,由阿里巴巴集团蚂蚁金服自主研制的联系数据库 OceanBase,在 TPC-C 基准测验中,打破了由美国公司 Oracle(甲骨文)坚持了 9 年之久的国际记载,成为首个登顶该榜单的我国数据库产品。

不过经笔者刚刚屡次测验,现在 TPC 的官赤军街1号网(www.tpc.org)并无法在国内拜访,所以悉数的信息只能出自这个截图,咱们能够看到如下两个信息,一是这个排行榜是以 tpm浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charlesC 为基准进行排名的,这儿解释一下 tpmC 其实是 TPC-C 三规范的一种衡量方法,tpmC 中的 tpm 是 transactions per minute 的简写,即每分钟的交易量,C 代表 C 基准程序。它的界说是每分钟内体系处理香兰印尼餐厅的新订单个数。在这方面阿里的 OceanBase的确是遥遥领先。

TPC-C 还经常以体系功用浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charles价格比的方法表现,单位是$/tpmC,即以体系的总价格(单位是美元)/tpmC 数值得出。这个笔者也已经在上图中标红,可见这个参数按现行汇率来说阿里的优势不明显。而且考虑到甲骨文的测验提交时刻是 2011 年,而阿里的测验时刻则是本年的 10 月 2 日。因而因为笔者也没拿到测验报告的原文,所以甲骨文是否还是以 11 年的硬件价格来做为分母核算性价比目标也尚不得而知。

因而综上所述,阿里在功用目标上的确是做到了遥遥领先,可是可能在硬件价格以及测验时刻的方面占了一些先机。

OceanBase在哪些方面做对了?

依据 OceanBase的官网[1]介绍,其整体物理架构如下:

一起,从官网信息咱们能够看到,OceanBase在金融职业的使用事例为南京银行,因而笔者第一时刻翻了一下南京银行朋友的票圈,了解了一下相关信息,现在南京分行在 OceanBase上线的体系以互联网使用为主,而且依据其共享 OceanBase在 Github 对自己的 0.4 版别进行了开源[2],现在尽管版别有更新,可是其根底规划没有底子改动,依据 GitHub 上的资源显现,其数据及操控流程整体如下:

OceanBase 将表的数据动态切分为 tablet,tablet 的数据分为动态和静态两部分。静态的数据存放在 chunkserver 上,一切对数据的修正都存储在 updateserver 中。updateserver 的修正定时同步到 chunkserver,chunkserver 将 updateserver 的更新和本地的静态数据兼并,生成合浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charles并后的新数据。

tablet 的信息由 rootserver 保护,客户端在初始化时会恳求 rootserver,获取 updateserver 的地址信息。客户端的更新恳求(包括新增、修正和删去)都直接拜访 updateserver。查询恳求时客户端依据相应的 rowkey 向 rootserver 查询其对应的 ta浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charlesblet 信息,rootserver 回来相应的 mergeserver 地址,客户端依据回来的信息恳求相应的 mergeserver 获取数据。

Mergeserver 收到恳求时,依据 rowkey 从 rootserver 获取相应的 tablet 信息,该信息中包括担任该 tablet 的 chunkserver 列表,mergeserver 恳求相应的 chunkserver,获取静态数据(假如有的话),然后依据回来的数据,恳求 updateserver 获取相应的更新数据,将更新数据和静态的数据兼并,将兼并后的成果回来给客户端。

为了进步读取的功用,chunkserver 对部分数据结构进行了缓存。一个 SSTable 由多个 block 组成,为了加速定位需求恳求的数据坐落 SSTable 的哪个 block 中,chunkserver 包括一个 block index 的功用,block index 由该 block 担任的数据的最终一个 key 和该 block 在 SSTable 文件中的方位组成。为了进步 block 的读取功用,chunkserver 还将 block 缓存在内存中。Block index 和 block 的 cache 都选用 LRU 的战略筛选。

笔者之前的博文中也介绍过,想进步功率有必要做做减法,针对专门的场景做特定的优化。在笔者看到 OceanBase 的规划时,最令我形象深入的是其 chunkserver 自带的缓存功用,而且依据之前的最佳实践共享,与甲骨文等传统数据库不同,OceanBase与使用之间是不需求加 redius 缓存的,所以这点应该是阿里做的比传统数据库厂商凶猛的当地。阿里的数据库之所以快基本上能够归功于这个 chunkserver 的劳绩,下面咱们就来进行一下代码解读。

速度诀窍:c普寿寺落发女孩的感触hunkserver 的规划与相关代码

其 chunkserver 的根底流程图如下:

能够看到担任数据查找和读取的姚楚豪部分是 SSTable 所以下面咱们再对这部分做一下具体的代码解读,为便于查找,SSTable 会树立一些信息来索引数据,比方相关 key 在 SSTable 中的偏移,IndexBuilder 即用来树立这些信息。这部分的相关代码在:

https://github.com/alibaba/oceanbase/tree/master/oceanbase_0.4/src/sstable/ob_sstable_block_index_builder.cpp

其间要点函数是这个生成进口的函数 add_entry,这些都写得比较清楚,我们能够看一下。

intObSSTableBlockIndexBuilder::add_entry( constuint64_ttable_id,

constuint64_tcolumn_group_id,

constObRowkey &key,

constint32_trecord_size)

{

intret = OB_SUCCESS;

ObSSTableBlockIndexItem index_item;

//合法性校验魏炳文

if(record_size < 0|| key.get_obj_cnt <= 0|| N周杰忠ULL== key.get_obj_ptr

|| table_id == OB_INVALID_ID || table_id == 0|| OB_INVALID_ID == column_group_id)

{

TBSYS_LOG(WARN, "invalid param, table_id=%lu, key_len=%ld,"

"key_ptr=%p, record_size=%d, column_group_id=%lu",

table_id, key.get_obj_cnt, key.get_obj_ptr, record_size, column_group_id);

ret = OB_ERROR;

}

if(OB_SUCCESS == ret)

{

//初始化,后边也是用以下的参数进行序列化的

index_item.rowkey_column_count_ = static_cast< 李红豪int16_t>(key.get_obj_cnt);

index_item.column_group_id_ = static_cast< uint16_t>(column_group_id);

index_item.table_id_ = static_cast< uint32_t>(table_id);

index_item.block_record_size_ = record_size;

index_item.block_end_key_size_ = static_cast< int16_t>(key.get_serialize_objs_size);

index_item.reserved_ = 0;

ret = index_items_buf_.add_index_item(index_item);

if(OB_SUCCESS == ret)

{

ret = end_keys_buf_.add_key(key);

if(OB_ERROR == ret)

{

TBSYS_LOG(WARN, "failed to add end key");

}

else

{妻子的视频

index_block_header_.sstable_block_count_++;

}

}

else

{

TBSYS_LOG(WARN, "failed to add index item");

ret = OB_ERROR;

}

}

returnret;

}

和这个函数生成 index 的函数:

i我国特种兵之血痕ntObSSTableBlockIndexBuilder::build_block_index( constbooluse_binary_rowkey,

char* index_block, constint64_tbuffer_size, int64_t& index_size)

{

intret = OB_SUCCESS;

int64_tindex_block_size = get_index_block_size;

int64_tindex_items_size = get_index_items_size;

int64_theader_size = index_block_header_.get_serialize浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charles_size;

int64_tpos = 0;

if( NULL== index_block)

{

TBSYS_LOG(WARN, "invalid param, index_block=%p", index_block);

ret = OB_ERROR;

}

elseif(index_block_size == header_size)

{

//no data i武林别传戟神加点n index block

ret = OB_ERROR;

}

if(OB_SUCCESS == ret)

{

index_block_header_.end_key_char_stream_offset_

= static_cast< int32_t>(header_size + index_items_size);

// new rowkey obj array format, force set to 1.

index_block_header_.rowkey_flag_ = use_binary_rowkey ? 0: 1;

if(OB_SUCCESS == index_block_header_.serialize(index_block,

header_size, pos))

{

char* ptr = index_block + pos;

ret = index_items_buf_.get_data(ptr, buffer_size - header_size);

if(风流妹逗老司机OB浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charles_SUCCESS == ret)

{

ptr += index_items_size;

ret = 关照妇end_keys_buf_.get_data(ptr, buffer_size - header_size - 浪潮云,200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选,charlesindex_items_size);

if(OB_SUCCESS == ret)

{

index_size = index_block_size;

}

}

}

else

{

TBSYS_LOG(WARN, "failed to serialize index block header");

ret = OB_ERROR;

}

}

returnret;

}

而且,除了索引以外,OceanBase 还在读取之前添加了一个布隆过滤器,这个规划也比较有意思,Bloom Filter(布隆过滤器)用来断定某一个 key 是否归于某个调集,它有必定误判概率。假如断定在调集内,不必定在;可是假如断定不在调集内,那么必定不在,这样的操作能够优化许多 not in 的查询时刻。这部分的代码在:

https://github.com/alibaba/oceanbase/tree/master/oceanbase_0.4/src/common/bloom_filter.h

https://github.com/alibaba/oceanbase/tree/m女排新星颜值逆天aster/oceanbase_0.4/src/common/bloom_filter.cpp

这儿就不再贴代码了,我们有爱好能够去上面的链接读一下相关代码。

跋文

跟着美国在高科技范畴的不断施压,反而倒逼我国之前相对冷清的操作体系、数据库等根底渠道范畴从头热烈起来,笔者这个 C 言语的 IT 老兵感觉现在又勃发第二春,所以笔者还会继续重视相关范畴的发展,后续继续带来代码级的解读,欢迎继续重视。

[1] https://oceanbase.alipay.com/product/oceanbase

[2] https://github.com/alibaba/oceanbase

扫描下方二维码,下载 CSDN App,与博主互动起来!

点击阅览原文,立刻与博主互动谷猫云起来。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。