Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370786
  • 博文数量: 273
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1430
  • 用 户 组: 普通用户
  • 注册时间: 2018-02-02 15:57
文章分类

全部博文(273)

文章存档

2018年(273)

我的朋友

分类: 大数据

2018-07-05 15:20:00

读写事务

在OceanBase系统中,用户的读写请求,即读写事务,都发给MergeServer。MergeServer解析这些读写事务的内容,例如词法和语法分析、schcma检查等。对于只读事务,由MergeScrver 发给相应的ChunkServer分别执行后再合并每个ChunkServer的执行结果;对于读写事务,由MergeServer进行预处理后,发送给UpdateServer执行。

只读事务执行流程如下:
1)MergeServer解析SQL语句,词法分析、语法分析、预处理(schema合法性检查、权限检查、数据类型检查等),最后生成逻辑执行计划和物理执行计划。
2)如果SOL请求只涉及单张表格,MergeServer将请求拆分后同时发给多台
ChunkServer并发执行,每台ChunkServer将读取的部分结果返回MergeServer,由MergeServer来执行结果合并。
3)如果SQL请求涉及多张表格,MergeServer还需要执行联表、嵌套查询等操作。
4)MergeServer将最终结果返回给客户端。

读写事务执行流程如下:
1)与只读事务相同,MergeServer首先解析SQL请求,得到物理执行计划。
2)MergeServer请求ChunkServer获取需要读取的基线数据,并将物理执行计划和基线数据一起传给Updateserver。
3)Updatesever根据物理执行计划执行读写事务,执行过程中需要使用MergeServer传入的基线数据。
4)UpdateServer返回MergeServer操作成功或者失败,MergeServer接着会把操作结果返回客户端。

例如,假设某SQL语句为update t1 set c1 = c1 + 1 where rowkey=1 ,即将表格t1中主键为1的c1列加1,这一行数据存储在Chunkserver中.c1列的值原来为2012。那么,MergeServer执行SQL时首先从ChunkServer读取主键为1的数据行的c1列,接着将读取结果(c1=2012)以及SOL语句的物理执行计划一起发送给UpdateServer。UpdateServer根据物理执行计划将c1加1,即将c1变为2013并记录到内存表(McmTable)中。当然,更新内存表之前需要记录操作日志。

单点性能

OceanBase架构的优势在于既支持跨行跨表事务,又支持存储服务器线性扩展。当然,这个架构也有一个明显的缺陷:UpdateServer单点,这个问题限制了OceanBase集群的整体读写性能。

下面从内存容量、网络、磁盘等几个方面分析UpdateServer的读写性能。其实大部分数据库每天的修改次数相当有限,只有少数修改比较频繁的数据库才有每天几亿次的修改次数。另外,数据库平均每次修改涉及的数据量很少,很多时候只有几十个字节到几百个字节。假设数据库每天更新1亿次,平均每次需要消耗100字节,每天插入1000万次,平均每次需要消耗1000字节,那么,一天的修改量为:1亿×100+1000
万×1000=20GB,如果内存数据结构膨胀2倍,占用内存只有40GB。而当前主流的服务器都可以配置96GB内存,一些高档的服务器甚至可以配置192GB、384GB乃至更多内存。


阅读(1176) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~