nosql引擎,数据库 nosql

大型互联网架构概述,看完文章又涨知识了

1. 大型网站系统的特点

成都创新互联公司-专业网站定制、快速模板网站建设、高性价比月湖网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式月湖网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖月湖地区。费用合理售后完善,十载实体公司更值得信赖。

2. 大型网站架构演化历程

2.1. 初始阶段架构

问题:网站运营初期,访问用户少,一台服务器绰绰有余。

特征:应用程序、数据库、文件等所有的资源都在一台服务器上。

描述:通常服务器操作系统使用 linux,应用程序使用 PHP 开发,然后部署在 Apache 上,数据库使用 Mysql,通俗称为 LAMP。汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了。

2.2. 应用服务和数据服务分离

问题:越来越多的用户访问导致性能越来越差,越来越多的数据导致存储空间不足,一台服务器已不足以支撑。

特征:应用服务器、数据库服务器、文件服务器分别独立部署。

描述:三台服务器对性能要求各不相同:应用服务器要处理大量业务逻辑,因此需要更快更强大的 CPU;数据库服务器需要快速磁盘检索和数据缓存,因此需要更快的硬盘和更大的内存;文件服务器需要存储大量文件,因此需要更大容量的硬盘。

2.3. 使用缓存改善性能

问题:随着用户逐渐增多,数据库压力太大导致访问延迟。

特征:由于网站访问和财富分配一样遵循二八定律:80% 的业务访问集中在 20% 的数据上。将数据库中访问较集中的少部分数据缓存在内存中,可以减少数据库的访问次数,降低数据库的访问压力。

描述:缓存分为两种:应用服务器上的本地缓存和分布式缓存服务器上的远程缓存,本地缓存访问速度更快,但缓存数据量有限,同时存在与应用程序争用内存的情况。分布式缓存可以采用集群方式,理论上可以做到不受内存容量限制的缓存服务。

2.4. 使用应用服务器集群

问题:使用缓存后,数据库访问压力得到有效缓解。但是单一应用服务器能够处理的请求连接有限,在访问高峰期,成为瓶颈。

特征:多台服务器通过负载均衡同时向外部提供服务,解决单一服务器处理能力和存储空间不足的问题。

描述:使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。

2.5. 数据库读写分离

问题:网站使用缓存后,使绝大部分数据读操作访问都可以不通过数据库就能完成,但是仍有一部分读操作和全部的写操作需要访问数据库,在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。

特征:目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到一台服务器上。网站利用数据库的主从热备功能,实现数据库读写分离,从而改善数据库负载压力。

描述:应用服务器在写操作的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库。这样当应用服务器在读操作的时候,访问从数据库获得数据。为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离的对应用透明。

2.6. 反向代理和 CDN 加速

问题:中国网络环境复杂,不同地区的用户访问网站时,速度差别也极大。

特征:采用 CDN 和反向代理加快系统的静态资源访问速度。

描述:CDN 和反向代理的基本原理都是缓存,区别在于 CDN 部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器时反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。

2.7. 分布式文件系统和分布式数据库

问题:随着大型网站业务持续增长,数据库经过读写分离,从一台服务器拆分为两台服务器,依然不能满足需求。

特征:数据库采用分布式数据库,文件系统采用分布式文件系统。

描述:分布式数据库是数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用。不到不得已时,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。

2.8. 使用 NoSQL 和搜索引擎

问题:随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂。

特征:系统引入 NoSQL 数据库及搜索引擎。

描述:NoSQL 数据库及搜索引擎对可伸缩的分布式特性具有更好的支持。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。

2.9. 业务拆分

问题:大型网站的业务场景日益复杂,分为多个产品线。

特征:采用分而治之的手段将整个网站业务分成不同的产品线。系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。

描述:应用之间可以通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。

纵向拆分:将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的 Web 应用系统。纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。

横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。

2.10. 分布式服务

问题:随着业务越拆越小,存储系统越来越庞大,应用系统整体复杂程度呈指数级上升,部署维护越来越困难。由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。

特征:公共业务提取出来,独立部署。由这些可复用的业务连接数据库,通过分布式服务提供共用业务服务。

