简单认识NoSql

618 阅读16分钟

写在前面: 这是一篇用于在学校《云计算导论》课程中介绍nosql的稿子

什么是Nosql

NoSQL,也被称为“不仅仅是SQL”(not only SQL)、“非SQL” (non-sql),是一种数据库设计方法,使得数据的存储和查询可以超越传统的关系数据库结构。虽然它仍然可以存储在关系数据库中找到的数据,但与RDBMS相比,它以不同的方式存储数据。

非关系型数据库(NoSQL数据库)不使用传统的关系数据库表格结构,而是将数据存储在单一数据结构中,例如JSON、key-value键值对。由于这种非关系型数据库设计不需要模式,因此可以快速扩展以管理大型且非结构化的数据集。

为什么会诞生Nosql

互联网企业在网络时代使用传统的关系型数据库。在2000年代中期,随着互联网的普及,像亚马逊和谷歌这样的公司看到了流量和数据的激增。关系型数据库,如MySql、Postgres、Oracle等,不能在保证acid的同时很好的进行水平拓展。亚马逊推出了SimpleDB,谷歌推出了BigTable,以克服RDBMS的限制。这两个非关系型数据库的出现引发了科技界的兴趣。2009年,Johan Oskarsson组织了一次聚会,讨论分布式非关系型数据库。

NoSQL数据库采用了不同的数据模型,例如文档、键值对、图形等,可以更好地适应非结构化数据的存储和处理。同时,NoSQL数据库通常是分布式的,并且具有高可扩展性、高性能和灵活性等特性,可以满足互联网应用的需求。

为什么我们需要水平拓展

答案很简单。由于一台机器能存储的数据量有限,我们不得不采用横向扩展的方式。我们购买100多台大的服务器,将数据和流量分布在这些机器上。

同时水平扩展可以通过增加廉价的节点来实现,相比于垂直扩展需要购买更昂贵的硬件设备,水平扩展更为经济实用。

RSDBMS不是为水平扩展而设计的:

一方面,水平扩展需要将数据分布到多个节点上,这意味着数据的分布式处理和存储,数据的一致性和隔离性需要通过复杂的算法和协议来实现。例如,分布式事务需要协调多个节点之间的数据更新,保证数据的一致性和隔离性,这会带来较高的性能开销和复杂性。

另一方面,水平扩展需要考虑节点之间的负载均衡和故障恢复等问题,这也需要复杂的算法和协议来实现。例如,数据分片需要考虑数据的分布均衡和故障恢复,这需要对数据进行分片和备份,以保证数据的可用性和持久性。

传统RDBMS遵循ACID原子性,但nosql普遍遵循BASE理论

为什么NoSQL易于进行水平扩展

NoSQL数据库通常采用非结构化的模型来存储数据。在进行水平扩展时,NoSQL数据库可以更容易地进行数据分片和分布式处理。

同时相比于RDBMS所坚持的acid,NoSQL通常遵循BASE理论,这强调系统的可用性和性能,而不是严格的数据一致性。

对比Nosql和传统rdbms

RDBMS

传统关系型数据库主要优势在于处理结构化数据,或是变量与实体之间有关系的数据。

传统关系型数据库使用关系模型进行数据储存。这是一种严格预定义的模式,它需要在开始使用 SQL 数据库之前组织和结构化数据。

关系模型

使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。 关系数据模型中,无论是是实体、还是实体之间的联系都是被映射成统一的关系一-张二 维表,在关系模型中,操作的对象和结果都是一张二 维表,它由行和列组成; 关系型数据库可用于表示实体之间的多对多的关系,只是此时要借助第三个关系一表,来实现多对多的关系;

特性

