站内链接:

NoSQL

三大原则

  1. ACID

现在让我们聊聊为什么关系型数据库在某些应用场景中性能大大落后于 NoSQL 数据库, 传统关系型数据库遵循事务处理的四个基本要求(ACID):

  • Atomicity(原子性): 原子性要求数据库事务中的操作是一个不可分割的原子单位,要么全部执行成功,要么全部回滚
  • Consistency(数据一致性): 数据库要处于一致状态, 事务的执行不会更改数据库的一致性原则, 例如两个账户转账, 则两个账户数据必须保持一致
  • Isolation(隔离性): 隔离性要求并发执行的多个事务之间互相隔离,每个事务都应该感知不到其他事务的存在。事务应该具有隔离性,以避免并发执行时出现脏读、不可重复读和幻读等问题,保证数据的准确性和一致性。
  • Durability(持久性): 一旦事务提交, 其修改就永久的保存在数据库上, 即使宕机数据也不会丢失

关系型数据库为了保证ACID特性, 确保各种复杂的多表关联查询, 在设计时必须遵循这些范式, 其中每一个表都是存储在一个格式化的数据
结构中, 并且每一个元祖(每一条记录)组成都是一样且必须分配相应的存储空间, 以便表与表之间的链接操作, 这种复杂的范式逻辑成为了关系性数据库的瓶颈.

  1. BASE

BASE 原则是指在分布式系统设计中的一种理念,它是对 ACID(原子性、一致性、隔离性、持久性)原则的一种补充和扩展, 其牺牲高一致性, 获取可用性和可靠性:

  • Basically Available(基本可用): 系统保证基本的可用性,即系统在面临故障或部分失效的情况下仍能保持可用状态,尽可能地提供服务
  • Soft State(软状态或者柔性状态): 系统中的数据状态可以在一段时间内是不一致的,即系统允许一段时间内的数据不一致,但最终会达到一致状态
  • Eventual Consistency(最终一致性): 这是一种弱一致性, soft state 决定数据不能一直保持同步, 但此规则要求在一定的时间内保持数据一致性

BASE 原则是指在分布式系统设计中的一种理念,它是对 ACID(原子性、一致性、隔离性、持久性)原则的一种补充和扩展

  1. CAP

CAP 定理又称为布鲁尔定理, 其指出了一个分布式计算系统不能同时满足如下三点要求:

  • Consistency(数据一致性): 一致性要求所有节点在同一时间看到的数据是一致的,即数据更新操作在一定时间内被所有节点都观察到
  • Availability(可用性): 可用性要求系统在任何时刻都能够处理客户端的请求并返回有效的响应,即系统具有高可用性和可靠性
  • Partition tolerance(分区容错性): 分区容错性指系统能够在面临网络分区或节点故障的情况下继续正常工作

根据 CAP 原则,分布式系统可以在一致性和可用性之间做出权衡,但无法同时满足,从而产生了如下三大分类:

  • CA 原则: 满足一致性和可用性, 此情况通常是单点集群, 需要花费更多的性能维护数据的一致性, 传统的 RDBMS 就是这样.
  • CP 原则: 满足一致性和分区容错性, 若分区异常, 则分布式系统直接停止服务, 直到节点数据保持一致性为止, 例如 MongoDB, Hbase, Redis
  • AP 原则: 满足可用性和分区容错性, 放弃一致性,例如社交媒体、实时通信等

三者的关系图以及相应的数据库例子如下:

CAP原则

分区术语

  1. 分区现象和数据分片
  • 分区现象(Partitioning Phenomenon)指的是在分布式系统中,将数据分布在不同的节点上时,由于节点之间的通信和数据交互存在一定的延迟和开销,导致系统性能不如单节点系统。简单来说,分区现象指的是在分布式环境下由于数据分布和节点之间的通信导致的性能下降现象。

  • 数据分片(Data Sharding)是一种数据管理技术,它将数据集划分为多个较小的数据块,每个数据块称为一个分片(Shard),并将每个分片存储在不同的节点上。数据分片的目的是提高系统的并发性和扩展性,通过将数据分散存储在多个节点上,可以实现数据的并行处理和更好的负载均衡。

这两者的区别在于,分区现象是指在分布式系统中由于数据分布和节点间通信引起的性能下降现象,而数据分片是一种数据管理技术,将数据划分为多个分片进行存储。分区现象是对整个系统的性能影响的描述,而数据分片是一种具体的数据管理策略。

