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.

NOSQL快速入门的更多相关文章

  1. [你必须知道的NOSQL系列]专题二:Redis快速入门

    一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这 ...

  2. [你必须知道的NOSQL系列]专题一:MongoDB快速入门

    一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部分 ...

  3. [Solution] ASP.NET Identity(1) 快速入门

    本节将介绍: ASP.NET Identity简介 快速入门 扩展 ASP.NET Identity简介 身份管理在ASP.NET中存在很长世间了,ASP.NET 开发团队已经学会了很多从客户的反馈. ...

  4. EntityFramework6 快速入门教程

    EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...

  5. SpringData 基于SpringBoot快速入门

    SpringData 基于SpringBoot快速入门 本章通过学习SpringData 和SpringBoot 相关知识将面向服务架构(SOA)的单点登录系统(SSO)需要的代码实现.这样可以从实战 ...

  6. MongoDb 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...

  7. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...

  8. logstash快速入门实战指南-Logstash简介

    作者其他ELK快速入门系列文章 Elasticsearch从入门到精通 Kibana从入门到精通 Logstash是一个具有实时流水线功能的开源数据收集引擎.Logstash可以动态统一来自不同来源的 ...

  9. 3.1_springboot2.x检索之elasticsearch安装&快速入门

    1.elasticsearch简介&安装 1.1.1.elasticsearch介绍 ​ 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选.他可以快 ...

随机推荐

  1. 前端常用功能记录(三)—datatables表格初始化

    其实上篇说的也算是jQuery Datatables的初始化,但主要是对某些字段意义的理解.下面记录的是datatables常用的功能的初始化. 数据源 我经常使用的有两种,一种是JavaScript ...

  2. node.js 开发简易的小爬虫

    node.js  开发简易的小爬虫 最近公司开发一款医药类的软件,所以需要一些药品的基础数据,所以本人就用node.js写一个简易的小爬虫,并写记录这个Demo以供大家参考. 一.开发前的准备: 1, ...

  3. python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  4. SHELL (1) —— shell脚本入门

    摘自:Oldboy Linux运维——SHELL编程实战 SHELL Shell是一个命令解释器,解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条.这种从键盘以输入命令,就 ...

  5. Linux命令(三)远程登录

  6. PHP魔术方法之__invoke()

    将对象当作函数来使用时,会自动调用该方法. class ShowProfile extends Controller { public function __invoke($id) { return ...

  7. 20155317 王新玮 2016-2017-2 《Java程序设计》第6周学习总结

    20155317 王新玮 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 10.1.1串流设计的概念 Java将输入/输出抽象化为串流,数据有来源及目的地,衔 ...

  8. FinalShell 推荐

    FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求. 用户QQ群 342045988 Windows版下载地址:http:/ ...

  9. springboot整合rabbitmq客户端连接报超时异常问题解决:An unexpected connection driver error occured java.net.SocketException: Socket Closed,java.util.concurrent.TimeoutException

    我用的是springboot2.0.6版本,对应的ampq也是2.0.6版本,然后启动一直报: 还有java.util.concurrent.TimeoutException, 用户授权什么的都对,很 ...

  10. linux调试工具glibc的演示分析-core dump double free【转】

    转自:http://www.cnblogs.com/jiayy/p/3475544.html 偶然中发现,下面的两端代码表现不一样 void main(){ void* p1 = malloc(32) ...