精华内容
下载资源
问答
  • NoSQL数据库压测工具

    千次阅读 2017-09-03 16:31:38
    内置了对常见NoSQL数据库和数据网格产品的支持,如Cassandra、MongoDB、Hbase、Redis、Infinispan等等很多的主流产品,而且不仅安装使用简单,还能自由扩展测试数据类型和支持的数据库产品。 参考链接 使用YCSB...

    YCSB全称为“Yahoo!Cloud Serving Benchmark”。内置了对常见NoSQL数据库和数据网格产品的支持,如Cassandra、MongoDB、Hbase、Redis、Infinispan等等很多的主流产品,而且不仅安装使用简单,还能自由扩展测试数据类型和支持的数据库产品。

    参考链接

    使用YCSB测试MongoDB的微分片性能

    http://www.mongoing.com/tj/microshard-ycsb

    展开全文
  • noSql

    2012-11-22 14:53:00
    这些被称为NoSQL工具,在存储数据的方式上,提供了一与(基于SQL语言的)关系型数据库截然不同的思路。要想了解NoSQL,必须先了解现有的这些工具,去理解那些引导它们开拓出新的存储领域的设计思路。 NoSQL其.....

    引用:http://www.programmer.com.cn/9276/

    何为NoSQL?NoSQL不是一个工具,而是由一些具有互补性和竞争性的工具组成的一个概念,是一个生态圈。这些被称为NoSQL的工具,在存储数据的方式上,提供了一种与(基于SQL语言的)关系型数据库截然不同的思路。要想了解NoSQL,必须先了解现有的这些工具,去理解那些引导它们开拓出新的存储领域的设计思路。

    NoSQL其名

    在给NoSQL下定义之前,我们先来试着从它的名字上做一下解读。顾名思义,NoSQL系统的数据操作接口应该是非SQL类型的。但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为Not Only SQL,即NoSQL提供了一种与传统关系型数据库不同的存储模式,这为开发者提供了关系型数据库之外的另一种选择。

    NoSQL的启示

    NoSQL运动受到了很多相关研究论文的启示,在所有资料中,最核心的有两个:Google的BigTable论文和Amazon的Dynamo论文。

    特性概述

    NoSQL系统舍弃了一些SQL标准中的功能,取而代之的是一些简单灵活的功能。NoSQL的构建思想就是尽量简化数据操作,尽量让操作的执行效率可预估。当你去考查一个NoSQL系统时,下面的几点是值得注意的。

    • 数据模型及操作模型:你的应用层数据模型是行、对象还是文档型的呢?这个系统是否能支持你进行一些统计工作呢?
    • 可靠性:当你更新数据时,新的数据是否立刻写到持久化存储中去了?新的数据是否同步到多台机器上了?
    • 扩展性:你的数据量有多大,单机是否能容下?你的读写量需求单机是否能支持?
    • 分区策略:考虑到对扩展性、可用性或者持久性的要求,你是否需要一份数据被存在多台机器上?你是否需要知道或者说你能否知道数据在哪台机器上?
    • 一致性:你的数据是否被复制到了多台机器上?这些不同节点的数据如何保证一致性?
    • 事务机制:业务是否需要ACID事务机制?
    • 单机性能:如果你打算持久化的将数据存在磁盘上,哪种数据结构能满足你的需求(你的需求是读多还是写多)?写操作是否会成为磁盘瓶颈?
    • 负载可评估:对于一个读多写少的应用,诸如响应用户请求的网络应用,我们总会花很多精力来关注负载情况。你可能需要进行数据规模的监控,对多个用户的数据进行汇总统计。你的应用场景是否需要这样的功能呢?

    NoSQL数据模型及操作模型

    数据库的数据模型指的是数据在数据库中的组织方式,数据库的操作模型指的是存取这些数据的方式。通常数据模型包括关系模型、键值模型以及各种图结构模型。操作语言可能包括SQL、键值查询及MapReduce等。NoSQL通常结合了多种数据模型和操作模型,提供不一样的架构方式。

    基于Key值存储的NoSQL数据模型

    在键值型系统中,复杂的联合查询以及满足多个条件的数据查询操作就不那么容易实现了,需要换一种思维来建立和使用键名。比如要获取部门号为20的所有员工的信息,应用层可以先获取Key为employee_departments:20的这个列表,然后再循环地拿这个列表中的ID通过获取employee:ID得到所有员工的信息。

    • Key-Value存储

    Key-Value存储可以说是最简单的NoSQL存储,每个Key值对应一个任意的数据值。对NoSQL系统来说,这个任意的数据值是什么,它并不关心。比如在员工信念数据库里,employee:30这个Key对应的可能就是一段包含员工所有信息的二进制数据。这个二进制的格式可能是Protocol Buffer、Thrift或者Avro都无所谓。

    • Key-结构化数据存储

    Key-结构化数据存储的典型代表是Redis,Redis将Key-Value存储的Value变成了结构化的数据类型。Value的类型包括数字、字符串、列表、集合以及有序集合。除了set/get/delete操作以为,Redis还提供了很多针对以上数据类型的特殊操作,比如针对数字可以执行增、减操作,对list可以执行push/pop操作,通过提供这种针对单个Value进行的特定类型的操作,Redis可以说实现了功能与性能的平衡。

    • Key-文档存储

    Key-文档存储的代表有CouchDB、MongoDB和Riak。这种存储结构下Key-Value的Value是结构化的文档,通常这些文档是被转换成JSON或者类似于JSON的结构进行存储。文档可以存储列表,键值对以及层次结构复杂的文档。

    • BigTable的列簇式存储

    HBase和Cassandra的数据模型都借鉴自Google的BigTable。这种数据模型的特点是列式存储,每一行数据的各项被存储在不同的列中(这些列的集合称作列簇)。而每一列中每一个数据都包含一个时间戳属性,这样列中的同一个数据项的多个版本都能保存下来。

    列式存储可以这样理解:将行ID、列簇号,列号以及时间戳一起,组成一个Key,然后将Value按Key的顺序进行存储。Key值的结构化使这种数据结构能够实现一些特别的功能,最常用的就是将一个数据的多个版本存成时间戳不同的几个值,这样就能方便地保存历史数据。这种结构也能天然地进行高效的松散列数据(在很多行中并没有某列的数据)存储。当然,对于那些很少有某一行有NULL值的列,由于每一个数据必须包含列标识,这又会造成空间的浪费。

    图结构存储

    图结构存储是NoSQL的另一种存储实现。其指导思想是:数据并非对等的,关系型的存储或者键值对的存储,可能都不是最好的存储方式。图结构是计算机科学的基础结构之一,Neo4j和HyperGraphDB是当前最流行的图结构数据库。

    复杂查询

    在NoSQL存储系统中,有很多比键值查找更复杂的操作。比如MongoDB可以在任意数据行上建立索引,可以使用Javascript语法设定复杂的查询条件。BigTable型的系统通常支持对单独某一行的数据进行遍历,允许对单列的数据进行按特定条件的筛选。CouchDB允许你创建同一份数据的多个视图,通过运行MapReduce任务来实现一些更为复杂的查询或者更新操作。很多NoSQL系统都支持与Hadoop或者其他MapReduce框架结合来进行一些大规模数据分析工作。

    事务机制

    与关系型数据库不同的是,NoSQL系统通常注重性能和扩展性,而非事务机制。传统的SQL数据库的事务通常都是支持ACID的强事务机制。ACID的支持使得应用者能够很清楚他们当前的数据状态。对很多NoSQL系统来说,对性能的考虑远在ACID的保证之上。通常NoSQL系统仅提供行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行时是会串行的,保证了每一个Key-Value对不会被破坏。

    Schema-free的存储

    还有一个很多NoSQL的共同点,就是它通常并没有强制的数据结构约束。即使是在文档型存储或者列式存储上,也不会要求某一个数据列在每一行数据上都必须存在。

    数据可靠性

    最理想的状态是,数据库会把所有写操作立刻写到持久化存储的设备,同时复制多个副本到不同地理位置的不同节点上,以防止数据丢失。但这种对数据安全性的要求对性能是有影响的,所以不同的NoSQL系统在自身性能的考虑下,在数据安全上采取了不太一样的策略。

    单机可靠性

    单机可靠性理解起来非常简单,它的定义是写操作不会由于机器重启或者断电而丢失。通常单机可靠性的保证是通过把数据写到磁盘来完成的,而这通常会造成磁盘I/O成为整个系统的瓶颈。下面我们谈谈一些在单机可靠性的保证下提高性能的方法。

    • 控制fsync的调用频率

    Redis提供了几种对fsync调用频率的控制方法。应用开发者可以配置Redis在每次更新操作后都执行一次fsync,这样会比较安全,当然也就比较慢。Redis也可以设置成N秒种调用一次fsync,这样性能会更好一点。但这样的后果就是一旦出现故障,最多可能导致N秒内的数据丢失。而对一些可靠性要求不太高的场合(比如仅仅把Redis当Cache用的时候),应用开发者甚至可以直接关掉fsync的调用:让操作系统来决定什么时候需要把数据flush到磁盘(译者注:这只是Redis append only file的机制,Redis是可以关闭aof日志的,另外,Redis本身支持将内存中数据dump成rdb文件的机制,和上面说的不是一回事)。

    • 使用日志型的数据结构

    Cassandra、HBase、Redis和Riak都会把写操作顺序的写入到一个日志文件中。相对于存储系统中的其他数据结构,上面说到的日志文件可以频繁地进行fsync操作,这样就把对磁盘的随机写变成顺序写了。

    • 通过合并写操作提高吞吐性能

    Cassandra有一个机制,它会把一小段时间内的几个并发的写操作放在一起进行一次fsync调用,这种做法叫group commit。

    多机可靠性

    由于硬件层面有时会造成无法恢复的损坏,单机可靠性的保证在这时就鞭长莫及了。对于一些重要数据,跨机器做备份保存是必备的安全措施。一些NoSQL系统提供了多机可靠性的支持。

    • Redis采用传统的主从数据同步的方式。
    • MongoDB提供了一种叫Replica Sets高可用架构。
    • Riak、Cassandra和Voldemort提供了一些更灵活的可配置策略,并提供一个可配置的参数N,代表每一个数据会被备份的份数。为了应对整个数据中心出现故障的情况,需要实现跨数据中心的多机备份功能。

    横向扩展带来性能提升

    横向扩展的目标是达到线性的效果,即如果你增加一倍的机器,那么负载能力应该也能相应的增加一倍。其主要需要解决的问题是如何让数据在多台机器间分布,这里面涉及到分片技术。

    分片的意思,就是没有任何一台机器可以处理所有写请求,也没有任何一台机器可以处理对所有数据的读请求。下面我们将会对hash分片和范围分片两种分片方式进行描述。

    如非必要,请勿分片

    分片会导致系统复杂程度大增,所以,如果没有必要,请不要使用分片。普通情况下,我们可以使用读写分离和构建缓存的方式来缓解我们的数据读压力。但如果写操作达到单点无法承担的程度,那我们可能就真的需要进行分片了。

    通过协调器进行数据分片

    一种分片策略是通过引入一个中间代理层来实现,该代理层记录数据在各个节点的分布状况,所有读写请求都通过代理层来做路由。比如与CouchDB的两个项目:Lounge和BigCouch。类似的,Twitter自己也实现了一个叫Gizzard的协调器,可以实现数据分片和备份功能。

    一致性hash环算法

    一致性hash是一种被广泛应用的技术,其最早在一个叫distributed hash tables(DHTs)的系统中进行使用。那些类Dynamo的应用,比如Cassandra、Voldemort和Riak,基本上都使用了一致性hash环算法。

    如图1所示,一致性hash环算法有一个hash函数H,所有存储数据的节点和数据本身都可以通过这个函数算出一个hash值,作为自己在下面环上的位置。然后每个节点会负责存储其hash值到下一个节点间的所有数据的存储。这样使得即使节点数变化了,大部分数据并不需要进行迁移。

    图1 一致性hash环算法的hash函数

    图1 一致性hash环算法的hash函数

    连续范围分区

    使用连续范围分区的方法进行数据分片,需要我们保存一份映射关系表,标明哪一段Key值对应存在哪台机器上。与一致性hash类似,连续范围分区会把Key值按连续的范围分段,每段数据会被指定保存在某个节点上,然后会被冗余备份到其他节点。

    • BigTable的处理方式

    Google BigTable论文中描述了一种范围分区方式,它将数据切分成一个个的tablet数据块。每个tablet保存一定数量的键值对。然后存储在Tablet 服务器上。tablet块的大小会保持在一定范围,太大的块会分裂成两个,太小的块又会合并成一个。BigTable通过一个叫Chubby的模块来实现节点状态检测。类似的在Hadoop中有一个叫ZooKeeper的工具实现此功能。

    一致性

    上面讲到了通过将数据冗余存储到不同的节点来保证数据安全和减轻负载,下面我们来看看这样做引发的一个问题:保证数据在多个节点间的一致性是非常困难的。在多个点间保持数据的一致性的问题,也就是本章的主题。下面我们首先来看一下在著名的CAP理论。

    • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
    • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
    • 分区容忍性(P):集群中的某些节点在无法联系后,集群整体是否还能继续进行服务。

    而CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。再加之当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。结果就是我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。

    对一致性的保证,通常有强一致性和弱一致性的选择,而在弱一致性里,又以最终一致性的实现较为普遍。

    如果我们采用NRW的设定,N为数据需要备份的份数,R为读操作需要读到的不同节点上的数据份数,W为写操作需要成功写到不同节点的数据份数,那么当R+W>N时,既是强一致性的保证,当R+W<N时,就是弱一致性。在弱一致性中,可以通过vector clock多版本控制等方法,来实现数据的最终一致性。

    写在最后的话

    目前NoSQL系统来处在它的萌芽期,我们上面讨论到的很多NoSQL系统,它们的架构、设计和接口可能都会改变。本章的目的,不在于让你了解这些NoSQL系统目前是如何工作的,而在于让你理解这些系统之所以这样实现的原因。NoSQL系统把更多的设计工作留给了应用开发工作者来做。理解上面这些组件的架构,不仅能让你写出下一个NoSQL系统,更让你对现有系统应用得更好。

    (编者注:本文根据NoSQLFan网站原载同名文章http://blog.nosqlfan.com/html/2171.html整理而成,英文原文链接为http://www.aosabook.org/en/nosql.html)

    展开全文
  • NoSQL

    2017-08-17 15:54:09
    前言    转载自:... ...NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

    前言

     

     转载自:https://baijiahao.baidu.com/po/feed/share?wfr=spider&for=pc&context=%7B"sourceFrom"%3A"bjh"%2C"nid"%3A"news_3690540158463624329"%7D

     

    NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

     

    现代计算系统每天在网络上都会产生庞大的数据量。这些数据有很大一部分是由关系型数据库管理系统(RDBMSs)来处理,其严谨成熟的数学理论基础使得数据建模和应用程序编程更加简单。

     

    但随着信息化的浪潮和互联网的兴起,传统的RDBMS在一些业务上开始出现问题。首先,对数据库存储的容量要求越来越高,单机无法满足需求,很多时候需要用集群来解决问题,而RDBMS由于要支持join,union等操作,一般不支持分布式集群。其次,在大数据大行其道的今天,很多的数据都“频繁读和增加,不频繁修改”,而RDBMS对所有操作一视同仁,这就带来了优化的空间。另外,互联网时代业务的不确定性导致数据库的存储模式也需要频繁变更,不自由的存储模式增大了运维的复杂性和扩展的难度。

     

    NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。这类数据库主要有这些特点:非关系型的、分布式的、开源的、水平可扩展的。最初的目的是为了大规模web 应用。NoSQL 的拥护者们提倡运用非关系型的数据存储,通常的应用如下特点:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。

     

    笔者是MongoDB用户,也使用过Redis。关系型数据库使用过MySQL与Oracle,对两者的区别有一定的体会。Mongo和Redis的操作都非常简单,速度很快,很多用SQL需要很多条语句的操作在NoSQL数据库中都是2句以内完成。另外NoSQL配置cluster也很容易,且可以随时更改partition和replication的数量,Mongo的新版本还内置了MapReduce操作,使其有了做大数据分析的能力。

     

    NoSQL理论基础

     

    1.关系型数据库理论 - ACID

     

     

     

    ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

     

    A – Atomicity – 原子性

     

    一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有被执行过一样。

     

    C – Consistency – 一致性

     

    在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

     

    I – Isolation – 隔离性

     

    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

     

    D – Durability – 持久性

     

    事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

     

    关系型数据库严格遵循ACID理论。但当数据库要开始满足横向扩展、高可用、模式自由等需求时,需要对ACID理论进行取舍,不能严格遵循ACID。以CAP理论和BASE理论为基础的NoSQL数据库开始出现。

     

    2.分布式系统理论

     

    2.1 分布式系统介绍

     

    分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。分布式是NoSQL数据库的必要条件。

     

    分布式系统由独立的服务器通过网络松散耦合组成的。每个服务器都是一台独立的PC机,服务器之间通过内部网络连接,内部网络速度一般比较快。因为分布式集群里的服务器是通过内部网络松散耦合,各节点之间的通讯有一定的网络开销,因此分布式系统在设计上尽可能减少节点间通讯。此外,因为网络传输瓶颈,单个节点的性能高低对分布式系统整体性能影响不大。比如,对分布式应用来说,采用不同编程语言开发带来的单个应用服务的性能差异,跟网络开销比起来都可以忽略不计。

     

    因此,分布式系统每个节点一般不采用高性能的服务器,而是使用性能相对一般的普通PC服务器。提升分布式系统的整体性能是通过横向扩展(增加更多的服务器),而不是纵向扩展(提升每个节点的服务器性能)实现。

     

    分布式系统最大的特点是可扩展性,它能够适应需求变化而扩展。企业级应用需求经常随时间而不断变化,这也对企业级应用平台提出了很高的要求。企业级应用平台必须要能适应需求的变化,即具有可扩展性。比如移动互联网2C应用,随着互联网企业的业务规模不断增大,业务变得越来越复杂,并发用户请求越来越多,要处理的数据也越来越多,这个时候企业级应用平台必须能够适应这些变化,支持高并发访问和海量数据处理。分布式系统有良好的可扩展性,可以通过增加服务器数量来增强分布式系统整体的处理能力,以应对企业的业务增长带来的计算需求增加。

     

    2.2 分布式存储的问题 – CAP理论

     

    如果我们期待实现一套严格满足ACID的分布式事务,很可能出现的情况就是系统的可用性和严格一致性发生冲突。在可用性和一致性之间永远无法存在一个两全其美的方案。由于NoSQL的基本需求就是支持分布式存储,严格一致性与可用性需要互相取舍,由此延伸出了CAP理论来定义分布式存储遇到的问题。

     

    CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)、分区容错性(P:Partitiontolerance)这三个基本需求,并且最多只能满足其中的两项。

     

    对于一个分布式系统来说,分区容错是基本需求,否则不能称之为分布式系统。因此架构师需要在C和A之间寻求平衡。

     

     

    C – Consistency – 一致性(与ACID的C完全不同)

     

    一致性是指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。

     

    对于一致性,可以分为从客户端和服务端两个不同的视角。

     

    从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。

     

    从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。

     

    从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

     

    A – Availability – 可用性

     

    可用性是指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。

     

    对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。也就是说,该系统使用的任何算法必须最终终止。当同时要求分区容忍性时,这是一个很强的定义:即使是严重的网络错误,每个请求必须完成。

     

    好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。在通常情况下,可用性与分布式数据冗余、负载均衡等有着很大的关联。

     

    P – Partition tolerance – 分区容错性

     

    分区容错性是指“the system continues to operate despite arbitrary message loss or failureof part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

     

    分区容错性和扩展性紧密相关。在分布式应用中,可能因为一些分布式的原因导致系统无法正常运转。好的分区容错性要求能够使应用虽然是一个分布式系统,但看上去却好像是一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其它剩下的机器还能够正常运转满足系统需求,或者是机器之间有网络异常,将分布式系统分隔成未独立的几个部分,各个部分还能维持分布式系统的运作,这样就具有好的分区容错性。

     

    CA without P

     

    如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。

     

    CP without A

     

    如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。

     

    AP without C

     

    要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。

     

    CAP理论定义了分布式存储的根本问题,但并没有指出一致性和可用性之间到底应该如何权衡。于是出现了BASE理论,给出了权衡A与C的一种可行方案。

     

    2.3 权衡一致性与可用性 - BASE理论

     

    Base = Basically Available + Soft state + Eventuallyconsistent 基本可用性+软状态+最终一致性,由eBay架构师DanPritchett提出。Base是对CAP中一致性A和可用性C权衡的结果,源于提出者自己在大规模分布式系统上实践的总结。核心思想是无法做到强一致性,但每个应用都可以根据自身的特点,采用适当方式达到最终一致性。

     

    BA - Basically Available - 基本可用

     

    基本可用。这里是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心功能或者当前最重要功能可用。对于用户来说,他们当前最关注的功能或者最常用的功能的可用性将会获得保证,但是其他功能会被削弱。

     

    S – Soft State - 软状态

     

    允许系统数据存在中间状态,但不会影响到系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步时存在延时。

     

    E - Eventually Consistent - 最终一致性

     

    要求系统数据副本最终能够一致,而不需要实时保证数据副本一致。最终一致性是弱一致性的一种特殊情况。最终一致性有5个变种:

     

    因果一致性

     

    读己之所写(因果一致性特例)

     

    会话一致性

     

    单调读一致性

     

    单调写一致性

     

    3.分布式存储算法

     

    3.1一致性算法 – Paxos

     

    Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就没有停止过。节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。

     

    不仅仅是在分布式系统中,凡是多个过程需要达成某种一致的场合都可以使用Paxos 算法。一致性算法可以通过共享内存(需要锁)或者消息传递实现,Paxos 算法采用的是后者。Paxos 算法适用的几种情况:一台机器中多个进程/线程达成数据一致;分布式文件系统或者分布式数据库中多客户端并发读写数据;分布式存储中多个副本响应读写请求的一致性。

     

    3.2分区(Partitioning)

     

    原来所有的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,因此CPU、内存、文件IO、网络IO都可能会成为系统瓶颈。而分区的方案就是把某一个表或某几个相关的表的数据放在一个独立的数据库上,这样就可以把CPU、内存、文件IO、网络IO分解到多个机器中,从而提升系统处理能力。

     

    3.3分片(Replication)

     

    分区有两种模式,一种是主从模式,用于做读写分离;另外一种模式是分片模式,也就是说把一个表中的数据分解到多个表中。一个分区只能是其中的一种模式。

     

    3.4一致性哈希(Consistent Hashing)

     

    一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。

     

    一致性哈希基本解决了在P2P环境中最为关键的问题——如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量相邻节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中。所有这一切使得一致性哈希成为第一个实用的DHT算法。

     

    4.NoSQL的优点/缺点

     

    4.1优点

     

    易扩展

     

    NoSQL数据库种类繁多,但是有一个共同的特点,都是去掉了关系型数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。

     

    大数据量,高性能

     

    NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表更新Cache就失效,是一种大粒度的Cache,针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多了。

     

    灵活的数据模型

     

    NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系型数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。

     

    高可用

     

    NoSQL在不太影响性能的情况下,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。

     

    4.1缺点

     

    没有标准

     

    没有对NoSQL数据库定义的标准,所以没有两个NoSQL数据库是平等的。

     

    没有存储过程

     

    NoSQL数据库中大多没有存储过程。

     

    不支持SQL

     

    NoSQL大多不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移上的成本。

     

    支持的特性不够丰富,产品不够成熟

     

    现有产品所提供的功能都比较有限,不像MS SQL Server和Oracle那样能提供各种附加功能,比如BI和报表等。大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语。

     

    NoSQL与SQL的对比

     

    NoSQL数据库的分类

     

     

    1.键值(Key-Value)存储数据库

     

    这一类数据库主要会使用到哈希表,在这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。

     

    E. g:

     

    TokyoCabinet/Tyrant

     

    Redis

     

    Voldemort

     

    OracleBDB

     

    列存储数据库

     

    这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。

     

    E. g:

     

    Cassandra

     

    HBase

     

    Riak

     

    文档型数据库

     

    文档型数据库的灵感来自于Lotus Notes办公软件,它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。

     

    E. g:

     

    CouchDB

     

    MongoDB

     

    SequoiaDB

     

    图形(Graph)数据库

     

    图形结构的数据库同其它行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。

     

    E. g:

     

    Neo4J

     

    InfoGrid

     

    InfiniteGraph

     

    主流NoSQL数据库介绍及其适用场景

     

     

    1. Redis

     

    1.1 介绍

     

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

     

    1.2 适用场景

     

    数据变化较少,执行预定义查询,进行数据统计的应用程序

     

    需要提供数据版本支持的应用程序

     

    例如:股票价格、数据分析、实时数据搜集、实时通讯、分布式缓存

     

    2. MongoDB

     

    2.1 介绍

     

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

     

    MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的非关系型数据库。

     

    2.2 适用场景

     

    需要动态查询支持

     

    需要使用索引而不是 map/reduce功能

     

    需要对大数据库有性能要求

     

    需要使用 CouchDB但因为数据改变太频繁而占满内存

     

    3.Neo4j

     

    3.1 介绍

     

    Neo4j是一个高性能的NoSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。

     

    3.2 适用场景

     

    适用于图形一类数据

     

    这是 Neo4j与其他NoSQL数据库的最显著区别

     

    例如:社会关系,公共交通网络,地图及网络拓谱

     

    4.Cassandra

     

    4.1 介绍

     

    Apache Cassandra 是一套开源分布式 Key-Value 存储系统。它最初由 Facebook 开发,用于储存特别大的数据。 Cassandra 不是一个数据库,它是一个混合型的非关系的数据库,类似于Google 的 BigTable。Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。

     

    4.2适用场景

     

    银行业,金融业

     

    写比读更快

     

    5. HBase

     

    5.1 介绍

     

    HBase是一个分布式的、面向列的开源数据库,该技术来源于Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

     

    5.2适用场景

     

    对大数据进行随机、实时访问的场合

     

    例如: Facebook消息数据库

     

    6.CouchDB

     

    6.1 介绍

     

    CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable CommodityHardware” 的首字母缩写,它反映了 CouchDB 的目标具有高度可伸缩性,提供了高可用性和高可靠性,即使运行在容易出现故障的硬件上也是如此。

     

    6.2适用场景

     

    数据变化较少,执行预定义查询,进行数据统计的应用程序

     

    需要提供数据版本支持的应用程序。

     

    例如: CRM、CMS系统。 master-master复制对于多站点部署是非常有用的。

     

    NoSQL优秀应用实例

     

    1. 新浪微博 - Redis

     

    新浪微博从技术上来说,每天用户发表微博特别容易,这造成每天新增的数据量都是百万级、上千万级的这样一个量。你经常要面对的一个问题就是增加服务器,因为一般一台MySQL服务器,它可能支撑的规模也就是几千万,或者说复杂一点只有几百万,这样,可能每天都要增加服务器,从而解决所你面对的这些问题。

     

    目前新浪微博是Redis全球最大的用户,在新浪有200多台物理机,400多个端口正在运行着Redis, 有4G的数据跑在Redis上来为微博用户提供服务。

     

    新浪微博面临的问题如下:

     

    数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率

     

    随着读操作的量的上升,性能问题需要解决,经历的过程有:

     

    数据库读写分离(M/S)-->数据库使用多个Slave-->增加Cache (memcache)-->转到Redis

     

    解决写的问题:

     

    水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表。

     

    可靠性需求

     

    Cache的"雪崩"问题难以解决,面临着快速恢复的挑战。

     

    开发成本需求

     

    Cache和DB的一致性维护成本越来越高,但开发需要跟上不断涌入的产品需求。且硬件成本最贵的就是数据库层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件。

     

    维护性复杂

     

    一致性维护成本越来越高

     

    BerkeleyDB使用B树,会一直写新的,内部不会有文件重新组织;这样会导致文件越来越大;大的时候需要进行文件归档,归档的操作要定期做,这样,就需要有一定的down time。

     

    基于以上考虑,新浪微博选择了Redis。

     

    在新浪NoSQL和MySQL在大多数情况下是结合使用的,根据应用的特点选择合适的存储方式。譬如:关系型数据,例如:索引使用MySQL存储;非关系型数据,例如:一些K/V需求的,对并发要求比较高的放入Redis存储。

     

    新浪微博团队通过修改Redis源码满足自己的业务需求:完善它的replication机制,加入position的概念,让维护更容易,同时failover能力也大大增强。改善Hashset在RDB里面的存储方式,提升复杂数据类型的加载速度。

     

     

    业务场景如下:

     

    1. 业务使用方式:

     

    hash sets: 关注列表, 粉丝列表, 双向关注列表(key-value(field), 排序)

     

    string(counter): 微博数, 粉丝数, ...(避免了select count(*) from ...)

     

    sort sets(自动排序): TopN, 热门微博等, 自动排序

     

    lists(queue): push/sub提醒,...

     

    上述四种, 从精细化控制方面,hash sets和string(counter)推荐使用, sort sets和lists(queue)不推荐使用

     

    还可通过二次开发,进行精简。比如: 存储字符改为存储整形, 16亿数据,只需要16G内存

     

    存储类型保存在3种以内,建议不要超过3种;

     

    将memcache +mysql 替换为Redis:

     

    Redis作为存储并提供查询,后台不再使用mysql,解决数据多份之间的一致性问题;

     

    2. 对大数据表的存储(eg:140字微博的存储)

     

    一个库就存唯一性id和140个字;

     

    另一个库存id和用户名,发布日期、点击数等信息,用来计算、排序等,等计算出最后需要展示的数据时再到第一个库中提取微博内容;

     

    3. 一些技巧

     

    很多应用, 可以承受数据库连接失败, 但不能承受处理慢

     

    一份数据, 多份索引(针对不同的查询场景)

     

    解决IO瓶颈的唯一途径: 用内存

     

    在数据量变化不大的情况下,优先选用Redis

     

    2. 淘宝数据平台 – Oceanbase,Tair(均为自研)

     

    数据产品的一个最大特点是数据的非实时写入,正因为如此,可以认为在一定的时间段内,整个系统的数据是只读的。这为设计缓存奠定了非常重要的基础。一些对实效性要求很高的数据,例如针对搜索词的统计数据,希望能尽快推送到数据产品前端,所以在内存中做实时计算,并把计算结果在尽可能短的时间内刷新到 NoSQL存储设备中,供前端产品调用。

     

    淘宝Oceanbase的设计之初,是这样的。公司通过对淘宝的在线存储需求进行分析发现:

     

    淘宝的数据总量比较大,未来一段时间,比如五年之内的数据规模为百TB级别,千亿条记录,另外,数据膨胀很快,传统的分库分表对业务造成很大的压力,必须设计自动化的分布式系统。所以有了淘宝Oceanbase,它以一种很简单的方式满足了未来一段时间的在线存储需求,并且还获得了一些其它特性,如高效支持跨行跨表事务,这对于淘宝的业务是非常重要的。

     

     

     

    OceanBase由如下几个部分组成:

     

    客户端:用户使用OceanBase的方式和MySQL数据库完全相同,支持JDBC、 C客户端访问,等等。基于MySQL数据库开发的应用程序、工具能够直接迁移到OceanBase。

     

    RootServer:管理集群中的所有服务器,子表(tablet)数据分布以及副本管理。 RootServer一般为一主一备,主备之间数据强同步。

     

    UpdateServer:存储OceanBase系统的增量更新数据。UpdateServer一般为一主一备,主备之间可以配置不同的同步模式。部署时,UpdateServer进程和RootServer进程往往共用物理服务器。

     

    ChunkServer:存储OceanBase系统的基线数据。基线数据一般存储两份或者三份,可配置。

     

    Merge Server:接收并解析用户的SQL请求,经过词法分析、语法分析、查询优化等一系列操作后转发给相应的ChunkServer或者UpdateServer。如果请求的数据分布在多台ChunkServer上,MergeServer还需要对多台ChunkServer返回的结果进行合并。客户端和MergeServer之间采用原生的MySQL通信协议,MySQL客户端可以直接访问MergeServer。

     

    淘宝Tair是由淘宝自主开发的Key/Value结构数据存储系统,并且于 2010年6月30号在淘宝开源平台上正式对外开源,在淘宝网有着大规模的应用。用户在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和Tair交互。淘宝将Tair开源,希望有更多的用户能从我们开发的产品中受益,更希望依托社区的力量,使Tair有更广阔的发展空间。

     

     

    Tair 的分布采用的是一致性哈希算法, 对于所有的key, 分到Q个桶中, 桶是负载均衡和数据迁移的基本单位. config server 根据一定的策略把每个桶指派到不同的data server上. 因为数据按照key做hash算法, 所以可以认为每个桶中的数据基本是平衡的. 保证了桶分布的均衡性, 就保证了数据分布的均衡性。

     

     

    3. 优酷运营数据分析 – HBase,MongoDB, Redis

     

    优酷作为一家大型视频网站,拥有海量播放流畅的视频。它秉承注重用户体验这一产品技术理念,将绝大部分存储用在视频资源上。通过建设专用的视频CDN,建立了可自由扩展、性能优异的架构,在提供更好用户体验的同时优化了存储资源。在除视频资源外的其它方面,优酷也累积了海量数据:仅运营数据,每天收集到的网站各类访问日志总量已经达到TB级,经分析及压缩处理后留存下来的历史运营数据已达数百TB,很快将会达到 PB级,5年后数据量将会达到几十PB级。

     

     

    目前优酷的在线评论业务已部分迁移到MongoDB,运营数据分析及挖掘处理目前在使用Hadoop/HBase;在Key-Value产品方面,它也在寻找更优的 Memcached替代品,如Redis,相对于Memcached,除了对Value的存储支持三种不同的数据结构外,同一个Key的Value进行部分更新也会更适合一些对Value频繁修改的在线业务;同时在搜索产品中应用了Tokyo Tyrant;对于Cassandra等产品也进行过研究。

     

    对于优酷来说,仍处于飞速发展阶段,已经在考虑未来自建数据中心,提高数据处理能力,从网站的运营中发掘出更多信息,为用户提供更好的视频服务。

     

     

    4. 豆瓣社区 – BeansDB(自研KV数据库)

     

    它采用类似memcached的去中心化结构,在客户端实现数据路由。目前只提供了Python版本的客户端,其它语言的客户端可以由memcached的客户端稍加改造得到。它具有如下特性:

     

    高可用:通过多个可读写的用于备份实现高可用

     

    最终一致性:通过哈希树实现快速完整数据同步(短时间内数据可能不一致)

     

    容易扩展:可以在不中断服务的情况下进行容量扩展。

     

    高性能:异步网络IO, 日志结构的存储方式Bitcask.

     

    简单协议:Memcache兼容协议,大量可用客户端

     

    目前,BeansDB在豆瓣主要部署了两个集群:一个集群用于存储数据库中的大文本数据,比如日记、帖子一类;另外一个豆瓣FS集群,主要用于存储媒体文件,比如用户上传的图片、豆瓣电台上的音乐等。

     

     

    BeansDB采用Key-Value存储架构,其最大的特点是具有高度的可伸缩性;在BeansDB的架构下,在大数据量下,扩展数据节点将轻而易举,只需要添加硬件,安装软件,修改相应的配置文件即可。

     

    BeansDB项目可以说是一个简化版的AWS DynamoDB。BeansDB对key做哈希运算找到节点来实现分布和冗余, 一个写操作会写好几个节点,而现在的配置是写三份读一份。BeansDB主要的特点是支持海量KV数据库——相比Redis这种支持几十个G到几百个G的内存KV数据库,BeansDB可以支持到上百T的数据。另外BeansDB最大的好处就是运维很简单,性能、扩容都很好,也实现了最终一致性。

     

    BeansDB在可用性方面也有很大的优势,任何一个节点宕机都不会受到影响,数据是自动伸缩冗余的。在运维方面也很简单,基本上没有什么用户数据的冗余残余,所有数据通过一个同步脚本可以快速同步。

     

     

    学习资料

     

    1.书籍

     

    1.1 MongoDB: The Definitive Guide(Kristina Chodorow)

     

    MongoDB是入门NoSQL数据库的最好选择之一。本书讲解了所有关于MongoDB的基础知识,是本很好的入门书籍。

     

     

    1.2 NoSQL精粹 (Pramod J.Sadalage,Martin Fowler)

     

    本书全方位比较关系型数据库与NoSQL数据库的异同,详细讲解4大主流NoSQL数据库的优劣势、用法和适用场合,深入探讨实现NoSQL数据库系统的各种细节。此书对于技术选型有很好的指导作用。

     

     

    1.3 各种NoSQL数据库的官方文档

     

    有一定计算机基础的人还是最推荐看官方文档,官方文档对其产品的理解永远是最深的,对于开发者若能理解其设计原则,上手比看书要快。

     

    2.视频

     

    2.1 GettingStarted - NoSQL - MongoDB

     

    地址:

     

    https://www.youtube.com/watch?v=5rbFoSGHErA&list=PLf0swTFhTI8ra5T5B7QsNuu5yxiEdd6Ro

     

    老外的视频,MongoDB的一个比较通俗易懂的教程。

     

    2.2 Cassandra-NoSQL-Tutorials

     

    地址:

     

    https://www.youtube.com/watch?v=8G4a4G3S654&list=PLpE_8MUgZj5vSp1Q_5GyDKBgy9dG1ifdE

     

    同样是老外的Cassandra的系列教程。

     

    2.3 Redis ServerTutorial

     

    地址:

     

    https://www.youtube.com/watch?v=fyV3OK1fCr0&list=PLpIXNzrq3JHQ8-QCJqrC2ihrGJkjdN2J6

     

    Redis的系列教程,不过侧重于分布式缓存功能的实现。这也是Redis的主要使用场景。

     

    3.边用边Google

     

    工具类的事物永远是边用边学最快,真正用过了(尤其是遇到过超高并发/存储的情况)才会体验到NoSQL的好处。

     

    进一步学习

     

    在数据派THU后台(非留言区)回复"综述"即可获取资源。

     

    1.分布式算法

     

    Paxos made simple

     

    一篇通俗讲解paxos算法的论文,由paxos算法发明者Leslie Lamport所写,是其发明paxos算法的论文的简化版。此算法用于确定分布式系统的共识。

     

    Byzantine generals problem

     

    一篇研究“拜占庭将军”问题的论文。“拜占庭将军”是分布式场景的典型问题,paxos算法就是用来解决此问题的。

     

    Research on the improvement of MongoDBAuto-Sharding in cloud environment

     

    一篇研究MongoDB分片算法的论文。分片是NoSQL数据库的基本功能。

     

    2. NoSQL数据库的研究及底层实现

     

    Bigtable:A distributed storage system for structured data

     

    BigTable的设计论文,HBase是其开源实现,是一个典型的基于列的NoSQL数据库。此篇论文是Google的“三大马车”之一。

     

    Optimizingevent polling for network-intensive applications: A case study on redis

     

    一篇研究Redis底层Networking IO的论文,并优化了原有的epoll模型,命名为FlexPoll。

     

    Performanceevaluation of a MongoDB and Hadoop platform for scientific data analysis

     

    一篇研究MongoDB和Hadoop在科学计算场景的性能的论文(科学计算是cpu/gpu-intensive而非i/o密集型)。

     

    3. NoSQL应用案例

     

    Big dataanalysis with MongoDB for decision support system

     

    这篇论文使用MongoDB对商业数据做了大数据分析,为企业提供决策,并比较了RDBMS与NoSQL在数据分析方面的优劣。

     

    Implementingjoins over HBase on cloud platform

     

    一篇在论述如何在HBase上实现Join功能的论文。Join在分布式环境下实现非常困难,为此此篇论文设计了2种算法:MapReduceJoin与ParallelHashJoin。

    分类:  数据库
    展开全文
  • NOSQL

    2019-09-15 22:45:58
    NoSQL的介绍: 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配...NoSQL数据库存储原理非常简单(典型的数据类...

    NoSQL的介绍:

    非关系型数据库就是NoSQL,关系型数据库代表MySQL
     对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索
     NoSQL数据库存储原理非常简单(典型的数据类型为k-v),不存在繁杂的关系链,比如mysql查询的时候,需要找到对应的库、表(通常是多个表)以及字段。
     NoSQL数据可以存储在内存里,查询速度非常快
     NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库
     NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式

    常见的NoSQL

    k-v形式的:memcached、redis 适合储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。
     文档数据库:mongodb   将数据以文档的形式储存。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。
     列存储 Hbase
     图  Neo4J、Infinite Graph、OrientDB

    Memcached介绍

    Memcached是国外社区网站LiveJournal团队开发,目的是为了通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。
     官方站点 http://www.memcached.org/
     数据结构简单(k-v),数据存放在内存里
     多线程
     基于c/s架构,协议简单
     基于libevent的事件处理
     自主内存存储处理(slab allowcation)
     数据过期方式:Lazy Expiration 和 LRU

    091ee4a533d60bc7be23bf054348144635f.jpg

     

    Slab allocation的介绍:

    Slab Allocation的原理
     将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
     Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
     Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。

    26588056e7ac193e087044faf52f0be22a5.jpg

    Growth factor

    Memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制chunk大小的差异。默认值为1.25。
     通过memcached-tool命令查看指定Memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25
     命令:# memcached-tool 127.0.0.1:11211 display

    Memcached的数据过期方式

     Lazy Expiration
     Memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,Memcached不会在过期监视上耗费CPU时间。
     LRU
     Memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

    Memcached安装

     yum install -y memcached libmemcached libevent
     systemctl start memcached
     vim /etc/sysconfig/memcached 可以配置参数
     比如加上监听的ip,可以把OPTIONS="" 改为OPTIONS="127.0.0.1"
     其中-m指定memcached分配内存
     -c指定最大并发数
     -u指定运行memcached服务的用户

    a4bd5347afe59a442cb1b8cff821652cec8.jpg

    3e55ea2cce13699cf64d5c844b57cbc0d7a.jpg

    查看Memcached运行状态

     memcached-tool 127.0.0.1:11211  stats
     或者echo stats |nc 127.0.0.1 11211  需要安装nc工具  yum install -y nc
     若安装libmemcached后,可以使用命令
     memstat --servers=127.0.0.1:11211 查看memcached服务状态

    在memcached中,运行state命令可以查看memcached服务的状态信息,其中cmd_get表示总的get次数,get_hits表示get的总命中次数,命中率 = get_hits/cmd_get。    get_hits是一个历史数据。 curr_items是当前存储的数据

    fdba5f84d6e6c89df82bfc245c955384036.jpg

     

    Memcached命令行:

     yum install -y telnet

    telnet 127.0.0.1 11211
     set key2 0 30 2
    ab
    STORED
    get key2
    VALUE key2 0 2
    ab
    END

     

     

    Memcached语法规则

      <command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
     注:\r\n在windows下是Enter键
     <command name> 可以是set, add, replace
     set表示按照相应的<key>存储该数据,没有的时候增加,有的时候覆盖
     add表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败
     replace表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
     <key> 客户端需要保存数据的key

       <flags> 是一个16位的无符号的整数(以十进制的方式表示)。 该标志将和需要存储的数据一起存储,并在客户端get数据时返回。 客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
     <exptime> 为过期的时间。 若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。 如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
     <bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
     <data block>需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)作为结束标志。

    Memcached数据导出和导入

    导出:
     memcached-tool 127.0.0.1:11211 dump > data.txt
     cat data.txt
     导入:
     nc 127.0.0.1 11211 < data.txt
     若nc命令不存在,yum install nc
     注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的

    PHP连接Memcached

    先安装php的memcache扩展
    cd /usr/local/src/
    wget  http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
    tar zxf memcache-2.2.3.tgz
    cd memcache-2.2.3
    /usr/local/php-fpm/bin/phpize
    ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
    make && make install
    安装完后会有类似这样的提示: Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
    然后修改php.ini(vim /usr/local/php-fpm/etc/php.ini )添加一行 extension="memcache.so“
    检查/usr/local/php-fpm/sbin/php-fpm  -m

    下载测试脚本
    curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
    1.php内容也可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php
    执行脚本
    /usr/local/php-fpm/bin/php 1.php
    或者将1.php放到某个虚拟主机根目录下面,在浏览器访问,即可看到效果
    最终可以看到数据如下:
     [0] => aaa
     [1] => bbb
     [2] => ccc
     [3] => ddd

    94881098c8c15960a98020973d6b9cb84a6.jpg

     

    Memcached中存储session

    本实例是在lamp/lnmp环境下实现

    wget http://study.lishiming.net/.mem_se.txt
    mv .mem_se.txt   /data/wwwroot/default/1.php   //把.mem_se.txt改名为1.php并放到默认的主页目录下(nginx的默认主页下)
    其中session.php内容可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
    curl    localhost/1.php
    类似于1443702394<br><br>1443702394<br><br>i44nunao0g3o7vf2su0hnc5440


    编辑php.ini添加两行
    session.save_handler = memcache 

    session.save_path = "tcp://192.168.0.9:11211" 

    a6089a7eca9bcca59a6e96f8dac491320bd.jpg

    0d1bb233488c8c9750e8cc4d7d99c8665ef.jpg
    或者httpd.conf中对应的虚拟主机中添加
    php_value session.save_handler "memcache"  php_value session.save_path "tcp://192.168.0.9:11211" 
    或者php-fpm.conf对应的pool中添加
    php_value[session.save_handler] = memcache
    php_value[session.save_path] = " tcp://192.168.0.9:11211 "
    telnet 127.0.0.1 11211
    get i44nunao0g3o7vf2su0hnc5440

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    转载于:https://my.oschina.net/u/3964315/blog/3073292

    展开全文
  • nosql

    千次阅读 2011-12-13 19:08:55
    NoSQL数据库笔谈 databases , appdir , ssv , paper 颜开 , v0.2 , 2010.2 序思想篇 CAP最终一致性 变体 BASE其他 I/O的五分钟法则不要删除数据RAM是硬盘,硬盘是磁带Amdahl定律和...
  • NoSQL生态系统

    2017-02-07 11:16:46
    这些被称为 NoSQL工具,在存储数据的方式上,提供了一与(基于 SQL 语言的)关系型数据库截然不同的思路。要想了解 NoSQL,必须先了解现有的这些工具,去理解那些引导它们开拓出新的存储领域的设计思路。 ...
  • NoSQL数据库

    千次阅读 2018-05-20 15:13:36
    NoSQL简介 NoSQL概念: 图;NoSQL概念的演变 NoSQL最初表示的“反SQL”运动,用新型的非关系型数据库取代关系型数据库。 现在NoSQL(Not only SQL)表示关系和非关系型数据库各有优缺点,彼此都无法互相取代...
  • nosql生态系统

    千次阅读 2011-06-28 09:22:00
    源地址:http://blog.nosqlfan.com/html/2171.html NoSQL生态...这些被称作NoSQL工具,在存储数据的方式上,提供了一与基于SQL语言的关系型数据截然不同的思路。要想了解NoSQL,我们必须先了解现有的这些工具,去
  • 导读:本文讨论大数据处理的生命周期和典型工具。作者:高聪 王忠民 陈彦萍来源:大数据DT(ID:hzdashuju)大数据的生命周期分为数据获取(data acquisition)、数据...
  • NOSQL理念概述

    2020-11-17 09:40:53
    文章目录NOSQL概述什么是NOSQLNOSQL和关系型数据库比较非关系型数据库的优势关系型数据库的优势总结主流的NOSQL产品键值(Key-Value)存储数据库列存储数据库文档型数据库 NOSQL概述 redis是一款高性能的NOSQL系列的...
  • NOSQL概述

    2014-07-24 23:55:01
    NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一全新的思维的注入。为了更好的理解NoSQL数据库,下面将SQL数据库与NoSQL数据库对比分析。 首先是关系型数据库...
  • NOSQL之Redis

    2020-08-01 16:18:49
    一、NOSQL概述 1.1 什么是NOSQL NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。 1.2 为什么需要NOSQL High performance - 对数据库高并发读写的需求 Huge ...
  • NoSQL Memcached

    2018-08-22 14:34:59
    21.1 NoSQL介绍 SQL (Structured Query Language) 数据库,指关系型数据库。主要代表:SQL Server,Oracle,MySQL,PostgreSQL。 NoSQL(Not Only SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,CouchDB。 k...
  • 数据科学导论 NoSQL

    2021-05-18 10:52:12
    2.学习工具3.看法、前景4.给一个数据科学项目 1.什么是NoSQL? NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的...
  • Nosql简述

    2016-11-21 23:12:16
    NoSQL诞生的原因和优缺点... 2 SQL向NoSQL转变 关系型数据库的局限性... 3 关系型数据库  V.S. 非关系型数据库... 5 非关系型数据库分类... 6 Redis常用的数据类型... 6 redis持久化RDB和AOF. 7   ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,052
精华内容 4,420
关键字:

nosql四种典型工具