数据分片可以一定程度上缓解分区现象带来的性能问题,通过将数据分散存储在多个节点上,可以提高系统的并发性和吞吐量。

  1. 数据复制

数据复制是将数据的副本存储在不同的节点上,以提高系统的可用性和容错性。数据复制可以通过同步复制或异步复制的方式进行,这点类似 MySQL 的主从数据同步

  1. 数据局部性

类似 28 原则,在分布式系统中,节点访问的数据更有可能存储在附近的节点上,从而减少数据的远程访问,提高访问性能。

  1. 数据一致性协议

数据一致性协议是指在分布式系统中保证数据一致性的一种协议或机制。在分布式系统中,由于数据的复制和分布在不同的节点上,可能会面临数据一致性的问题,即不同节点上的数据副本可能存在不一致的情况。

常见的数据一致性协议包括:

  • Two-Phase Commit (2PC):两阶段提交协议是一种经典的数据一致性协议。它包括协调者和参与者两个角色,通过两个阶段的协作来保证所有参与者的数据操作要么全部提交,要么全部回滚。
  • Multi-Version Concurrency Control (MVCC):多版本并发控制是一种常见的并发控制技术,用于在分布式数据库中实现事务的隔离性和数据一致性。它通过为每个事务创建不同的版本(快照)来实现并发操作的隔离,从而保证数据的一致性。
  • Paxos:Paxos 是一种用于解决一致性问题的分布式算法。它通过选举和消息传递的方式,在节点之间达成共识,保证系统中的数据一致性。
  • Raft:Raft 是另一种分布式一致性算法,与 Paxos 类似,通过选举和日志复制的方式来保证数据的一致性。

这些协议每一个单独拿出来都需要讲解很久,我本人也是完全没有一个概念,后续有时间再了解,反正记得在分布式系统中有一个一致性协议,它确保了各个分片的数据一致性。

需求

随着 Web 2.0 网站的兴起, 传统的 SQL 数据库在处理超大规模和高并发的纯动态网站数据时往往显得更加力不从心,在处理海量数据存储, 高并发请求, 高可用性, 高扩展性方面, NoSQL 数据库能够更好的解决上述的场景. 当然, 相比 SQL 关系数据库, NoSQL 在复杂关系型场景中则更加不方便, 具体如何选择仍然需要考虑具体的应用场景. 那么何谓 Web 2.0?

  • User Centered(以用户为中心): 所有的内容都是由用户提供
  • Software as a Service(软件服务): 提供以网络为平台的软件服务
  • Data is King(海量数据): 内容为王, 通常具有大量的数据, 商业模式也是建立在用户消费这些海量数据的基础上
  • Convergence(内容开放性): 鼓励用户在其他地方使用他们的数据, 开放式的网络
  • Iterative Development(渐进式开发): 网站开发周期短, 一直在不间断的改动
  • Rich Browser Experience(丰富的浏览器体验): 少量的静态页面, 大量的动态页面, 各种和用户之间的互动
  • Multiple Delivery Channels(多种使用方式): 支持手机, pad, 电脑等
  • Social Networking(社会化网络): 社交元素, 在满足用户个性需求的基础上建立用户之间的联系
  • The Rise of the Individual Developer(个体开发者): 个体开发者只需要少量的人员就能建立一个较为健全的网站

那么 NoSQL 是如何解决 Web 2.0 网站的海量数据, 低延时需求呢?

  • 低延时的读写速度: 例如 k-v 数据库, 在不提供 SQL 数据库事务一致性, 关联性查询的前提下优化了整个数据库结构, 极大的提供读写速度
  • 低廉的成本: 大部分的分布式数据库都可以部署在低廉的硬件上, 并且大部分数据库都是开源数据库, 关系数据库随着规模的增加其硬件成本非常高
  • 简单的扩展: 分布式集群结构更利于集群的扩展

当然, 在实际的应用场景中, 至少本人的工作中碰到海量数据的需求还是很少的, 不过 K-V 数据库在作为缓存方面的性能远远高于 SQL 数据库
的性能的. 在大规模数据存储上, Hbase(本人用过) + hadoop 的框架结果在处理弱关系数据上的性能, 性价比也是远远高于 SQL 数据库的.
如果你使用 MYSQL 数据库, 一旦单表数据超过百万或者十万级别就需要开始考虑优化操作了, 在千万级别就需要考虑分表操作了, 如果一开始没有考虑到分表, 后续的线上数据分表真的是一个刺激又烦人的工作.