使用 SQL 的 RDBMS 必须展示四个属性,以首字母缩略词 ACID 为人所知。这些确保事务处理成功并且 SQL 数据库具有高级别的可靠性:

  • 原子性: 即使在系统故障的情况下,所有事务都必须完全成功或完全失败,并且不能部分完成。
  • 一致性: 数据库必须遵循在每一步验证和防止损坏的规则。
  • 隔离性: 并发事务不能相互影响。
  • 持久性: 交易是最终的,即使系统故障也无法“回滚”一个完整的交易。

这确保了数据的一致性和可靠性,但也限制了系统的可扩展性和性能。

NoSql

与 SQL 不同,NoSQL 系统允许您在数据库中使用不同的数据结构。因为它们允许非结构化数据的动态模式,所以预先计划和预先组织数据的需要较少,并且更容易进行修改。NoSQL 数据库允许您添加新的属性和字段,以及跨数据库使用不同的语法。

结构

NoSQL 数据库不是关系型的,因此它们不仅仅将数据存储在行和表中。相反,它们通常属于以下四种结构之一:

  • 列储存, 其中数据存储在单元格中,这些单元格按几乎无限数量的列而不是行分组。
  • 键值对存储,它使用关联数组(也称为字典或映射)作为其数据模型。该模型将数据表示为键值对的集合。
  • 文档存储,它使用文档以标准格式保存和编码数据,包括 XML、YAML、JSON(JavaScript 对象表示法)和 BSON。一个好处是单个数据库中的文档可以具有不同的数据类型。
  • 图形数据库,它表示图形上的数据,显示不同数据集如何相互关联。Neo4j、RedisGraph(内置于 Redis 中的图形模块)和 OrientDB 是图形数据库的示例。

特性

nosql主要使用cap理论进行设计,而不必遵循rdbms的acid原则,why?

由于NoSQL数据库在大规模分布式系统中具有更高的可扩展性和性能,因此它们通常更加注重可用性和分区容错性(AP),而不是强一致性。这就是为什么NoSQL数据库使用CAP理论而不是ACID原则的主要原因

强一致性:强一致性要求系统中的所有节点在同一时间具有相同的数据副本,即所有节点的数据在同一时间都是一致的。这意味着在每个操作之后,系统必须立即保证数据的一致性。强一致性通常需要较高的网络延迟和通信成本,因此不适合大规模分布式系统。

最终一致性:相对地,最终一致性允许节点之间在一段时间内存在数据不一致的情况,但最终会达到一致状态即为最终一致性。

cap理论

CAP理论是分布式系统设计中的一个基本理论,它指出一个分布式系统最多只能同时满足三个属性中的两个,这三个属性分别是一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),也被称为CAP三元素。

image-20230421202226270

CAP理论往往运用于数据库领域,同样可以适用于分布式存储方向

  • CA:放弃分区容错性,加强一致性和可用性, 其实就是传统的单机数据库的选择
  • AP:放弃一致性(这里说的一致性是强一 致性), 追求分区容错性和可用性, 例如一些注重用户体验的系统
  • CP:放弃可用性,追求一致性和分区容错性, 例如与钱财安全相关的系统

应用场景

NoSql特点

  1. 无模式 关系型数据库有一个僵硬的模式。用户必须经过多次迭代才能对数据进行建模。

    NoSQL通过提供灵活的模式克服了这个限制。这些数据库从用户那里抽象出了数据存储和内部工作。他们提供支持来存储用户定义的数据结构。由于与模式无关,NoSQL数据库也被称为 "读模式 "数据库。你只需要在读取数据时知道数据是如何存储的。

  2. 非关系型

    关系型数据库将数据组织成行和列。你可以在许多表中存储数据,并且这些表可以有不同的关系。为了获取数据,你可以在一个属性的值上连接这些表。当需要连接的表的数量达到两位数或更高时,应用程序的性能就会下降。如果应用程序连接存储在不同数据库服务器上的表,速度就会明显下降。

    NoSQL数据库是非标准化的。在NoSQL数据库中没有记录之间关系的概念。这意味着你只在一个表中存储汇总的数据,而不是将其分散在不同的表中。

  3. 高可扩展性和可用性

    随着非结构化数据量的指数式增长,在一台机器上存储数据变得很困难。关系型数据库需要专门的硬件,在不影响性能的情况下为负载服务。因此,为了扩大规模,必须设计一个能在计算机集群上存储数据并有效检索的系统。

    NoSQL数据库使用商品服务器,这比高性能的服务器要便宜。随着数据存储需求的增加,可以增加更多的商品服务器。如果使用集群部署,NoSQL数据库使用一致哈希算法将数据均匀地分布在服务器集群上。

