数据库 - 第4部分:NoSQL

概述

与前面提到的 RDBMS 的 ACID 模型相反,NoSQL 的一致性模型被称为 BASE

事务中的 ACID

  • 原子性 (Atomic)
    • 操作在执行过程中不会中断。如果中断,则必须回滚到之前的状态。
  • 一致性 (Consistency)
    • 事务成功时,所有数据必须始终保持一致。如果存在完整性约束,违反该约束的事务将被取消。
  • 隔离性 (Isolation)
    • 事务执行过程中,其他事务不能介入。
  • 持久性 (Durability)
    • 成功的事务必须永久生效,即使系统出现问题也是如此。

BASE

  • 基本可用 (BA - Basic Availability)
    • 数据库在绝大多数情况下都是可用的。
  • 软状态 (Soft-state)
    • 存储库不需要具有写一致性,不同的副本也不需要始终保持相互一致。
  • 最终一致性 (Eventual consistency)
    • 存储库最终会达到一致状态。

带着上述特性,我们来讨论一下接下来的 NoSQL 数据库。

NoSQL 数据库

Redis ( Remote Dictionary Server )

  • 开源 (Open source)
  • 内存数据结构存储 (In-memory data structure store)
  • NoSQL/缓存解决方案 (也可用作数据库)
  • 支持快照 (RDB) / AOF (Append on file) 备份
    • RDB:对整个 Redis 数据进行快照 (SAVE, BGSAVE)
      • 优点:。由于是直接加载快照的形式,重启速度非常快。
      • 缺点:丢失。快照时间点之后的数据可能会丢失。
    • AOF:记录所有的写/更新操作
      • 优点:无损。记录直到设备关闭前的所有操作,因此不会丢失数据。
      • 缺点:。由于记录了所有的写/更新操作,所需的空间比 RDB 类型更多,且在重启时需要重新执行所有记录的操作,因此较慢。
    • 混合模式 (推荐):建议将两者结合使用。
      • RDB + AOF:快照 (+ 快照之后的部分使用 AOF)
  • 发布/订阅 (Pub/Sub) 模型
    • 同时支持 1:1 队列和 1:N 消息传递模式。
    • 可以接收一个主题下的多个消息。
      • 例如:music.jazz, music.classic > music 主题 -> jazz, classic

memcached ( 非 NoSQL )

  • 开源 (Open source)
  • 分布式内存缓存系统
  • (注意) 如果内存中没有存储空间,Memcached 会使用 LRU 算法删除现有数据并重用内存。

cassandra

Apache Cassandra 是一种大规模可扩展的分布式 NoSQL 数据库,最初起源于 Facebook 内部,后来作为开源发布。 其特点是利用 P2P 协议 (Gossip),每秒与集群内最多 3 个节点交换状态消息。通过这种方式,所有节点都能快速了解集群中的其他节点。需要注意的是,在使用多个数据中心集群时,为了容错性,建议每个数据中心指定两个或更多的种子节点。

  • 分布式:即使在物理隔离的数据中心之间,也可以运行单个 Cassandra 集群。
  • 去中心化:所有节点完全对等。
  • 可扩展性:可以在不中断集群的情况下进行扩容或缩容。
  • 高性能:旨在充分利用多处理器/多核机器,并在分布在多个数据中心的数百台机器之间运行。
  • 面向行 (Row-oriented)
    • Cassandra 不是关系型结构,它使用稀疏多维哈希表来表示结构。
    • 稀疏意味着一行可以拥有一个或多个列,但并非每一行都必须拥有与其他行完全相同的列。
  • 使用企业
    • Twitter:用于分析用途
    • Facebook:用于收件箱搜索
    • Reddit:用作持久化缓存
    • Ooyala:用于近乎实时的视频分析数据服务和存储
  • 缺点
    • 不支持 Join 或事务 (Transaction)
    • 实现类似于 RDBMS 的分页 (Paging) 较为困难,如果过度创建 Keyspace 或 Table,可能会导致内存溢出 (Memory Overflow)。

此外,Cassandra 集群的设置和配置比 HBase 集群要容易得多。 Cassandra 通常在写入时表现出 5 倍以上的性能优势,在读取时表现出 4 倍以上的性能优势。

思考

大多数 NoSQL 都是为了处理海量数据而设计的。或许正因如此,它们通常不会像 RDBMS 那样完美支持一致性 (Consistency)。为此,似乎需要进行权衡 (trade-off) 设置。

附录