那么, 为何 NoSQL 数据库如何突破性能瓶颈呢?

架构分析

上面已经简单介绍了三大原则和 NoSQL,这里就结合这两部分,以此为切入点开始简单的介绍 NoSQL 是怎么突破性能瓶颈。

  1. NoSQL 和三大原则关系

NoSQL 在与 ACID、CAP 和 BASE 的关系如下:

  • ACID 和 NoSQL:传统的关系型数据库强调 ACID 原则,确保事务的原子性、一致性、隔离性和持久性。而 NoSQL 数据库通常以高可扩展性和性能为重点,可能在 ACID 特性方面做出一定的牺牲。某些 NoSQL 数据库提供部分 ACID 特性,但在分布式环境下可能会有一定的限制或变化。
  • CAP 和 NoSQL:CAP 原则指出,在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)这三个特性无法同时满足,最多只能同时满足其中两个。NoSQL 数据库通常倾向于保证可用性和分区容忍性,即在面对网络分区或故障时仍能提供可用的数据访问,而在一致性方面可能会有一定的柔性。
  • BASE 和 NoSQL:BASE 原则是对 ACID 原则的一种补充,它强调基于最终一致性(Basically Available, Soft-state, Eventually Consistent)。NoSQL 数据库通常倾向于采用 BASE 原则,即允许数据在一段时间内处于不一致的状态,通过异步的方式最终达到一致性。这样可以提高系统的可扩展性和性能,并适应大规模分布式环境下的数据存储和处理需求。

NoSQL 数据库在设计理念上与 ACID、CAP 和 BASE 存在一定的关联,但并非所有 NoSQL 数据库都完全符合 ACID、CAP 或 BASE 的特性。

  1. NoSQL 遵循的 CP 或者 PA(分区容忍性)原则

在分布式系统中, 网络必然会出现延迟丢包等问题, 集群之间的节点必须存在的加入离开, 例如 kafka, redis 集群, 所以分区容忍性是必须要遵守的原则, 分布式系统只能在 C/A 之间做选择. 对于不同分区之间的 Client-A, Client-B, 可能有如下情况

  • 网络绝对稳定, 此时整个分布式系统能够完全符合 CAP 原则, 即三个条件全满足
  • 网络故障, 此时无法提供服务或者只能提供read功能, 则表示此系统符合CP原则
  • 网络故障, 此时 DB 的更新操作在本地机房写, 后续通过 binlog/oplog 来同步, 此时能够提供服务, 但是后续分区之间的数据一致性可能会短暂不一致.

当然, 实际应用场景中分区容忍性-P现象发生的概率很小, 不应该为了容忍这种小概率时间而在设计的时候就考虑放弃了 A/C, 这种系统也没人会去使用,即使必须在A/C之间做选择, 也不应该粗粒度的在整个系统中做选择, 应该细粒度的考虑某一个子系统, CAP不是绝对二元式的有和无, 而应该看成一定意义上的有和无. 由此得出对传统CAP的修正步骤如下:

  • 识别网络分区是否已经发生
  • 在网络分区情况下进入明确的细粒度的分区模式, 限制某些子系统
  • 在网络分区现象解决之后能够进行善后处理, 恢复数据一致性或者其他错误

所以, 实际上大部分的分布式系统, 特别是云存储系统都采用另外一个原则-BASE来完成系统的设计. 基于BASE思想实现的分布式系统一般会符合如下两点:

  • 按照功能来划分数据库
  • 使用多个节点来存储数据, 即分区(sharding)功能.

上面讲述了ACID,其中 A 表示原子性, CAP, 其中 A 表示可用性, BASE, 其中 BA 表示基本可用, 三者之间的差别可用较为笼统的概括为:

  • ACID: 强调数据一致性, 类似 CAP 中的 CA 原则
  • BASE: 强调数据可用性, 弱化一致性, 类似 CAP 中的 AP 原则

当然, 上面也听到, 这并非绝对二元式的有和无, 而是一定程度上的有和无.

优势