3. 大型网站架构模式

3.1. 分层

大型网站架构中常采用分层结构,将软件系统分为应用层、服务层、数据层:

分层架构的约束:禁止跨层次的调用(应用层直接调用数据层)及逆向调用(数据层调用服务层,或者服务层调用应用层)。

分层结构内部还可以继续分层,如应用可以再细分为视图层和业务逻辑层;服务层也可以细分为数据接口层和逻辑处理层。

3.2. 分割

将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元。这有助于软件的开发和维护,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。

3.3. 分布式

大于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。

分布式意味可以用更多的机器工作,那么 CPU、内存、存储资源也就更丰富,能够处理的并发访问和数据量就越大,进而能够为更多的用户提供服务。

分布式也引入了一些问题:

常用的分布式方案:

3.4. 集群

集群即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。

集群需要具备伸缩性和故障转移机制:伸缩性是指可以根据用户访问量向集群添加或减少机器;故障转移是指,当某台机器出现故障时,负载均衡设备或失效转移机制将请求转发到集群中的其他机器上,从而不影响用户使用。

3.5. 缓存

缓存就是将数据存放在距离最近的位置以加快处理速度。缓存是改善软件性能的第一手段。

网站应用中,缓存除了可以加快数据访问速度以外,还可以减轻后端应用和数据存储的负载压力。

常见缓存手段:

使用缓存有两个前提:

3.6. 异步

软件发展的一个重要目标和驱动力是降低软件耦合性。事物之间直接关系越少,彼此影响就越小,也就更容易独立发展。

大型网站架构中,系统解耦的手段除了分层、分割、分布式等,还有一个重要手段——异步。

业务间的消息传递不是同步调用,而是将一个业务操作拆分成多阶段,每个阶段间通过共享数据的方式异步执行进行协作。

异步架构是典型的生产者消费模式,二者不存在直接调用。异步消息队列还有如下特性:

3.7. 冗余

大型网站,出现服务器宕机是必然事件。要保证部分服务器宕机的情况下网站依然可以继续服务,不丢失数据,就需要一定程度的服务器冗余运行,数据冗余备份。这样当某台服务器宕机是,可以将其上的服务和数据访问转移到其他机器上。

访问和负载很小的服务也必须部署 至少两台服务器构成一个集群,目的就是通过冗余实现服务高可用。数据除了定期备份,存档保存,实现 冷备份 外;为了保证在线业务高可用,还需要对数据库进行主从分离,实时同步实现 热备份。

为了抵御地震、海啸等不可抗因素导致的网站完全瘫痪,某些大型网站会对整个数据中心进行备份,全球范围内部署 灾备数据中心。网站程序和数据实时同步到多个灾备数据中心。

3.8. 自动化

大型网站架构的自动化架构设计主要集中在发布运维方面:

3.9. 安全

4. 大型网站核心架构要素

架构 的一种通俗说法是:最高层次的规划,难以改变的决定。

4.1. 性能

性能问题无处不在,所以网站性能优化手段也十分繁多:

4.2. 可用性

可用性指部分服务器出现故障时,还能否对用户提供服务

4.3. 伸缩性

衡量伸缩的标准就是是否可以用多台服务器构建集群,是否容易向集群中增删服务器节点。增删服务器节点后是否可以提供和之前无差别的服务。集群中可容纳的总服务器数是否有限制。

4.4. 扩展性

衡量扩展性的标准就是增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或很少改动,既有功能就可以上线新产品。主要手段有:事件驱动架构和分布式服务。

4.5. 安全性

安全性保护网站不受恶意攻击,保护网站重要数据不被窃取。

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

AWS开源可跨关联式与NoSQL数据库的查询语言PartiQL

AWS推出了与SQL兼容的查询语言PartiQL,只要数据库查询引擎提供PartiQL支持,使用者就能以PartiQL单一查询关联式数据库的结构化资料,以及开放资料格式中的巢状资料或是半结构化资料,甚至还能用来查询NoSQL或是文件数据库中无固定结构(Schema-less)的资料。除了AWS自家的数据库服务,NoSQL数据库Couchbase Server也承诺将会支持PartiQL。

