【大话存储II】学习笔记(15章),NoSQL

互联网运营商(NSP)的数据中心是数据最集中的地方,也正是因为海量的数据存储与访问,传统的存储架构已经无法满足了现有的需求。

比如每秒几十万次的随机IOPS、每秒10GB的流量,一般都需要使用高端存储,当然价格将不便宜。而且扩展性不好,扩容成本高。

业务的不断增加,导致互联网运营商逐步使用分布式系统来构建底层文件系统及数据库,比如Google的GFS+Bigtable

我们先来看一下为了应对大并发、大流量下,架构的逐步的变化,最后引入NoSQL。

传统数据库架构的演进

使用缓存技术

随着访问量的上升,流量的增加,使用MySQL的架构的网站在数据库上出现了性能问题。

要应对传统的MySQL性能不足的问题,最容易想到的就是加缓存。如果只是使用文件缓存,由于多台Web服务器通过文件缓存不能共享,所以性能并没有那么显著的提升。

那么,我们能不能把缓存单独抽取出来,形成一个缓存服务器,使用这台服务器的大内存来进行缓存,而且这个缓存服务器还可以分布式部署,既保证了共享,又保证了性能。

最典型的代表就是Memcached缓存服务器,我们可以使用一致性Hash算法来进行多台服务器的扩展。

详细可见另一篇文章Memcached集群?

MySQL的主从读写分离

使用缓存服务器只能算是权宜之计,访问量继续上涨的话,数据库还是会有瓶颈。因为互联网应用主要还在于,既然读压力这么大,我们能不能使用集群来负载分担呢。

但是数据库因为需要保证它的原子性、一致性等,不能简单的使用多台服务器并发访问这种架构。

我们可以进行读写分离,将数据库分为Master和Slave两种角色,Master主要用于写,Slave主要用于读,而且Slave可以多台来负载均衡。

这样就可以提高读写性能和读库的可扩展性。具体可以参考数据库(七),读写分离到CQRS

分表分库

使用 Memcached高速缓存和MySQL主从复制,可以缓解读压力,但是写压力怎么办?

最开始MySQL使用MyISAM引擎,它是使用表锁的,高并发有严重的锁问题。于是MySQL使用InnoDB引擎代替它。

同时我们还可以进行分表分库来缓解写压力:

有两种方式:

  • 水平切:一张表,水平切分为多张表,每个节点存储一张子表,同时保留有另外两个副本。所以每张子表都包含原表所有的列。
  • 垂直切分:也就是把一张表竖直的切分,原来的列拆分开,相当于把数据打散,可以获得超高的随机查询性能。

水平切分不需要人参与,盲切分即可。

而垂直切分相当于基于业务层面的切分,具有一定的人为介入度。

MySQL的问题

上面讲到了MySQL在应对大流量大并发的情况下做的努力,底层架构可谓是越来越复杂,相应的,上层的应用也会越来越复杂。虽然有些公司开发了中间件层来屏蔽开发的复杂性,但是避免不了架构的复杂。

那么之前的方法主要的缺点在于:

  • 不够灵活:表结构更改困难,关系型数据库的表结构在一开始的时候就确定好了,很难更改。
  • 扩展性的问题还是没有解决,MySQL推出的集群解决方案,只能保证可靠性,无法保证性能。
  • MySQL经常需要存放大文本字段,导致数据库恢复的时候特别慢。

所以关系型数据库很强大,但是不代表它能应付所有的应用环境,如果我们想要保证良好的扩展性、灵活性,可能需要对原有的功能做一些取舍。

下面我们将介绍一下CAP理论,它会从理论的角度告诉我们鱼和熊掌不可兼得

CAP理论

所谓CAP(Consistency , Availability , Partition Tolerance)理论,指的是一致性、性能、扩展性无法完全兼顾。也就是,我们想要良好的扩展性,则就无法像传统关系型数据那样能保证强一致性。

到底要不要保证强一致性,主要看客户的业务是否需要强一致性呢?

比如DNS解析,更换主机之后暂时不能全网刷新,这种短暂的不一致是可以接受的。

不过也不是完全不能保证一致性,我们有个模型叫NWR模型,可以在一致性和性能上实现平衡。

  • N表示数据块的副本数,
  • W表示写入几份就返回成功。
  • R表示为了保证读一致,客户端需要从保存副本的N个节点中的几个同时读出数据。