那么为何在大数据时代, RDBMS 相比 NoSQL 扩展性更难? 性能更低呢?

  1. 从存储结构上来说, RDBMS 是按照行存储的, 即使按照某一列来进行计算仍然会提取整行数据, 导致 IO 负载较高;
  2. 表结构是固定的, 有关联性, 一旦想要扩表, 那么就只能在寂静的凌晨开始进行表结构的扩展, 锁表导致服务不可用那就头大了
  3. 从存储数据性能上考虑, 大量的数据起始并非所有字段都有值, 无需分配额外的存储空间, 但是 RDBMS 会为每一列分配固定内存, 不像 Mongodb 等
  4. 从存储数据类型上考虑, RDBMS 不支持存储数据结构, 而大部分的 NoSQL 则没有这种限制.

总之, NoSQL 和 RDBMS 两者在各自擅长的领域都是对方无法替代的, 在不同的应用场景需要根据具体情况来选择不同的 DB.

数据库

列式数据库

  1. 原理

RDBMS 使用行式存储, 其更适用于 OLTP(online transaction processing, 联机事务处理), 而对于 OLAP(online analytical processing,
联机分析处理), 使用 NoSQL 中的列式存储更加适合. 那么OLTPOLAP的数据都有哪些特点呢? 他们都有哪些区别? 具体见OLTP and OLAP的说明.

好了, 现在让我们回归到行式存储列式存储, 大学阶段学习过操作系统课程的同学都了解, 数据在存储中的某一层级的单位是页, 每一次读取实际上就是一次 IO 操作, 那么我们假设一个数据库中某一个表格的数据存储总量为 2 页, 其中行式存储列式存储结构分别为:
行式存储
列式存储

对于传统数据场景, 使用 SQL 查询语句:

1
select 字段1,字段2 from table where 字段1='col1value1'

如果以行式存储, 仅仅需要扫描page1页面就可以, 如果是列式存储, 则需要搜索page1, page2两个页面. 所以一般而言, RDBMS 都是
行式存储. 那么OLAP下的典型查询语句呢? 其多为复杂的分析操作, 侧重决策支持, 其查询类似的 SQL 如下:

1
select avg(字段2) from table

这里可以明显的看出, 如果使用行式存储, 则一旦执行上面的语句, 则会搜索所有的页面数据, 造成的额外 IO 负载是非常高的.目前常见的列式数据库有两个:

  • HBase: 参考 BigTable 的一个开源的 NoSQL, 为 hadoop 提供类似 BigTable 规模的服务, 可容错的存储海量稀疏数据
  • BigTable: 基于 Google File system 的数据存储系统, 一种压缩的, 高性能的, 高可扩展性的存储大规模结构化数据的数据库

关于谷歌 bitTable 论文见Google BigTable

  1. 优缺点

列式数据库在特定的应用场景, 特别是大数据应用场景下有非常大的优点:

  • 高效的存储空间利用率: 根据不同的数据特征使用不同的算法, 压缩比可以达到 8:130:1, 行式数据库一般为 3:15:1, 例如字典表压缩, 见下文
  • 查询效率高: 在 OLAP 场景下, 查询效率相比行式存储更改, IO 查询次数更少
  • 对大规模数据以及数据聚合更加适合

当然, 其缺点也是存在的:

  • 不适合小数据
  • 不适合随机更新
  • 不适合含有删除和更新的实时操作, 对于大数据分析场景, 很少有删除和更新操作
  • 不支持多行数据的回滚操作

字典表压缩的实例

k-v 数据库

  1. 原理

K-V 数据库是指以键值来进行存储的数据, 数据根据键值对来进行组织, 索引, 存储. 类同于列式数据库, k-v也有其特定的应用场景,在特定的场景下, 其性能相比其他数据库有着巨大的优势, 其中的 redis 甚至将数据存储到内存中以加快数据的读取和存储效率. k-v数据库用于存储不涉及过多数据关系业务的场景, 即使有一些关系, 也是通过开发者自身从逻辑意义上约定 key 来表示数据之间的关系. 目前常见的 K-V数据库有:

  • redis: 常用的缓存数据库, 使用 ANSI C 编写的开源, 基于内存以及可选持久 key-value 数据库
  • LevelDB: 嵌入式数据库管理系统编程库
  1. 优缺点

