VoltDB数据库是一个分布式,可扩展,shared-nothing的内存数据库。使用JAVA 写的存储过程来定义事务。使用标准SQL访问数据,使用并行的单线程处理方式确保数据一致性,同时避免了传统数据库的锁,插销,资源管理开销。

VoltDB具有如下特点:

高吞吐量:百万次每秒

横向拓展:可以根据需求自由拓展,性能线性增长。

高可用性:数据支持副本、也可以持久化保存、除此之外,还支持双活机制。

实时数据分析:数据实时性高,因为都是内存计算。

完整ACID支持,保证事务性和可靠性。

VoltDB的设计动机来源于内存成本的大幅下降,系统对于数据的时效性要求越来越高,而传统数据库由于数据在本地文件保存,所以不论并发还是处理速度,都难以满足要求。而新型的NoSQL数据库,又缺乏SQL支持以及完整的ACID的支持,完全无法提单传统数据库。

VoltDB、NoSQL和传统关系型数据库的对比如下所示:

VoltDB、NoSQL和传统关系型数据库的对比

适用场景

VoltDB适合OLTP系统,单个事务较小,但是事务总量非常之多的应用。比如金融,零售,WEB2.0等传统OLTP应用。不适合进行范围查询或者频繁多表Join这样的场景。

设计思路

高吞吐量、实时性

VoltDB通过对传统数据库进行分析,发现数据只有12%的CPU时间在做真正有意义的数据操作,而其他绝大部分时间都被缓存,并发控制等步骤消耗了。

传统数据库性能消耗分析

索引管理(Index Management):数据库的索引一般是基于B树的,这些索引会显著消耗IO和CPU。

日志(Logging):传统数据库一般会写两次日志,一个是数据库数据存储部分,一个是数据库恢复日志,而且这些操作都必须强制性刷到磁盘上去,这就带来显著的IO消耗。

锁(Locking):数据的读写操作都会涉及到锁,这是一个十分频繁的操作。

锁管理器(Latching):全局共享的数据比如索引数据,表元数据,资源信息等,都必须保障多线程环境下的可靠运行,所以这种锁管理器无疑会消耗更多的CPU资源。

缓存管理(Buffer Management):数据存储在固定大小的磁盘页中,缓冲池则管理着这些磁盘页,这些都会来言密集的IO操作。

综上,有88%的CPU时间都浪费在这些对于实际操作无意义的步骤上去了,要提升数据库性能,只有从根本上减少这种冗余的步骤,集中进行数据运算,才能完全利用CPU。

VoltDB通过内存存储、数据分区和无锁计算来实现高性能运算。

内存存储

VoltDB所有数据都保存在内存中(可靠性中会有数据刷到磁盘,见VoltDB ACID中可靠性设计), 内存存取速度已经比磁盘远远高出几个数量级了,这就是VoltDB高性能的重要原因。

数据分区

VoltDB对每个节点的内存进行管理,在每个节点上创建多个分区,所有分区表中的数据,都分散在各个分区中,然后在读写的时候,就可以实现多个分区并发进行,所以拓展性是线性提升的。

这种分区机制也会带来问题,当集群需要扩容的时候,需要停止整个集群,然后再进行扩容;当集群启动的时候,VoltDB会重新调整数据分布,在所有数据分布调整完毕之后,才开始提供服务。

无锁计算

VoltDB数据分区存放,在执行SQL语句的时候,客户端就会根据条件自动判断数据在哪个分区中,然后下发至该分区执行。如果查询条件中不包含分区列,那么就会由客户端进行统一控制,在每个分区上都进行查询之后,再统一返回结果,这种场景会极大影响性能。

VoltDB的程序都是以存储过程的方式执行的,支持使用java或者其他语言定义存储过程。每个分区的存储过程执行都是单线程线性执行的,这就保证了单分区的无锁设计。当一个语句涉及到多个区分协调读写的时候,VoltDB会在协调,统一锁定分区队列,等该语句执行完毕之后,才会释放锁。所以多分区操作才会如此消耗性能。

