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软删除,推荐的方式是使用代表数据状态的字段,如:有效、停用、弃置、取消等。
参考资料:
- 皮雄军. NoSQL数据库技术实战[M]. 北京:清华大学出版社, 2015.
NOSQL快速入门的更多相关文章
- [你必须知道的NOSQL系列]专题二:Redis快速入门
一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这 ...
- [你必须知道的NOSQL系列]专题一:MongoDB快速入门
一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部分 ...
- [Solution] ASP.NET Identity(1) 快速入门
本节将介绍: ASP.NET Identity简介 快速入门 扩展 ASP.NET Identity简介 身份管理在ASP.NET中存在很长世间了,ASP.NET 开发团队已经学会了很多从客户的反馈. ...
- EntityFramework6 快速入门教程
EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...
- SpringData 基于SpringBoot快速入门
SpringData 基于SpringBoot快速入门 本章通过学习SpringData 和SpringBoot 相关知识将面向服务架构(SOA)的单点登录系统(SSO)需要的代码实现.这样可以从实战 ...
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- Spring Boot 2.0 的快速入门(图文教程)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...
- logstash快速入门实战指南-Logstash简介
作者其他ELK快速入门系列文章 Elasticsearch从入门到精通 Kibana从入门到精通 Logstash是一个具有实时流水线功能的开源数据收集引擎.Logstash可以动态统一来自不同来源的 ...
- 3.1_springboot2.x检索之elasticsearch安装&快速入门
1.elasticsearch简介&安装 1.1.1.elasticsearch介绍 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选.他可以快 ...
随机推荐
- 前端常用功能记录(三)—datatables表格初始化
其实上篇说的也算是jQuery Datatables的初始化,但主要是对某些字段意义的理解.下面记录的是datatables常用的功能的初始化. 数据源 我经常使用的有两种,一种是JavaScript ...
- node.js 开发简易的小爬虫
node.js 开发简易的小爬虫 最近公司开发一款医药类的软件,所以需要一些药品的基础数据,所以本人就用node.js写一个简易的小爬虫,并写记录这个Demo以供大家参考. 一.开发前的准备: 1, ...
- python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...
- SHELL (1) —— shell脚本入门
摘自:Oldboy Linux运维——SHELL编程实战 SHELL Shell是一个命令解释器,解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条.这种从键盘以输入命令,就 ...
- Linux命令(三)远程登录
- PHP魔术方法之__invoke()
将对象当作函数来使用时,会自动调用该方法. class ShowProfile extends Controller { public function __invoke($id) { return ...
- 20155317 王新玮 2016-2017-2 《Java程序设计》第6周学习总结
20155317 王新玮 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 10.1.1串流设计的概念 Java将输入/输出抽象化为串流,数据有来源及目的地,衔 ...
- FinalShell 推荐
FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求. 用户QQ群 342045988 Windows版下载地址:http:/ ...
- 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, 用户授权什么的都对,很 ...
- linux调试工具glibc的演示分析-core dump double free【转】
转自:http://www.cnblogs.com/jiayy/p/3475544.html 偶然中发现,下面的两端代码表现不一样 void main(){ void* p1 = malloc(32) ...