k-v数据库类似列式数据库, 当然还是有一些区别, 其优点:

  • 性能高, 其中 redis 的 TPS(Transactions Per Second, 服务器每秒处理事务个数)非常高, 达到万级别,10 万级别.
  • 丰富的数据类型, 这是类似列式数据库, 支持字符串, 字典, 数组等
  • 丰富的特性

缺点类似列式数据库:

  • 事务不支持回滚操作
  • 无法处理复杂数据类型

k-v数据库常常用于存储用户会话信息, 配置信息, 购物车等同 ID 键挂钩的信息, 但是不支持通过 value 来进行查询的使用场景, 因为其 value 的数据结构类型非常杂, 不可能对其做索引信息.

文档数据库

  1. 原理

文档型数据库是一个将半结构化数据存储为文档的一种数据库, 通常以 JSON 或者 XML 的形式来存储数据, 并且文档数据库相比列式数据库,
no-schema特性更加彻底, 所以其可以更加自由的存储/读取任意数据, 只要操作过 Mongodb 的人都知道, 这操作键值通过脚本语言是一模一样. 常见的文档数据库:

  • mongodb: 非常普通的面向文档的数据库管理系统, 这是一个开源数据库
  • CouchDB: 专注于易用性和成为”完全拥抱 web 的数据库”
  1. 优缺点

CouchDB具体没用过, 下面以 mongodb 使用经验为例, 文档数据库的优点:

  • 新增字段极其简单, 这个在前文也讲述过, 不像 RDBMS 那样存在固定的 schema 需要使用 DDL 来更改表结构, 而是随意的添加即可
  • 前后兼容简单, 即使增加了一个新字段, 对于历史数据的兼容也可以通过代码来完成
  • 容易存储复杂数据: 例如 json/xml

当然, 相比 RDBMS, 文档数据库的缺点类似上述的列式数据库, k-v数据库:

  • Atomicity(原子性)仅支持单行/文档级原子性(列式数据库也是)
  • Isolation(隔离性)隔离级别仅支持已提交读(Read committed)级别,可能导致不可重复读(见下文)
  • 不支持复杂查询, 当然这些都可以通过代码层面来支持, 实际上在文档数据库应用场景中, 此类复杂查询应该很少

文档数据库的使用场景类似列式数据库, 在大数据场景, 数据结构不确定性场景中有着极大的优势, 例如内容管理系统, 信息管理系统等.接下来, 让我们了解一下何谓脏读?何谓幻读?何谓不可重复读? 传统数据库例如 MYSQL 有四个隔离(isolation)级别:

  • Read uncommtted: 可以读取未提交数据的权限
  • Read commttied: 可以读取已提交数据的权限
  • Repeatable read: 可以重复读取数据的权限
  • Serializable: 可串行化权限

默认情况下, innoDB引擎支持隔离级别为 Repeatable. 那么这些隔离级别和脏读,幻读,不可重复读有什么关系?

脏读: 一个事务 A 中访问到了另外一个事务 B 未提交的数据, 此时读取的未提交数据仍然是不确定的结果, 所以为脏读, 当然 MYSQL 已经解决.
dirty_read.

幻读: 事务 A 连续读取两次查询, 但是得到的记录结果条数却是不同的.
phantom_read

不可重复读: 事务 A 读取同一条记录 2 次, 但是得到的结果却是不相同的, 注意上述都是在一个事务中的结果.
repeate_read

隔离级别就是为了解决上述 3 个问题产生的, 他们之间的关系如下:

  • Read Uncommitted: 排他写锁, 但会产生脏读, 幻读, 不可重复读
  • Read Committed: 瞬间共享读锁和排他写锁, 但会产生幻读, 不可重复读
  • Repeatable read: 共享读锁和排他写锁, 但会产生幻读
  • Serializable: 严格的事务隔离.

随着隔离级别提高, 数据的完整性和一致性越完善, 但是并发性能的也相应越低.

全文搜索引擎

  1. 原理

全文搜索引擎需求: 传统关系型数据库主要通过索引来达到快速查询的目的, 但是在全文搜索引擎场景下则会碰到问题:

  • 全文搜索的条件可以随意排列组合, 如果通过索引, 则会产生非常多的索引
  • 全文搜索的模糊匹配方式, 索引无法满足, 只能通过 like 查询, 但是 like 是整表扫描, 效率极低