VoltDB在分区管理上,建议每个物理CPU创建一个分区,这样单个分区内的数据都在CPU的一级缓存和二级缓存上,避免在多个CPU之间的数据操作,最大限度的提升CPU利用率,避免并发锁。所以理论上,VoltDB的CPU使用率是可以达到100%的。

横向拓展

VoltDB多分区设计,使得数据分散在各个分区中,每个分区可以提供并发访问,既提升了性能,也达到了无锁的效果。所以理论上,VoltDB的横向拓展可以使得性能得到线性提升。

高可用性

VoltDB使用K-safety、双活、snapshot、WAL机制组合机制保证数据的高可用性。

K-Safety

其实就是N+1的副本机制,VoltDB在写数据操作的时候,会在每个副本中执行该语句,这样就可以保证数据被正确插入每个副本。这N+1的副本都可以同时提供访问,同时允许最多N个副本丢失(分区故障), 当N+1个副本都不可用的时候,VoltDB就会停止服务进行修复。

双活

多集群双活机制,两个集群都可以提供服务,数据在多分区之间异步复制,当一个集群挂了的时候,另外一个集群提供服务,当异常集群恢复之后,会自动进行数据同步,只有数据一致的时候,才会提供服务。但是这种机制其实还是有问题,有可能导致数据不一致,因此同步复制机制还是需要的。

Snapshot

由于数据在内存中存放,当节点掉电的时候,数据就会丢失,所以VoltDB会定期对每个分区数据做快照,以备节点掉电时候进行恢复。

WAL

Write ahead log,VoltDB会在对数据进行插入操作的时候,预先进行写日志操作,这个和传统数据库一样,但是由于是顺序写入,所以性能还是比传统数据库要好很多。

Snapshot机制和WAL机制会导致造成性能5%左右的下降,不过这个也是为了完整ACID不得不做出的牺牲。

分区表和复制表

分区表

创建表之后,需要手工执行分区语句为表进行分区。

PARTITION TABLE towns ON COLUMN state_num;

该语句表明使用state_numn字段为towns表进行分区。之后插入数据的时候,VoltDB会自动将数据插入指定分区。

目前VoltDB只支持Hash分区,后续可能会考虑支持范围分区。

VoltDB的分区是一个逻辑上的概念,一个分区中可能包含多个表的多个数据分区的数据。VoltDB建议按照物理CPU的数量进行分区,每个分区独立使用一个CPU,这样可以避免CPU之间的锁竞争。

复制表

一个表,没有指定分区,那么就是一个复制表。这个表的特征就是会在每个分区保存一份全量副本,这样在和其他表在做Join查询的时候,就不会跨节点查询,大大加快Join速度。

复制表适合于数据比较稳定,只有少量更新的场景。如果数据要更新,就意味着要在每个分区上都执行一次插入操作,这种操作会显著降低系统并发度。

性能

VoltDB 宣称具备非常高的可伸缩性,超过 120 个分区、39台服务器,可在 300 个 CPU 核心上每秒钟处理 160 万的复杂事务

VoltDB在资料中有一个和数据库进行的性能对比,结果如下:

Dell R610, 2x 2.66Ghz Quad-Core Xeon 5550 with 12x 4GB (48GB) DDR3-1333 Registered ECC DIMMs, 3x 72GB 15K RPM 2.5in Enterprise SAS 6GBPS Drives

VoltDB性能对比

ACID

原子性(Atomicity)

VoltDB通过使用存储过程来确保原子性,一个存储过程执行必须等待前一个存储过程成功或因为失败而回滚结束。

一致性(Consistency)

VoltDB强数据类型约定,在所有的数据库查询中强制schema与数据类型约束.

隔离性(Isolation)

VoltDB事务全局(所有被影响的分区)顺序执行(没有交叉)(任何一个分区同一时间只有一个执行,即串行的)。

持久性(Durability)

VoltDB提供K-safely机制以及snapshot,确保数据持久化。

License

License为AGPL,该许可比GPL要求更加严格,产品即使以WEB的方式发布了,也必须公开源代码。在使用的时候需要小心。

