NoSQL

ACID

在传统数据库系统中,事务具有ACID属性(Jim Gray在《事务处理:概念与技术》中对事务进行了详尽的讨论)。

(1)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

(2)一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

(3)隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。

(4)持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

对于单个节点的事务,数据库都是通过并发控制(两阶段封锁,two phase locking或者多版本,multiversioning)和恢复机制(日志技术)保证事务的ACID特性。对于跨多个节点的分布式事务,通过两阶段提交协议(two phase commiting)来保证事务的ACID。

可以说,数据库系统是伴随着金融业的需求而快速发展起来的。对于金融业,可用性和性能都不是最重要的,而一致性是最重要的,用户可以容忍系统故障而停止服务,但绝不能容忍帐户上的钱无故减少(当然,无故增加是可以的)。而强一致性的事务是这一切的根本保证。

Data Replication

数据复制(data replication)属于分布式计算的范畴,它并不仅仅局限于数据库,但这里主要是指分布式数据库的复制。

在多副本构成的分布式数据库系统中,其事务特性与单个数据库系统的差别主要表现在原子性和一致性两个方面。在原子性方面,要求同一分布式事务的所有操作在所有相关副本上要么提交,要么回滚,即除了保证原有的局部事务的原子性,还需要控制全局事务的原子性;在一致性方面,多副本之间需要保证单一副本一致性。

针对分布式事务的原子性和一致性这两个复制协议中的核心问题,经过近20年的研究,人们提出了各种各样的复制协议。这些协议在外在功能和内部实现两方面都有较大的差别。据此,我们可以从这两个大的方面进行分类说明。

从外在功能的角度看,可以从事务执行的地点和时间两个方面进行分类。从事务执行的地点,可以分为两类:主从(Priamry/Copy)方式和更新所有(Update-Anywhere)方式。

前者的处理过程一般是系统中仅仅指定一个Primary节点接受更新请求,在事务操作执行完毕后,在事务提交前或后将操作广播到其他Copy节点。

后者的处理过程稍微复杂,系统中的任何副本具有相同的地位,都可以接收Update请求,在检测事务冲突、事务提交前或后将各个节点的Update传播到其他副本节点。

Primary/Copy方式并发控制较为简单,由Primary本地的事务控制即可实现,事务原子性的实现也较为简单,一般由Primary节点作为协调节点来实现。但是,其缺陷也显而易见:仅仅单个节点提供Update请求处理能力,对于Update密集类型的应用,如OLTP,容易形成单点性能瓶颈。Update-Anywhere方式则与其相辅相成,可以通过多点提高事务吞吐率,但随之而来的是多个分布式事务之间复杂的并发控制和原子性问题。

从事务提交的时间点看,可以分为积极(Eager)和消极(Lazy)两类。其区别在于,前者是在事务提交前传播更新,后者则是在提交之后才将事务操作传播到其他副本。实际上,前者即通常所谓的同步复制(synchronous replication),后者即所谓的异步复制(asynchronous replication)。

异步复制的优点是可以提高响应速度,但牺牲了一致性,一般实现该类协议的算法需要增加额外的补偿机制。同步复制的优点是可以保证一致性(一般通过两阶段提交协议),但是开销较大,可用性不好(参见CAP部分),带来了更多的冲突和死锁等问题。值得一提的是Lazy+Primary/Copy的复制协议在实际生产环境中是非常实用的,MySQL的复制实际上就属于这种。

CAP

在2000年的PODC(Principles of Distributed Computing)会议上,University of California, Berkeley的计算机科学教授Eric Brewer提出了著名的CAP理论。2002年,Seth Gilbert和Nancy Lynch证明了这一理论。CAP指的是:Consistency、Availability和Partition Tolerance。

(1)Consistency(一致性):一致性是指数据的原子性,这种原子性在经典的数据库中是通过事务来保证的,当事务完成时,无论其是成功还是回滚,数据都会处于一致的状态。在分布式环境中,一致性是说多个节点的数据是否一致。