NoSql的优势

  1. 高可扩展性:NoSQL数据库可以轻松地水平扩展(即增加更多的节点),从而提高系统的处理能力和容量,而不需要像RDBMS那样进行垂直扩展(即增加更多的硬件资源)。
  2. 高性能:NoSQL数据库通常具有更快的读写速度和更低的延迟,这是因为它们采用了一些优化技术,例如内存存储、缓存和异步写入。
  3. 灵活的数据模型:NoSQL数据库通常采用非结构化或半结构化的数据模型,例如文档、图形或键值对,这使得它们可以更好地适应不同类型和格式的数据。
  4. 低成本:NoSQL数据库通常可以在廉价的硬件上运行,并且不需要像RDBMS那样进行复杂的数据建模和规范化,因此可以降低总体成本。
  5. 分布式架构:NoSQL数据库通常是分布式的,可以在多个节点上运行,并且具有高可用性和容错性,这使得它们在大规模分布式系统中更加适用。

应用场景

  1. 大数据量、高并发、分布式场景:NoSQL数据库可以轻松地水平扩展,从而满足大数据量、高并发和分布式应用的需求。
  2. 非结构化、半结构化数据场景:NoSQL数据库可以支持多种数据模型,例如文档、键值对、图形等,可以更好地适应非结构化和半结构化数据的存储和处理。
  3. 高性能、低延迟场景:NoSQL数据库通常具有更快的读写速度和更低的延迟,可以满足需要高性能和低延迟的应用程序的需求,例如游戏、广告、实时分析等。
  4. 复杂查询、高灵活性场景:NoSQL数据库通常支持高度灵活的查询语言,可以支持复杂的查询和分析操作,例如搜索、推荐、数据挖掘等。
  5. 云计算、微服务场景:NoSQL数据库可以轻松地与云计算和微服务架构集成,可以支持多租户、高可用性、容错性等特性。

介绍现有几类nosql

redis

Redis(代表REmote DIctionary Server)是一个开源的、基于内存的、使用键值对存储,主要用作应用缓存或快速响应数据库。由于它将数据存储在内存中,而不是磁盘或固态硬盘(SSD)上,Redis提供了无与伦比的速度、可靠性和性能。

  1. 高性能:Redis将数据存储在内存中,因此具有非常快的读写速度和低延迟。
  2. 支持多种数据类型:Redis支持多种数据类型,例如字符串、哈希表、列表、集合和有序集合等,可以满足不同类型的数据存储需求。
  3. 支持持久化:Redis支持将数据持久化到磁盘,可以保证数据的可靠性和持久性。
  4. 支持分布式:Redis支持分布式架构,可以通过分片和复制等技术实现数据的高可用性和扩展性。
  5. 支持事务和Lua脚本:Redis支持事务和Lua脚本,可以实现复杂的数据处理和业务逻辑。

Redis适用于以下场景:

  1. 缓存:Redis最常用的场景之一是作为缓存系统,可以将经常访问的数据存储在内存中,提高访问速度和性能。
  2. 计数器和排行榜:Redis支持原子操作和排序功能,可以用于实现计数器和排行榜等功能。
  3. 分布式锁:Redis支持分布式锁,可以保证多个进程或线程对共享资源的访问互斥。
  4. 发布/订阅:Redis支持发布/订阅功能,可以用于实现消息队列和事件驱动等场景。
  5. 数据存储:Redis支持多种数据类型,可以满足不同类型的数据存储需求,例如配置文件、用户信息、日志等。

