NOSQL基础概念

NoSql是一个很老的概念了,但对自己来说,仍然是一个短板,果断补上。

首先通过几个简单的例子来了解NOSQL在国内的情况(2013年左右的数据,有些过时),比如新浪微博,其就有200多台物理机运行着Redis,其结合NOSQL和MySQL一起使用,关系型数据,通过索引保存在MYSQL中,K/V数据保存在Redis中。淘宝的Oceanbase用于处理线上事务,Tair用于K/V存储,于2010上线(自己落后时代不少啊)。优酷的现在评论业务使用mongoDB存储,运营数据分析及挖掘处理使用Hadoop/HBase。

对于数据来说,常用的单位按序增加为,Byte, KB, MB, GB, TB, PB, EB, ZB, YD, DB, NB。

大数据的特点体现在4个V上,分别是: Volumn数据量,比如腾讯涉及8亿以上用户,2013年的总数据量压缩后仍然高达100PB,并以每月10%的速度增长;Variety数据类型繁多,包括文字、视频、图片、地理位置等;Value价值密度低,商业价值高;Velocity处理速度快,"1秒定律"。

大数据相关技术:采集技术,比如RFID射频数据、传感器数据、社交网络数据等;预处理技术,对数据进行抽取和清洗操作;大数据存储与管理技术,比如DFS分布式文件系统,NOSQL数据库;大数据分析与挖掘技术,包括数据挖掘,机器学习等;大数据应用技术,在国内常用于商业智能、政府决策和公共服务。

什么是NOSQL? "Not Only SQL"

过去传统的关系型数据库,优点是通用性和性能都很高、通过事务保持数据一致性、可以通过JOIN完成复杂查询,但缺点是不擅长大量数据的写入、表结构的改变、快速返回简单查询等。

NOSQL数据库易于数据的分散,其本身不支持join操作,各个数据独立设计,很容易把数据分散到各个服务器,相对于提升服务器性能增大规模可以低成本的提高系统整体处理能力。

接下来通过一个表格来了解NOSQL数据库的类型,加粗部分为最常用实现。


NOSQL类型


常见实现


键值对类型


Memcached临时性, Redis兼具临时性和永久性,可用缓存数据,读写非常快速

Dynamo, LevelDB


文档类型


MongoDB, CouchDB, 无需定义表结构,可以使用复杂查询条件


面向列的类型


Cassandra, HBASE,Hadoop 这类数据库相对最难理解,但重要性最高,扩展性非常强。我们过去的数据库,数据存储以行位单位,便于少量行的读取和更新,而面向列的数据库则适合对大量行少量列进行读取,对所有特定列进行同时更新

Tip:对我们来说,传统数据库和NOSQL数据库不分好坏,能够合理的使用才是王道。

对于传统数据库来说,其数据一致性通过事务的ACID特性来保证,但对于分布式系统来说,这套方案是行不通的。NOSQL系统就是一个分布式系统,其对于客户来说就是一个统一的整体,但实际上是由一组服务器组成的。提到分布式系统的数据一致性,就不得不提Eric Brewer提出的CAP理论,CAP分别表示Consistency强一致性Availability可用性Partition Tolerance分区容错性

根据该理论, 任何一个数据共享系统只能满足这三个特性中的两个,在选型时需要做相应的权衡。

放弃P分区容错性:出现网络故障时,需要将所有数据放到一台机器,但对于NOSQL数据库一定来说,一定需要P

放弃A可用性:出现故障时,服务不可用,需要等待

放弃C强一致性:但保留数据的最终一致性,以网购为例,对于同一货物的两个订单吗,较晚的订单将被告知售罄。对于一些不敏感的数据,比如头像、评论,可以放弃C,但对于金额等敏感数据则不能。

相对于传统的ACID, NOSQL引入BASE准则。

Basically Available基本可用:系统能够基本运行,一直提供服务。

Soft-State软状态:系统不要求一直保持强一直状态。

Eventual consistency最终一致性:系统需要在某一时刻后达到一致性要求。


ACID


BASE


强一致性


弱一致性


隔离性


可用性优先


悲观,保守方法(悲观锁)


乐观方法(乐观锁)


难以变化


适用变化、简单快捷

数据一致性的实现方法:Quorun系统NEW策略;时间戳策略;向量时钟。(这部分需要时再深入学习,目前只需应用水平)

对于当下的海量数据,过去通过垂直扩展性能的方式已不合适,因此水平扩展已成为必由之路,通常来说,对于NOSQL数据库,水平扩展的方式就是复制和分片


方案


诠释


所有数据存放在一个服务器上

 

分片(Sharding)


将数据不同部分分配到不同服务器

记住:在设计,及早考虑分片


主从复制(Master-Slave)


主负责处理数据更新,并启动单独进程将数据同步到从

但主仍然存在瓶颈和单点故障


对等复制(Peer to Peer)


同时写入时,存在不一致的情况,可以由应用程序来判断

选举模式


复制和分片同时使用

 