全文搜索引擎使用倒排索引-invered index算法来建立索引, 从而建立单词文档的索引, 而正排索引则是建立文档到单词的索引. 关于倒排索引, 见inverted index. 目前常见的全文搜索搜索引擎有:

  • Elasticsearch: 基于 Lucene 的分布式搜索引擎, 能够全文搜索与发动机 HTTP Web 界面和无架构 JSON 文件
  • Solr: Apache Lucene 项目的开源企业搜索平台
  1. 优缺点

全文搜索引擎的优缺点以 Elastisearch 为例, 优点有:

  • 全文搜索查询效率高, 特别是海量数据
  • 可扩展性高, 这是大部分分布式系统的优点
  • 高可用 Elasticsearch 集群弹性

缺点则类似上文所述的列表数据库, 文档数据库, 对事务, 一致性的支持不是非常高:

  • ACID 支持不足, 对多个文档的事务不支持回滚操作
  • 读写有一定延时, 对于写入的数据, 最快 1S 内检索到
  • 更新性能较低
  • 内存占用大

其使用场景上面已经介绍过了: 分布式的搜索引擎, 数据分析引擎, 全文搜索引擎, 海量数据实时分析

术语详情

数据分片

Sharding 原理简单,容易实现,是一种非常好的解决数据库扩展性的方案。但是 Sharding 对应 用场景的要求很高,因为一旦使用数据分片架构,如果需要跨不同的节点做 join(多个数据分布在多个分片节点上),或者统计类型的操作,将会变得非常困难,应该尽量避免。所以说 Sharding 架构会损失部分关系型数据库的特性,比如 join,从而使数据库退化为 Key-Value store 类型的存储。所以,并不是所有的应用都适合做 Sharding,它可能会造成应用架构复杂或者限制系统的功能,这也是它的缺陷所在。

  • 水平分片(Horizontal Sharding):将数据按照某个字段或规则进行划分,将具有相同特征或范围的数据放置在同一个分片上。例如,可以按照用户 ID 或地理位置进行水平分片。
  • 垂直分片(Vertical Sharding):将数据按照不同的数据集合进行划分,将不同的数据集合存储在不同的分片上。例如,可以将用户信息和订单信息分别存储在不同的分片上。
  • 哈希分片(Hash Sharding):根据数据的哈希值将数据分配到不同的分片上。通过对数据进行哈希计算,可以将数据均匀地分布在不同的分片上,实现负载均衡和数据分布的均衡性。
  • 范围分片(Range Sharding):根据数据的某个范围进行划分,将具有相同范围的数据放置在同一个分片上。例如,可以按照时间范围将数据进行范围分片。
  • 混合分片(Hybrid Sharding):结合多种分片方式,根据实际情况进行灵活的数据划分。可以根据不同的维度和需求选择合适的分片方式。

其中水平分片和垂直分片同 MySQL 中的数据库分表思想非常相似。另外,数据的分片需要满足如下三个规则:

  • 完全性:一个全局关系中的数据必须完全地划分为若干片段,不允许某些数据属于全局关系但不属于任何一个片段。
  • 不相交性:不允许一个全局关系的某些数据既属于该全局关系的某一个片段又属于该全局关系的别一个片段。
  • 可重构性:可以由片段重构全局关系,对于垂直分片可以连接操作重构全局关系;对于水平分片可以用并操作重构合局关系。

场景分类

文件系统

分布式文件系统(Distributed File System,DFS)是一种将文件数据存储在多个节点上的文件系统,它通过将文件数据分布在不同的节点上来实现数据的可靠性、可扩展性和高性能。分布式文件系统通常用于大规模的数据存储和处理场景,能够有效地处理大量数据和高并发访问。

  1. Hadoop Distributed File System(HDFS):HDFS 是 Apache Hadoop 生态系统中的一部分,是一个高容错性、高可靠性的分布式文件系统。它采用分布式存储和复制机制,将文件数据分布在多个节点上,并通过数据副本和故障恢复来确保数据的可靠性。

  2. Google File System(GFS):GFS 是 Google 开发的分布式文件系统,用于支持大规模数据处理和存储。GFS 采用了类似的分布式存储和复制机制,以提供高吞吐量和数据冗余。

  3. Ceph:Ceph 是一个开源的分布式存储平台,它提供了一个统一的分布式文件系统、块存储和对象存储。Ceph 采用了分布式数据复制和数据分布技术,以实现高可靠性和可扩展性。

  4. GlusterFS:GlusterFS 是一个开源的分布式文件系统,它将多个节点上的存储资源组合成一个统一的文件系统。GlusterFS 具有水平扩展性和高性能,并支持多种部署模式。