(2)Availability(可用性):可用性是指服务能一直保证是可用的状态,当用户发出一个请求,服务能在有限时间内返回结果。

(3)Partition Tolerance(分区容错性):Partition是指网络的分区。可以这样理解,一般来说,关键的数据和服务都会位于不同的IDC。

CAP理论告诉我们,一个分布式系统不可能同时满足一致性,可用性和分区容错性这三个需求,三个要素中最多只能同时满足两点。三者不可兼顾,此所谓鱼与熊掌不可兼得也!而对于分布式数据系统而言,分区容错性是基本要求,否则就不称其为分布式系统了。因此架构设计师不要把精力浪费在设计如何能同时满足三者的完美分布式系统上,而是应该进行权衡取舍。这也意味着分布式系统的设计过程,也就是根据业务特点在C(一致性)和A(可用性)之间寻求平衡的过程,要求架构师真正理解系统需求,把握业务特点。

BASE

BASE来自于互联网的电子商务领域的实践,它是基于CAP理论逐步演化而来,核心思想是即便不能达到强一致性(Strong consistency),但可以根据应用特点采用适当的方式来达到最终一致性(Eventual consistency)的效果。BASE是Basically Available、Soft state、Eventually consistent三个词组的简写,是对CAP中C&A的延伸。BASE的含义:

(1)Basically Available:基本可用;

(2)Soft-state:软状态/柔性事务,即状态可以有一段时间的不同步;

(3)Eventual consistency:最终一致性;

BASE是反ACID的,它完全不同于ACID模型,牺牲强一致性,获得基本可用性和柔性可靠性并要求达到最终一致性。

CAP、BASE理论是当前在互联网领域非常流行的NoSQL的理论基础。

NoSQL

NoSQL领域的相关知识点参见如下思维导图:

参考

http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed

http://www.cnblogs.com/hustcat/archive/2010/09/07/1820970.html

http://www.cnblogs.com/mmjx/archive/2011/12/19/2290540.html

http://blog.csdn.net/yangbutao/article/details/8365695

http://www.cnblogs.com/me115/p/3835050.html

12306

http://www.csdn.net/article/2015-02-10/2823900

技术揭秘12306改造

https://www.zhihu.com/question/21217971/answer/17575573

超级计算机能不能用于12306?

Clojure

Clojure是Lisp语言在JVM上的实现。源代码以.clj为后缀。

官网:

http://clojure.org/

Clojure的安装主要有两种方法:

1.

sudo apt-get install clojure1.6

2.Clojure的全部功能都被放在clojure-1.8.0.jar中,因此实际上并不需要安装。所谓安装,不过是下载jar,然后让程序能够找到jar即可。因此,更好的办法是利用我们下面提到的leiningen,自动下载相关依赖。

leiningen

leiningen是Clojure的自动管理工具。

官网:

http://leiningen.org/

project.clj是Leigingen为项目添加的配置文件,类似于Maven的pom.xml。

project.clj中可以定义项目所需的Clojure的版本,并自动下载依赖。因此,很多Clojure项目在依赖上,往往只写leiningen和maven,根本就不提Clojure。这一点和其他编程语言,包括同为JVM语言的scala,还是差异挺大的。

Hello World

1.

lein new app hello

2.

cd hello

lein run

这里要注意路径,一定要在project.cl所在的路径下执行lein命令,否则会报如下错误:

No :main namespace specified in project.clj.

参见:

https://tonydeng.github.io/2016/07/19/leiningen-clojure-hello-world/

JavaFX

JavaFX和Clojure的结合,本来不是什么新鲜的东西,然而由于相关环境(JDK、leiningen)的演进,网上的demo已经大多不可用了。

这些变动主要包括:

1.由于JDK7的较新版本之后,JavaFX已经集成到JDK中,因此JavaFX的运行时jar不再需要了。相关依赖需要去除。

2.由于leiningen新版本的改变,现在main函数必须在源代码和工程文件中显式定义。

代码参见:

https://github.com/antkillerfarm/antkillerfarm_rubbish/tree/master/clojure/javafx

