概述
与前面提到的 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)
- RDB:对整个 Redis 数据进行快照 (SAVE, BGSAVE)
- 发布/订阅 (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) 设置。