比如N=3,W=1,也就是保存3副本,写入1份数据就返回成功。

  • 如果R=1,当写入一份数据并返回成功以后开始读,因为同时只读一份数据,则既可能从未更新的两份数据中读,又可能从刚刚更新的数据中读,所以有可能读到未更新的版本。
  • 如果R=2,同样也不能保证一定读到最新更新的版本。
  • 如果R=3,则一定可以保证读到的3份数据有一份是最新的,只需要看谁的时间戳更晚就行。

如果W=2,就必须同步写成功2个副本才返回后成功,读的时候,只需要读2份就能保证最新了。

总结一下,只要$W+R>N$,就可以保证读一致。

NoSQL

弱一致性的数据库集群一般都不支持事务,同时也不支持关联查询,为什么呢?因为关联查询需要其他节点提供数据分片,也就是说一次查询需要调动其他的节点,这样并发性能将会非常差。

这种去掉关联性,只能保证弱一致性的轻量级的分布式数据库系统,就属于 NoSQL系统

NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。

NoSQL分类

我们对现有的NoSQL进行简单的分类。

类型 部分代表 特点
列存储 Hbase 方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
文档存储 MongoDB JSON。因为存储的内容是一个文档,所以可以对某些字段建立索引
key-value存储 Redis/Memcache 可以通过key快速查询到其value
图存储 Neo4J 如要存储的是图形关系,使用这种方式最好。
对象存储 db4o/Versant 通过对象的方式存取数据。
xml数据库 Berkeley DB XML 支持XML的内部查询语法,比如Xpath。

优势

  • 更加的灵活

    关系型数据库需要事先设定要数据字段,而NoSQL存储方式是键值对、列存储等,更加的灵活,特别适合处理非结构化、半结构化得的数据。

  • 易扩展:去掉了关系数据库的关系型特性,数据无关系,更易于扩展。
  • 高性能:因为NoSQL去掉了关系性,数据库结构简单,性能自然更高。
  • 高可用:大多数NoSQL数据支持自动复制,可以可以在不太影响性能的情况下,方便的实现高可用架构。
  • 自动分片:

    关系型数据因为是结构化的,所以一般来说都是垂直扩展,也就意味着单台服务器需要持有整个数据库,扩展性自然不好。

    NoSQL一般都支持自动分片,也就是会自动向多台服务器上分发数据,这一切是对应用透明的。

缺点

了解了优点我们也需要了解NoSQL的缺点。

NoSQL相对于关系型数据库,放弃了很多功能,比如事务、一致性等,而且目前来说还不够成熟,同时很多NoSQL不提供SQL支持。

所以最好的方法是了解那些场景适合NoSQL,然后与万能的关系型数据库结合来使用

一些涉及到K-V的存储、用户密码存储、Session会话存储等,可以使用NoSQL

原文地址:https://www.cnblogs.com/dy2903/p/8449474.html

时间: 2024-10-14 10:23:23

【大话存储II】学习笔记(15章),NoSQL的相关文章

【大话存储】学习笔记(7,8章),FC协议

Fibre Channnel 我们之前引入了SAN的概念,SAN首先是个网络,而不是存储设备.这个网络是专门来给主机连接存储设备用的. 我们知道按照SCSI总线16个节点的限制,不可能接入很多的磁盘,要扩大SAN的规模,只使用SCSI总线是不行的,所以必须找到一种可寻址容量大.稳定性强.速度块.传输距离远的网络结构.FC网络就应运而生. FC网络 Fibre Channnel也就是网状通道,FC协议从1988年出现,最开始作为高速骨干网技术. 任何互联系统都逃不过OSI模型,所以我们可以用OSI

【大话存储】学习笔记(14章), 虚拟化.md

操作系统对硬件的虚拟化 操作系统:就是为其他程序提供编写和运行环境的程序. 由程序来运行程序,而不是程序自己来运行,这是操作系统提供的虚拟化的表现. 加电之后,首先运行OS,随时可以载入其他程序执行.执行完以后切换回OS本身. 但是每次还是要等待这个程序执行完毕,才能接着载入下个程序执行.任何中断事件,都会中断正在运行的程序. 程序执行完毕,会将CPU归还给OS.从而继续OS本身的运行.这种操作系统就是单任务操作系统,典型代表就是DOS. 而批处理就是操作系统将多个程序一个一个的排列起来.省去了

【大话存储】学习笔记(16章),数据保护和备份技术

数据保护 所谓数据保护是指对当前时间点上的数据进行备份, 如果说一份数据被误删除了,可以通过备份数据找回来. 从底层来分,数据保护可以分为文件级保护和块级保护. 文件级备份 文件级备份:将磁盘上所有文件通过调用文件系统接口备份到另一个介质上.也就是把数据以文件形式读出,然后存储在另一个介质上面. 此时备份软件只能感知到文件这一层. 我们知道一般来说,文件在原来的介质上,可以是不连续存放的,通过文件系统来管理和访问.当备份到新的介质上以后,文件完全可以连续存放.正因为如此,没有必要备份元数据,因为