本文来自CSDN博客:http://blog.csdn.net/ransom0512

纯java分布式内存数据库_高性能分布式内存数据库VoltDB介绍相关推荐

  1. python分布式框架_高性能分布式执行框架——Ray

    Ray是UC Berkeley RISELab新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室 ...

  2. redis cluster 分布式锁_关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁...

    首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在j ...

  3. mysql 分布式锁_【分布式锁的演化】分布式锁居然还能用MySQL?

    前言 之前的文章中通过电商场景中秒杀的例子和大家分享了单体架构中锁的使用方式,但是现在很多应用系统都是相当庞大的,很多应用系统都是微服务的架构体系,那么在这种跨jvm的场景下,我们又该如何去解决并发. ...

  4. 分布式事务_实施分布式锁概述

    分布式事务 众所周知,锁通常用于监视和控制多个线程同时访问共享资源. 它们基本上保护并发应用程序中的数据完整性和原子性,即,一次只能有一个线程可以获取共享资源上的锁,否则将无法访问该锁. 但是在分布式 ...

  5. 分布式文件系统_新一代分布式文件系统XGFS揭秘——元数据服务

    新一代分布式文件存储系统XGFS,基于最新一代NVMe/SCM存储介质设计,利用高性能LSM存储引擎,结合XSKY独有专利技术的键值设计,构建出完全自主的元数据服务-本文系揭秘XGFS系列之首篇内容. ...

  6. java 解析器_高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  7. java mina性能_高性能Java网络框架 MINA

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...

  8. java lambda表达式_高性能的 Lambda 表达式,简洁优雅图文并茂

    来源:知乎 Mingqi 链接:https://www.zhihu.com/question/20125256/answer/324121308 有网友问,Lambda 表达式有何用处?如何使用?在P ...

  9. java 内存管理_高性能Java代码之内存管理

    本文通过几个方面,来介绍Java代码的内存管理. 有的代码,GC根本就回收不了,直接系统挂掉.GC是一段程序,不是智能,他只回收他认为的垃圾,而不是回收你认为的垃圾. GC垃圾回收: Grabage ...

最新文章

  1. 使用ModelBinder自动过滤获取Model值的空格
  2. rtti获取类的字段和属性和方法
  3. linux中dump文件怎么生成,linux下设置core dump文件生成的方法
  4. MySQL数据库中如何使用rand随机查询记录
  5. Golang-import-introduce
  6. android 检测网络ftp,Android端与Android端利用WIFI进行FTP通信
  7. 安装cifs 访问windows的共享文件
  8. 如何在div中垂直对齐图像
  9. 01-微信小程序商城 商城框架的制作(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  10. SAP计划策略40测试
  11. 关于程序员的非技术面试题全在这里。
  12. 微信 android 闪退问题怎么解决方法,安卓微信闪退怎么办,教你三种方法快速解决...
  13. JDBC简单连接查询MySQL数据库
  14. GIF录制工具(免安装)
  15. JAVA WEB技术
  16. LVS(DR)+Keepalive高可用+Zabbix监控脑裂
  17. 开关电源LC滤波器设计
  18. 小萌库 - 2014世界足球杯全程精彩回顾
  19. 计算机网络 课程复习大纲
  20. 怎么在桌面上显示计算机和控制面板图标,W7系统怎么在桌面上显示控制面板图标...

热门文章

  1. vue3 + ts + pinia + vite + vueRouter4的基本配置和使用
  2. STL中vector的构造函数
  3. sscanf c语言程序,C语言 sscanf用法详解
  4. flutter mbp m1环境搭建
  5. shiro的会话工厂SessionFactory
  6. WeTest----如何查看Wetest生成测试报告?
  7. 【论文笔记_优化_2021】SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION
  8. 上交所科创50ETF期权来了!
  9. Linux中mount:you must specify the filesystem type解决办法
  10. tplink迷你路由器中继模式_TP-link mini(迷你)无线路由器设置(Repeater模式) | 192路由网...