这些分布式文件系统都具有可靠性、可扩展性和高性能的特点,可以满足大规模数据存储和处理的需求。它们通常提供了复制、故障恢复、负载均衡和数据一致性等功能,以确保数据的安全性和可靠性。

数据库

分布式数据库是一种将数据存储和处理分布在多个节点上的数据库系统。与传统的集中式数据库不同,分布式数据库通过将数据分片、复制和分布在多个节点上来实现数据的高可用性、可扩展性和性能的提升。

  1. Apache Cassandra:Cassandra 是一个高度可扩展和分布式的 NoSQL 数据库,具有高可用性和强一致性特性。它采用分布式数据复制和分区技术,支持数据的水平扩展和故障恢复。
  2. MongoDB:MongoDB 是一个面向文档的 NoSQL 数据库,支持水平扩展和分片功能。它使用分片键将数据分布在多个节点上,实现数据的高可用性和可扩展性。
  3. Elasticsearch: MongoDB 是一个面向文档的 NoSQL 数据库,基于 Apache Lucene 的开源搜索引擎,提供了强大的全文搜索、分布式数据存储和分析能力。其采用分布式架构,数据被分片和复制到多个节点上,以实现高可用性、可扩展性和容错性。每个节点都可以独立地处理查询请求和存储数据,节点之间通过协调和通信来保持数据的一致性。
  4. Apache HBase:HBase 是一个分布式、可伸缩、面向列的 NoSQL 数据库,构建在 Hadoop 上。它使用 HDFS 作为底层存储,采用分布式复制和分区技术,支持高吞吐量和低延迟的数据访问。
  5. Google Spanner:Spanner 是 Google 开发的分布式数据库系统,具有全球分布式事务一致性和水平扩展性。它使用 TrueTime 时钟和分布式事务协议,支持强一致性和跨数据中心的数据复制。

这些分布式数据库系统具有各自的特点和适用场景,可以根据具体的需求选择适合的系统。它们能够处理大规模数据和高并发访问,并提供高可用性、可扩展性和性能的优势,适用于分布式和云环境中的数据存储和处理需求。

计算

分布式计算系统是指利用多台计算机或服务器共同工作,以解决复杂的计算问题或处理大规模数据的系统。它将任务或数据分解成多个子任务或数据块,并将它们分配给不同的计算节点并行处理,最终合并结果以获得最终的计算或分析结果。其特点如下:

  • 并行处理:分布式计算系统可以将任务分解成多个子任务,并在多个计算节点上并行处理,以加快计算速度和提高系统的吞吐能力。
  • 分布式存储:分布式计算系统通常采用分布式存储来存储和管理大规模的数据集。数据可以分布在多个计算节点上,以提供高可用性、容错性和可扩展性。
  • 节点间通信:分布式计算系统中的节点之间需要进行高效的通信,以协调任务的分配、数据的传输和结果的合并。常见的通信方式包括消息传递、远程过程调用(RPC)和分布式共享内存等。
  • 资源管理:分布式计算系统需要对计算节点和存储资源进行有效管理和调度,以确保任务的平衡分配和资源的充分利用。资源管理涉及任务调度、负载均衡、容错处理等方面。

常见的分布式计算系统有:

  • Apache Hadoop:Hadoop 是一个开源的分布式计算框架(离线),用于处理大规模数据集的分布式存储和分布式计算。
  • Apache Spark:Spark 是一个快速、通用的分布式计算引擎(实时),支持大规模数据处理和机器学习任务。
  • Apache Flink:Flink 是一个流式处理和批处理的开源分布式计算框架(流式),具有低延迟、高吞吐量和高容错性的特点。
  • Apache Storm:Storm 是一个开源的分布式实时计算系统(流式),用于处理高速流式数据。
  • Google Cloud Dataflow:Dataflow 是 Google Cloud 平台上的一项托管式分布式计算服务,用于大规模数据处理和流式数据分析。
  • Microsoft Azure Databricks:Databricks 是一个在 Microsoft Azure 云平台上运行的分布式数据处理和机器学习平台。