【大话存储】学习笔记(17章),数据容灾

数据容灾 数据备份系统只能保证实际上被安全复制了一份,如果生产系统故障,必须将备份数据尽快的恢复到生产系统中继续生产,就叫容灾. 容灾可以分为四个级别: 数据级容灾:只是将生产站点的数据同步到远端. 与应用结合的数据级容灾:保证对应应用数据一致性. 应用级容灾:需要保证灾难发生以后,需要保证原生成系统中的应用系统在灾备站点可用. 业务级容灾:除了保证数据.应用系统在灾备站点可用,还要保证整个企业的业务系统仍对外可用,是最终层次的容灾. 概述 如果要充分保证数据的安全,只是在本地做备份是不够的,所

【大话存储】学习笔记(20章),云存储

目前云计算.云存储.云备份等技术可谓是铺天盖地,其中不乏有很多是浑水摸鱼的,本来没有多少云的性质,只是打着云的旗号来炒作而已. 目前市场对一款产品是否是云,没有明显的界定.因为云本来就没有一个标准. 云的是怎么来的 国外在指代一堆设备的时候,一般使用Cluster这个词,而中文翻译一般是"簇"或者"集群".云这个词来源已不可考,也许是某个人在讲授PPT的时候,顺口说了一句"The Servers in the cloud"的吧,这样Cloud这个

【大话存储】学习笔记(7章), OSI模型

任何系统之间,如果需要通信,都需要一套自己的协议系统.这个协议系统一般要定义互相通信的语言,以及硬件. OSI是被提取抽象出来的系统间通信模型,中文意思是"开放式系统互联",是描述多个系统之间交流的通用模型. OSI模型 OSI初步 在讲OSI之间,我们首先看一个例子,PC a向PC b发送数据包的过程如下: a在内存中通过定义的语言生成数据包 将数据包通过总线传给TCP/IP协议处理单元,告诉对方的IP地址.UDP还是TCP.端口号 TCP/IP处理模块收到包之后,封装,通过总线发送

【大话存储】学习笔记(八),数据保护

第一章 数据保护 所谓数据保护是指对当前位置上的数据进行备份,不一定是实时的.这样带来的好处是如果发生磁盘损坏或者说被修改了,可以通过备份数据找回 1.1 文件级备份 文件级备份:将磁盘上所有文件通过调用文件系统接口备份到另一个介质上.也就是把数据以文件形式读出,然后存储在另一个介质上面. 可以看出,备份软件将文件备份到新的介质上,文件很大程度上是连续存放的.正因为如此不会备份元数据,利用新介质进行恢复的时候,会重构文件系统. 1.2 块级备份 块级备份就是不管块上是否有数据,不考虑文件系统的逻

【大话存储】学习笔记(一),磁盘

第一章 计算机的IO世界 1.1 总线 1.1.1 总线的概念 计算机中所有的IO都通过共享总线的方式来实现. 总线实际上就是一条或多条的物理导线.密密麻麻的印到电路板上,而且为了避免高频振荡的干扰,一般都会分组印刷到不同的电路板上,然后压合起来. 1.1.2 总线的分类 PCI总线是目前PC机与x86服务器普遍使用的南桥与外设连接的总线技术. PCI总线的地址总线和数据总线是分时复用的,这样可以节省管脚数量. 在数据传输时,PCI协议上有三种不同的角色 主,也就是发起者 从,Target或者S

《大话设计模式》学习笔记15:组合模式

公司管理系统示例: 1.Component: public abstract class Company { protected string name; public Company(string name) { this.name = name; } public abstract void Add(Company company); public abstract void Remove(Company company); public abstract void Display(int

【大话存储II】学习笔记(15章),文件级集群系统

[大话存储II]学习笔记(15章),块级集群存储系统里面分析的主要是块集群系统,同样文件级存储也可以集群化. 因为NAS系统的前端网络是以太网,速度比较低,导致NAS主要用于一些非关键业务中,比如文件共享.但是一些特殊应用也需要多主机同时访问某个大文件,比如3D渲染集群等.如果我们使用块集群存储系统,则会存在一个问题,需要在应用程序上引入文件锁,而NAS的文件系统一般都自带有文件锁机制,所以还不如把NAS存储系统进行集群化. 在谈怎么样把NAS系统进行集群化之前,我们说说集群文件系统的架构.集群