NoSQL, Clojure相关推荐

  1. RDBMS vs. NoSQL Clojure概述

    RDBMS vs. NoSQL 合作还是竞争 数据库要解决的主要问题 不管是RDBMS还是NoSQL,在大的方面他们都属于数据库这个范畴,这个范畴之内所要面临的一些共同问题有哪些呢.下面的图是一个大致 ...

  2. NoSQL数据库-MongoDB和Redis

    NoSQL数据库-MongoDB和Redis   发布于2012-12-20,来源:比特网   1NoSQL简述 CAP(Consistency,Availabiity,Partitiontolera ...

  3. Facebook Architecture @ QCon Next Month: Infrastructure, HTML5, NoSQL, OO Design

    From Palo Alto to London, next month's QCon London will feature four of Facebook's finest engineers, ...

  4. NOSQL系列-Redis精简版安装与Ruby测试

    简介:Redis是一个NOSQL数据库,它是一款key-values存储型数据库,也叫"memcached改进版",它不同与memcached最大特点是它由内存+硬盘来存储数据的, ...

  5. nosql非关系型数据库_从Datomic出发,革命性的非NoSQL数据库

    nosql非关系型数据库 我终于设法了解了当今最不寻常的数据库之一,Datomic,并希望与您分享. 感谢Stuart Halloway和他的工作室! 为什么?!? 我们很快就会看到,Datomic与 ...

  6. 几种开源NOSQL数据库

    几种开源NOSQL数据库 2017年06月30日 23:36:13 lm_y 阅读数 13655更多 分类专栏: java 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  7. 图形数据库、NOSQL和Neo4j

    简介 在众多不同的数据模型里,关系数据模型自80年代就处于统治地位,而且有不少实现,如Oracle.MySQL和MSSQL,它们也被称为关系数据库管理系统(RDBMS).然而,最近随着关系数据库使用案 ...

  8. 15个nosql数据库

    1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...

  9. 开源NoSQL数据库介绍

    目录 一.概述 二.NoSQL数据库 1. MongoDB 2. Cassandra 3. CouchDB 4. Hypertable 5. Redis 6. Riak 7. Neo4j 8. Had ...

最新文章

  1. linux内核编译 menuconfig详解,Linux内核编译menuconfig介绍
  2. 栈的应用-四则运算表达式
  3. presentViewController 动画处理
  4. mysql 5.6 linux安装配置_linux手动安装配置mysql5.6
  5. (3)vue.js安装
  6. 解决gensim fasttext官方案例报错TypeError: Either one of corpus_file or corpus_iterable value must be provide
  7. 【Kafka】Kafka 修改某个消费组的偏移量
  8. 计算机平面设计论文范,计算机平面设计论文关于计算机平面设计中汉字艺术论文范文参考资料...
  9. c ringbuffer 源码_Python Ring Buffer的实现
  10. 基于变步长扰动观察法的最大功率点跟踪
  11. stata15中文乱码_如何解决Stata14的中文乱码问题
  12. vue结合vue-amap调用高德地图行政区划分并添加标记点
  13. 计算机资源管理菜单包括哪些,资源管理器文件菜单有哪些命令,资源管理器命令...
  14. 微信小游戏排行榜制作(主域子域)
  15. Win32 API 概论
  16. 小武学fpgaStep2
  17. python下求特征向量与特征值
  18. 各种友(e)善(xin)数论总集(未完待续),从入门到绝望
  19. 流畅稳定免费的LinuxMint20.1桌面系统安装调试讲解
  20. 如何构建n*n二维矩阵并转变为一维一一对应矩阵

热门文章

  1. 了解冒泡排序选择排序
  2. Ajax拿取html格式数据
  3. putty连接Linux
  4. 每输入四个字符添加一个中划线
  5. java获取服务器状态_获取远程服务器上 Java 进程的运行状态
  6. Linux/U-Boot Git Repo
  7. phpStorm安装xDebug
  8. freebsd镜像作用和vmware服务开启
  9. extjs插件开发上传下载文件简单案例
  10. Nginx学习笔记(七) 创建子进程