企业资料分散在关联式数据库、非关联式数据库以及资料湖泊中。高度结构化的资料,储存在SQL数据库或是资料仓储;无固定结构的资料则由键值储存、图形数据库(Graph Database)、分类帐数据库或是时间序列数据库等NoSQL数据库处理;而在资料湖泊中的资料,可能也有部分缺乏结构,或是可能为巢状或是多值结构。不同的资料类型适用于不同的使用案例,而每种类型的资料,可能都有自己的查询语言。

不同的资料储存对应不同的查询语言,当企业更换资料格式或是数据库引擎时,可能还需要跟着改变应用程式和查询语法,AWS提到,这对于资料的应用,特别是使用资料湖泊的灵活性与效率,有着很大的阻碍。为了统一不同类型数据库存取方法,AWS发布了查询语言PartiQL,这是个与SQL兼容的查询语言,可以用来查询以各种格式储存在各地的资料。

用户可以使用PartiQL来查询关联式数据库,像是在Redshift实作交易或是资料分析等应用,或对于Amazon S3资料湖泊的开放资料格式,同样能使用PartiQL对巢状资料与半结构化资料例如Amazon Ion格式进行查询,另外,PartiQL也可用于文件数据库等NoSQL数据库,查询无固定结构的资料。

AWS表示,PartiQL的出现,是为了满足自家查询和转换大量资料的需求,其提供严格的SQL兼容性,可与标准SQL混合使用,执行连接(Join)、过滤(Filtering)与聚合(Aggregation)操作,并以最小扩充支持巢状和半结构化资料,让开发者以简单且一致的方法,不需要更改查询语言,就能查询各种格式和服务的资料。

PartiQL具格式独立性与储存独立性,PartiQL语法和语义不依赖任何资料格式,无论使用者是要查询JSON、Parquet、ORC、CSV还是Ion等格式,查询语句的写法都相同,PartiQL的查询在综合逻辑类型系统上运作,才对应到不同底层的格式。而PartiQL也不相依于特定资料储存,因此适用于不同的底层资料储存。

虽然过去针对跨不同类型数据库查询的问题,已有不少解决方案,AWS指出,像是Postgres JSON同样也兼容于SQL,但是却无法良好地处理JSON巢状资料;而半结构化查询语言,虽然能良好处理巢状资料,但却无法与SQL语言兼容。AWS提到,PartiQL是第一个能够完全解决这些问题的查询语言。

目前AWS已在自家多项服务支持PartiQL,包括Amazon S3 Select、Amazon Glacier Select、Amazon Redshift Spectrum、Amazon QLDB,接下来几个月将会有更多的AWS服务支持PartiQL,Couchbase也公布将加入支持PartiQL的行列。现在PartiQL以Apache2.0授权许可开源,公开教学、规范以及参考实作,所有社群都能使用并参与贡献。

为什么选择NoSQL数据库如此困难

传统观念中 NoSQL数据库非常适合某些数据类型,如:非关系数据源。同时,NoSQL被吹捧为最适合Web应用程序的优秀平台。然而他适合大多数数据,特别是web应用程序的数据是相关型。那么,这是否可以给你一个坚持使用RDMS的理由呢?也不一定,即使很困难,我们还是要做出选择。

评估NoSQL是一个很茅盾的理论,一些人认为,应该将所有文档数据存储在一个文档中,做链接代码就是亵渎神明。另外一部分人认为,存储应用文档,加入代码,才是合理选择。与此同时,不同的数据库,需要在文档中限制嵌套数据数量。有的人会鼓励文档引用。这是NoSQL数据模型的基本部分,也没有一个明确的共识。

曾经有一篇很热的帖子"Why you should never use XYZ",我想,读到这里,一定会有人搜索这篇文章。当然,这种文章各式各样,太过于笼统的标题也没什么帮助。毫无疑问,会有人会搜索这个文章,然后再找

到这个文章,进一步深入,找到该文章的方法远比成功(理解问题)的故事多。很难知道谁提供了一个有效的技术问题,谁又误读了这个问题(或者缺少证据证明其观点)。