分片的算法:Range-Based Partition(mongodb), Round-Robin(mod算法),一致性hash算法(详情请见http://www.cnblogs.com/wanliwang01/p/Architect_JAVA_LINKHOME.html)。

Tip:

五分钟法则:一条记录频繁被访问则应该放在内存,反之则应该放在硬盘,这个临界时间就是五分钟。

不要删除数据:包括不用使用IsDeleted软删除,推荐的方式是使用代表数据状态的字段,如:有效、停用、弃置、取消等。

参考资料:

  1. 皮雄军. NoSQL数据库技术实战[M]. 北京:清华大学出版社, 2015.
时间: 2024-10-22 11:33:55

NOSQL基础概念的相关文章

第五十一课 NoSQL基础概念及MongoDB应用、数据库分配概念

NoSQL基础概念及MongoDB MongoDB基础应用 MongoDB索引及复制集 数据库分片的概念及Mongodb  sharding的实现 一.NoSQL基础概念 NoSQL(Not Only SQL),是一种技术流派,非关系型数据库:适合用在大数据领域,各种nosql有各自的查询语句,这也是nosql的缺点之一. 大数据(BigDate)也称海量数据是一个模糊的概念,像Google.百度收集大量数据,分析现在.预测未来:这些数据通过某些特定的特征和算法得出某些预测的结果,这些数据为大数

关系型数据库常用基础概念知识归纳

声明:我的文章都是只挑主要的写,次要细节太多,归纳就没意义了,同时归纳主要是给自己看的, 而且基本都是凭自己的一些记忆和理解即时写的.不一定对和全(但大多是一些需要理解的概念),请各位看管见谅! 数据库设计篇 1.范式 A.1范式,原子性,即列不可分 B.2范式,完全依赖,即有个主键唯一区分 C.3范式,不能传递依赖,即表中不能还有其他表的非主键信息 2.模型 A.概念模型,即ER图等 B.逻辑模型,即建逻辑表 C.物理模型,即生成物理表 事务 1.四大特性, A.原子,要么..要么.. B.隔

系统学习redis之一——基础概念

前言: redis集群搭建过很多次,也用过一些基础的命令,能解决一些常规的异常.但是因为平时对数据这块用得不多,一直没有很系统的学习过redis.这次将redis的知识好好学习了一下,记录为学习笔记<系统学习redis>系列. NoSQL介绍 非关系型数据库:NoSQL关系型数据库:MySQL.SQLserver.Oracle 关系型数据库在web2.0上对高并发,暴露出了一些性能问题 NoSQL 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,

分布式学习——基础概念篇

概述 最近这段时间一直在看分布式有关的东西,但是关于分布式自己还是不能很好的理解,所以本文对分布式基础概念进行下学习. 分布式处理 首先先了解一下分布式处理,分布式处理和集中式处理正好是相反的的体系架构,集中传输集中到式处理顾名思义就是将所有的信息都一个统一的信息中心进行处理:分布式处理就是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机利用通信网络连接起来,让各个计算机各自承担同一个工作任务的不同部分,在控制中心的管理下,同时运行,共同完成同一个工作任务. 提到分布式处理就不能不提到

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留

js基础--javascript基础概念之数组(二)

js基础--javascript基础概念之数组 数组栈方法 数组可以像栈一样.栈是一种先进后出的数据结构,最先添加的数据最后一个出来.栈方法添加数据也称为 推入  移除数据称为 弹出. js为数值栈方法提供了 push()   和  pop() ;  两个方法. push() push() 方法接受参数就是你要添加进入到数组的值.push()  方法会将他们逐一添加到数组的末尾  数组的length属性会跟着更新数据. *push(多个数组元素值) 返回的修改后的数组长度 var array =

js基础--javascript基础概念之数组

js基础--javascript基础概念之数组 在ECMAScript 中 ,数组是很常用的数据类型,js中的数组和其他很多语言的数组有明显的区别.js的数组可以保持任何类型的数值,一个数组中可以保存着多个不同类型的数值.js数组大小(长度)是可以调整的.可以随着数据的添加自动增长数组长度. 创建数组: 一.数组字面量 数组字面量由一对包含数组项的方括号[]表示. var array = [ 'kin', 'cheong', 'change', 'hello', 'haha', 'hi' ];

Linux基础概念-----环境变量

Shell 环境变量 Shell也是应用程序,工作与用户模式 变量类型 整形 浮点型 字符型 布尔型 bash变量类型 本地变量:仅对当前Shell有效 局部变量:仅对局部代码段有效(函数) 环境变量:expor VAR_NAME=Value,对当前Shell及子Shell有效 位置变量:$1;$2 .... 特殊变量:$?;$!;$$ .... 查看环境变量 printenv export 查看所有变量 set bash的引号 双引号:弱引用,可以实现变量替换: 单引号:强引用,不替换,而显示

Linux基础概念-----Linux I/O重定向 ,管道

标准输入:键盘 标准输出:显示器 错误输出:显示器 FD:文件描述符:让程序可以文件交互,并且便于内核识别文件,打开的每一个文件都有一个描述符 程序在和文件交互式,通过文件描述符来进行交互,而非文件名,文件名是方便用户分别文件. Linux一切皆文件,所以标准输入,标准输出都有各自的文件描述符 标准输入描述符:0 标准输出描述符:1 标准错误输出描述符:2 将其默认数据流改为其他设备:IO重定向 输出重定向 > 覆盖重定向 >> 追加重定向 /dev/null  黑洞 只针对当前Shel