mongoDB

MongoDB 文档或文档集合是数据的基本单位。这些文档格式为二进制 JSON,可以存储各种类型的数据并分布在多个系统中。由于MongoDB采用动态模式设计,用户在创建数据记录、通过MongoDB聚合查询文档集合和分析大量信息时,具有无与伦比的灵活性。

  1. 灵活的数据模型:MongoDB采用文档型数据模型,可以存储不同结构和类型的数据,支持嵌套和数组等复杂数据结构。
  2. 高性能:MongoDB具有高性能读写操作,支持基于文档的查询和索引,可以快速地处理海量数据。
  3. 分布式架构:MongoDB支持分片和副本集等分布式架构,可以实现数据的高可用性和扩展性。
  4. 强大的聚合框架:MongoDB提供了强大的聚合框架,支持复杂的数据聚合和分析操作。
  5. 丰富的查询语言:MongoDB支持丰富的查询语言,包括基本查询、范围查询、文本搜索、地理位置查询等,可以满足不同的查询需求。

MongoDB适用于以下场景:

  1. 大数据应用:MongoDB适用于需要处理大规模、高并发、复杂数据的应用场景,例如物联网、社交网络、电子商务等。
  2. 实时分析:MongoDB支持强大的聚合框架和复杂查询语言,适用于实时分析和数据挖掘等场景。
  3. 内容管理:MongoDB适用于需要存储和管理大量文档和多媒体内容的应用场景,例如博客、新闻、音乐等。
  4. 云计算:MongoDB可以轻松地与云计算架构集成,支持多租户、高可用性、容错性等特性。
  5. 日志管理:MongoDB可以用于存储和管理日志文件,例如应用日志、系统日志等。

clickhouse

列式储存(Columnar Storage)是将数据按照列存储,而不是按照行存储。这种方式适用于数据仓库等大规模数据处理场景,因为这些场景下通常需要对大量的数据进行聚合操作,例如 SUM、COUNT、AVG 等。在列式储存中,所有的值都按照类型存储在一起,这样可以提高数据压缩比率查询性能。同时,由于只需要读取需要的列,而不是整行,所以可以大大减少 I/O 操作,从而提高查询效率。

ClickHouse是一种基于列式存储的分布式数据仓库,具有以下特点:

  1. 高速查询:ClickHouse采用列式存储结构,能够快速地进行聚合查询和复杂分析,支持亿级别的数据查询。
  2. 可扩展性:ClickHouse具有良好的水平扩展性和分布式架构,可以满足数据随着业务增长而不断扩展的需求。
  3. 高可靠性:ClickHouse有着内置的数据备份、自动故障转移、数据冗余等高可靠性特性,可以保证数据的安全性和可靠性。
  4. 灵活的数据模型:ClickHouse支持多种数据类型和数据结构,可以存储不同类型和格式的数据。
  5. 易用性:ClickHouse具有良好的用户体验和易用性,支持多种客户端工具和API接口,可以方便地进行数据查询和分析。

ClickHouse适用于以下场景:

  1. 数据分析:ClickHouse具有高速的查询和分析能力,适用于大量数据的实时查询和分析,例如广告数据、日志数据等。
  2. 时序数据:ClickHouse支持时序数据的高效存储和查询,可以满足物联网、金融、电信等领域的时序数据分析需求。
  3. 实时BI:ClickHouse可以实现实时BI系统,支持复杂数据分析和多维数据查询,可以满足企业级的数据分析和决策需求。
  4. 数据仓库:ClickHouse可以作为数据仓库,支持离线数据导入和实时数据分析,可以满足企业级的数据管理和分析需求。
  5. 数据存储:ClickHouse可以作为数据存储,支持多种数据类型和数据结构,可以存储不同类型和格式的数据。