MemSQL 自称是最快的内存数据库。目前已发布了2.5版本。

MemSQL 具有以下特点

1 高效的并行,尤其是分布式的MemSQL.

2 高效的并发,采用lock-free的内存数据结构skip list 和hash.支持MVCC.

3 查询执行计划编译成C++的形式,可以高效执行并且可以重用

4 支持数据的冗余存储,提高可用性

5 支持重放事物日志的复制

6 支持JSON格式的数据处理

下面来看看Memsql的share-nothing分布式架构

两层架构:分为aggregator 和 leaf
 
     Aggregator 存储元数据,负责分发sql给leaf,然后综合leaf的查询结果。aggregator可以有多个,其中有一个为主aggregator。 主aggregator 还可以执行DDL和负责Leaf的auto-failover.其它普通aggregator 则不行。当主aggregator 失效,可以从其它普通aggregator 选择一个通过sql命令设置为主aggregator 。
     Leaf上存储真正的数据,数据通过主键hash存储到各个leaf节点,leaf之间的数据均匀分布不会倾斜。目前还不支持范围分区。在建库时指定分区数,分区数应该为leaf节点的整数倍,一般设为8倍。每个leaf都是一个分库,分取数据存储在分库的表中。表只持二级索引,同时支持以主键为前缀的唯一索引。
 
两种表类型
    参照表(reference table): 数据分布在主aggregator和每个leaf节点。每个节点的数据都是完整的(没有分区)。参照表同过复制从主aggregator向每个leaf节点同步数据。另外参照表的写只能在主aggregator进行。
    分布表 (sharded table):数据通过hash分片存储在每个leaf节点,每个leaf节点只有部分数据。
 
数据冗余
    可用组(availability group),每个组是一些leaf的集合。组与组之间是冗余存储的。目前最多支持两个组。以两个组为例,每个组都包含完整数据,每个分区表在两个组都有一分copy.可以基于电力和网络条件进行分组。
 
扩展性
     支持动态增删Leaf节点,但需要执行rebalance partitions命令来重新分布分区数据。rebalance 操作都是在线进行的,即操作过程中不影响数据正常访问。rebalance操作的单位是库,最小粒度是 partition.
       下面是leaf节点状态变化图
 
MemSQL兼容mysql协议。支持mysql的ODBC,JDBC及其它语言接口。
 
一些思考

1 支持mysql 协议,使的memsql学习成本较低,同时mysql的ODBC,JDBC可以直接拿来使用,提高了可用性,同时也减少了MemSQL自身的开发成本。
2 redundancy_level目前最高支持2.集群中出现两个Leaf节点同时故障的可能性不是很低。后需应该支持3及以上的level;在redundancy_level为2的情况下,如果一个leaf节点出现故障,对应的冗余节点负载一般会提升一倍,负载不均衡,很可能造成新的故障。
3 availability group是一个很好的分组方式,可以将不同的组放在不同的机房,提高可用性。
4 对于reblance table 操作,可以做到在线的方式进行,感觉难度比较大,但文档中没有看到更详细的实现说明。

参考:

http://www.memsql.com 

 

MemSQL 架构初探的更多相关文章

  1. MemSQL 架构初探(转)

    MemSQL 自称是最快的内存数据库.目前已发布了2.5版本. MemSQL 具有以下特点 1 高效的并行,尤其是分布式的MemSQL. 2 高效的并发,采用lock-free的内存数据结构skip ...

  2. OceanBase 架构初探

    OceanBase 架构初探 原创衣舞晨风 发布于2018-11-13 08:44:14 阅读数 1417  收藏 展开 1.设计思路 OceanBase的目标是支持数百TB的数据量以及数十万TPS. ...

  3. scrapy架构初探

    scrapy架构初探 引言 Python即时网络爬虫启动的目标是一起把互联网变成大数据库.单纯的开放源代码并不是开源的全部,开源的核心是"开放的思想",聚合最好的想法.技术.人员, ...

  4. 云原生时代, Kubernetes 多集群架构初探

    为什么我们需要多集群? 近年来,多集群架构已经成为“老生常谈”.我们喜欢高可用,喜欢异地多可用区,而多集群架构天生就具备了这样的能力.另一方面我们也希望通过多集群混合云来降低成本,利用到不同集群各自的 ...

  5. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  6. React Native For Android 架构初探

    版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qclo ...

  7. Scrapy的架构初探

    Scrapy,Python开发的一个web抓取框架. 1,引言 Python即时网络爬虫启动的目标是一起把互联网变成大数据库.单纯的开放源代码并不是开源的全部,开源的核心是“开放的思想”,聚合最好的想 ...

  8. DDD「领域驱动设计」分层架构初探

    前言 基于 DDD 传统分层架构实现. 项目 github地址:https://github.com/WuMortal/DDDSample 这个分层架构是工作中项目正在使用的分层架构,使用了一段时间发 ...

  9. Android架构初探

    #一 背景点评美团合并之后,业务需要整合,我们部门的几条业务需要往美团平台迁移,为了降低迁移成本,开发和维护成本,以及将来可能要做的单元测试,需要对架构进行相应的调整.之前的代码都堆在Activity ...

随机推荐

  1. VisualVM + BTrace

    VisualVM下载地址:http://visualvm.github.io/download.html 解压后打开bin目录下的visualvm.exe 选择Tool-->Plugins,选择 ...

  2. 分步理解 Promise 的实现

    一个 Promise 的运用: var firstPromise = new Promise(function(resolve,reject){ setTimeout(function(){ var ...

  3. css text-align文字两端对齐

    text-align:start | end | left | right | center | justify | match-parent | justify-all justify: 内容两端对 ...

  4. DDA, Bresenham line's algorithm and Voxel Traversal used in the Grid-Accelerator in PBRT

        - DDA(Digital Differential Analyzer, 数值微分法) -    计算机图形学中,经常会遇到一些计算机中”经典“的问题.例如,如何利用计算机”离散“的特质,模拟 ...

  5. 装饰器(Decorator)模式

    1  装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能.通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式.显然,直接修改对应 ...

  6. Spring @ModelAttribute

    正文开始之前,先介绍个东西,Spring能够自动将请求参数封装到对应JavaBean上! 代码比较简单,也没有什么配置要记录,只是开启了<mvc:annotation-driven/>,可 ...

  7. Re:从零开始的Spring Session(一)

    Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了.最近在研究跨域单点登录的实现时,发现对于Session和Cookie的了解,并不是很深入,所以打算写两篇 ...

  8. 30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)

    去年八月时要做一个OA系统为了后台界面而烦恼,后来写了一篇博客(<后台管理UI的选择>)介绍了选择过程与常用后台UI,令我想不到的时竟然有许多开发者与我一样都为这个事情而花费不少时间,最后 ...

  9. MQ单一消息完整流程

    public class QueueManger { private static string QueuePath = @".\private$\{0}"; /// <su ...

  10. Java JDBC的基础知识(四)

    之前学习了如何创建一个数据库工具类,如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...