MemSQL架构 - 快速(MVCC,InMem,LockFree的CodeGen),和熟悉

转自:http://www.4090.cn/arc-19849-1.html


MemSQL架构 - 快速(MVCC,InMem,LockFree的CodeGen),和熟悉--------------------------------------------------------------------------------------------------------------------

MemSQL世界上最快的数据库。根据其基准MemSQL可以执行一个EC2 200K租者置其屋计划。
但目标市场MemSQL是明确的:项目寻找既快速又熟悉的东西。快速设计新颖,使用相结合的技术,如MVCC,代码生成,无锁数据结构,跳表,并在内存中执行。熟悉SQL并没有什么,但SQL的接口,MemSQL是唯一的SQL 。
支持SQL的一个有限子集,既不复制或分片实现,但冲刷到磁盘前在内存中写入队列。下一个版本将包括基线分布式系统,本机复制,n路连接,子查询。保持性能,更多的功能被添加是一个更真实的测试。
现代的硬件需要先进的数据库。我们的想法是去掉一切,并重新考虑它再次。
在单机环境下MemSQL的是一个极好的他们的建筑的情况。在分布式环境中,它们是有限的以相同的方式,每一个分布式数据库的被限制的。MVCC不提供任何魔法,因为它没有翻译轻松地在碎片。选择MemSQL反映的主要用途的情况下,快速的交易,加上快速实时的基于SQL的分析。MemSQL使用一片式的查询都是独立运行的每个碎片和融合汇聚节点的无共享的方法。整个碎片的交易将不被支持,直到实现两阶段提交,但随后他们会像任何其他数据库执行。他们真正想要做的很好的运行在集群中的快速实时聚合。
很多其他的问题浮现在脑海中,这种新颖的设计。MemSQL执行常见的操作,如“返回前5 X”作为程序员所期望的吗?将MemSQL还与各种不同的SQL查询执行时打?他们说是给定的代码生成和数据结构的选择。SQL的表现不足以解决现实世界的问题,在许多领域吗?当你开始添加存储过程或用户定义的函数的精心打造舞蹈的数据结构还是工作?
要回答这些问题让我们更深入的了解到MemSQL背后的技术吧。
 
为什么快?
锁免费+代码生成+,MVCC在多个内核的方法相比,使用分区的核心,每个核心序列化数据结构的访问速度更快。
代码生成最小化的代码执行路径查询和删除解释开销。SQL是硬连接到服务器。
使用C + +而不是Java。
跳过列表B-树来代替,因为B-树的不规模。
CPU效率意味着更高的吞吐量。,由于MemSQL使用较少的指令,每个查询,他们可以实现更高的吞吐量。推更多的疑问,可通过该系统,因为他们已经最小化分析,高速缓存,并计划缓存匹配。
 
无锁数据结构
无锁数据结构规模异常以及其他资源(CPU,RAM等)被添加到系统中。无锁数据结构,最大限度地减少浪费CPU在高争点。
每一个组件的MemSQL引擎是建立在无锁数据结构:链表,队列,栈,跳过列表,哈希表。
无锁队列和栈的整个系统管理交易和内存管理的状态。
无锁的哈希表是用来编译的计划在计划缓存地图查询的形状。
无锁跳转列表和哈希表索引数据结构。
 
跳过列表
跳跃列表是一种流行的数据结构在内存中执行得非常好。它有许多共同的基本性质与随机树。例如,它提供了O(logN)的时间来寻求一个特定的值。
的基本思路是,底层是一个排序的链表。每一个更高的层下面的列表是“快速”车道。我出现在一些固定的概率p(通常是一些像?或?)层i +1层中的元素。
其中的数据结构提供高效的寻找和插入树的属性,跳跃列表是正在实施的无锁值得注意的是,在高并发的环境中表现得非常好。
跳过列表中有两个主要的权衡:
B-树相比,跳跃列表是稍微慢长的顺序扫描。
锁自由跳跃列表是单向的。因此,在MemSQL,你必须为每一个跳跃列表索引指定它是否应该被升序或降序。如果你需要两个方向,你需要两个指标。
 
它是如何工作
MemSQL编译为本地代码与SQL的C + +代码生成的SQL查询。C + +使用GCC编译并加载到数据库中,作为一个共享对象。
发生在运行时编译。MemSQL是一个SQL-in-time编译为。所以他们只需要一次编译的应用程序的生命周期中,编译的查询计划重用的服务器重新启动。
MemSQL使用一个两相的解析器。第一个解析器是一个通轻型的一层叫自动parameterizer,其中带数字和字符串的计划。
例如,“SELECT * FROM T WHERE ID ='约翰'”转换为“SELECT * FROM T WHERE ID> @名称= ^; 5名。这些计划都存储在一个哈希表,映射参数化查询编译的查询计划。
如果哈希表中的计划,那么该参数被传递到编译后的代码执行的查询。
否则,查询处理由传统的基于树的SQL解析器和编译成C + +代码。下一次运行一个查询相同的形状,它会匹配在哈希表中已编译的计划。
通过代码生成DDL查询(CREATE / ALTER)和DML查询(SELECT / INSERT / UPDATE / DELETE)。
编译C + +代码存储在/ plancache目录。随意潜水看一看。
不支持“if语句”或任何程序类型逻辑。这是SQL和SQL(现在)。虽然他们抗衡使用SQL基地的创建生成的代码产生最佳的性能,因为它消除尽可能多尽可能的解释。从SQL生成的机器码是硬编码到代码路径。
动态SQL的支持。在后台调用gcc,这是不寻常的用于系统相结合的动态链接的DSL代码生成处理。
 
MemSQL复制是基于行的,并支持主/多从机配置。
支持K-安全。根据需要尽可能多的服务器,可用于高可用性。
MemSQL支持在线配置。工程运输和从快照中恢复,然后继续从日志重放。这个过程符合自然到MemSQL的耐用性计划,是实现在线配置。
一个奴隶永远不会遇到冲突,因为执行的顺序进行序列化的事务日志。
MemSQL不支持主 - 主复制。主 - 主设计有负面的权衡:丢失数据的一致性。
MemSQL还支持同步复制。不足之处是更高的??写入查询延迟。不拖慢读取。
负载平衡的奴隶。
当使用异步复制的奴隶,是几毫秒的后面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值