有大量选择,RDBMS的世界,选择就很容易。你有4或5个目标,大家工作方式差不多,来选择环境、预算支持的平台。对于成熟的产品,风险比较小。 NoSQL的世界,有很多数据库引擎功能选择。每一个有自己的独特优势,也有致命弱点。所以选择很难, NoSQL项目生命周期短,尝试新项目或者流行项目也会有风险。上次,我的的项目是在 CouchDB上,而现在似乎停摆了。

做出这个痛苦决定的原因是,这可能是一个案例:你需要做一大堆工作,才能知道,你做出的选择对与错。你可以实体化你的数据模型,了解他与系统的工作情况,但是,这只有你正真撞到南墙,才可以找到裂缝(答案)。以我为例,我建的应用程序是关系数据库,移动文件存储的主要因素是,需要一个无模式设计来达到我的目标。使用NoSQL 数据库存储关系型数据库并不是我们所常说的,虽然,这种事常常发生。

现在我在用 Couchbase 和 MongoDB,Mongo对我没多大吸引力,不过鉴于他非常流行,对于引起来说,很有好处。当然,很多都可以以同样的方式流行。PHP很流行,因为他的易用性,而不是因为他很好。

高性能 NoSQL

关系数据库经过几十年的发展,已经非常成熟,但同时也存在不足:

表结构是强约束的,业务变更时扩充很麻烦。

如果对大数据量的表进行统计运算,I/O会很高,因为即使只针对某列进行运算,也需要将整行数据读入内存。

全文搜索只能使用 Like 进行整表扫描,性能非常低。

针对这些不足,产生了不同的 NoSQL 解决方案,在某些场景下比关系数据库更有优势,但同时也牺牲了某些特性,所以不能片面的迷信某种方案,应将其作为 SQL 的有利补充。

NoSQL != No SQL,而是:

NoSQL = Not Only SQL

典型的 NoSQL 方案分为4类:

Redis 是典型,其 value 是具体的数据结构,包括 string, hash, list, set, sorted set, bitmap, hyperloglog,常被称为数据结构服务器。

以 list 为例:

LPOP key 是移除并返回队列左边的第一个元素。

如果用关系数据库就比较麻烦了,需要操作:

Redis 的缺点主要体现在不支持完成的ACID事务,只能保证隔离性和一致性,无法保证原子性和持久性。

最大的特点是 no-schema,无需在使用前定义字段,读取一个不存在的字段也不会导致语法错误。

特点:

以电商为例,不同商品的属性差异很大,如冰箱和电脑,这种差异性在关系数据库中会有很大的麻烦,而使用文档数据库则非常方便。

文档数据库的主要缺点:

关系数据库是按行来存储的,列式数据库是按照列来存储数据。

按行存储的优势:

在某些场景下,这些优势就成为劣势了,例如,计算超重人员的数据,只需要读取体重这一列进行统计即可,但行式存储会将整行数据读取到内存中,很浪费。

而列式存储中,只需要读取体重这列的数据即可,I/O 将大大减少。

除了节省I/O,列式存储还有更高的压缩比,可以节省存储空间。普通行式数据库的压缩比在 3:1 到 5:1 左右,列式数据库在 8:1 到 30:1,因为单个列的数据相似度更高。

列式存储的随机写效率远低于行式存储,因为行式存储时同一行多个列都存储在连续空间中,而列式存储将不同列存储在不连续的空间。

一般将列式存储应用在离线大数据分析统计场景,因为这时主要针对部分列进行操作,而且数据写入后无须更新。

关系数据库通过索引进行快速查询,但在全文搜索的情景下,索引就不够了,因为:

假设有一个交友网站,信息表如下:

需要匹配性别、地点、语言列。

需要匹配性别、地点、爱好列。

实际搜索中,各种排列组合非常多,关系数据库很难支持。

全文搜索引擎是使用 倒排索引 技术,建立单词到文档的索引,例如上面的表信息建立倒排索引:

所以特别适合根据关键词来查询文档内容。

上面介绍了几种典型的NoSQL方案,及各自的适用场景和特点,您可以根据实际需求进行选择。


当前文章:nosql引擎,数据库 nosql
标题网址:http://myzitong.com/article/dscisjj.html