缓存

分布式缓存系统可以提供高性能、可伸缩性和可靠性。下面是几个常见的分布式缓存系统的详细介绍:

  • Redis:高性能的键值存储系统,支持多种数据结构,具有快速读写速度和丰富的功能。
  • Memcached:简单而高效的分布式内存对象缓存系统,用于加速动态 Web 应用程序,具有快速读写速度和高并发能力。
  • Apache Ignite:内存分布式数据库和计算平台,提供分布式缓存、数据网格、计算网格和流处理等功能。
  • Hazelcast:开源的分布式缓存和计算平台,提供分布式集合、映射、队列和锁等数据结构,具有高可用性和分布式计算能力。
  • Couchbase:面向文档的 NoSQL 数据库和缓存系统,具有分布式存储和缓存能力,适用于高性能应用和大规模数据存储。
  • Amazon ElastiCache:亚马逊 AWS 提供的托管缓存服务,支持 Redis 和 Memcached 引擎,提供易于使用和自动化管理的分布式缓存解决方案。

这些分布式缓存系统在不同的应用场景下具有各自的优势和特点,选择适合自己应用需求的系统时需要考虑数据模型、性能要求、可伸缩性、数据一致性等方面的因素。

消息队列

分布式消息队列是一种用于在分布式系统中进行异步通信的技术。它允许不同的组件或服务之间通过发送和接收消息来实现解耦、异步和可靠的通信方式:

  • Apache Kafka:高吞吐量、可持久化、分布式发布订阅消息系统,支持水平扩展和高并发处理。
  • RabbitMQ:基于 AMQP 的开源分布式消息队列系统,提供灵活的消息路由和可靠的消息传递。
  • Apache ActiveMQ:基于 JMS 的开源分布式消息队列系统,支持可靠的异步通信和多种消息模式。
  • Redis Pub/Sub:Redis 的发布/订阅功能,轻量级的消息队列解决方案,适用于低延迟和高并发场景。
  • Apache Pulsar:分布式的、可扩展的消息和流处理平台,具有高吞吐量、低延迟和可靠性。

这些分布式消息队列系统都具有不同的特点和适用场景。

监控

分布式监控是指在分布式系统中对各个组件、服务和资源进行监测和管理的技术和方法。它旨在实时收集、分析和展示系统的运行状态、性能指标和异常情况,帮助系统管理员或运维团队及时发现和解决问题,确保系统的可靠性和稳定性:

  • Prometheus:开源的系统监控和警报工具,适用于容器化环境和微服务架构。
  • Grafana:开源的数据可视化和监控平台,与多种数据源集成,提供丰富的图表和仪表盘。
  • Zabbix:功能强大的企业级监控系统,支持分布式架构和自定义报表。其一般使用 zookeeper 来管理
  • Nagios:广泛使用的开源监控系统,实时监测网络、服务器和应用程序的状态和性能。
  • Datadog:云原生的监控和分析平台,支持应用性能监控、日志管理和事件跟踪。

这些分布式监控系统都提供了丰富的功能和工具,用于监测和管理分布式系统的各个方面。通过配置和使用这些系统,可以实时监控系统的健康状态、性能指标、错误日志等,并及时采取相应的措施来保证系统的可用性和稳定性。选择适合自己需求的分布式监控系统时,需要考虑系统规模、数据量、灵活性和扩展性等因素,并结合自身的业务需求进行选择。

日志

分布式日志系统是一种用于收集、存储和分析分布式应用程序产生的日志数据的系统。它可以帮助开发人员和运维团队实时监控应用程序的运行状态、故障排查和性能优化。

  • ELK Stack:由 Elasticsearch、Logstash 和 Kibana 组成的日志分析平台,用于收集、存储和可视化日志数据。
  • Graylog:开源的日志管理平台,支持日志收集、存储、分析和可视化。
  • Splunk:商业日志管理和分析平台,具有强大的数据收集、索引、搜索和可视化功能。

这些分布式日志系统可以处理来自多个应用程序、服务器和组件的大量日志数据,并提供实时的查询、搜索和分析功能。它们支持日志数据的集中管理和统一视图,使开发人员和运维团队能够更好地理解和监控分布式应用程序的运行状况,并快速响应潜在的问题。

参考