与虚拟分片相比的 NoSQL 仲裁

NoSQL quorum comparing to virtual sharding

在阅读了一些 NoSQL 技术后,我发现 QuorumVirtual Sharding 相比失败了。虚拟分片允许可扩展性并且不会增加整个系统的 read/writes 数量。同样糟糕的是,我绝对找不到法定人数比分片有任何好处。

问题: 能否从数据的角度作为群体技术的倡导者consistency/performance/scalability,并指出它比分片?

以下是我对这些东西的看法:

法定人数:

假设我有一个需要高度数据一致性的预订系统。作为 NoSQL 实现数据一致性的方法之一是 quorum,表示 R + W > N,其中 R - 读取节点,W - 写入节点和 N - 节点总数。

据我了解,如果您使用 quorum 而不是写入一行,您的数据库需要执行 W 次写入操作。还要阅读您的数据库需要做的事情 R 读取。 对吗?

虚拟分片:

据我了解,sharding - 当有类似于 hashmap 的东西时,它根据某些标准告诉您收入数据应该存储在哪里/应该从哪里读取。假设您有 N 个节点。 Virtual 意味着为了避免可伸缩性问题,该散列映射将大于 N,但假设 10*N。这允许在添加新节点时轻松地重新配置它。

它的极好之处在于它不需要像 quorum 那样的任何复制!当然为了availability/failover可以每个节点带一个主从备份。但这不会增加系统中 read/writes 的数量。

这里需要做的关键区分是'quorum'是一个分区中副本之间最终一致性的概念,其中'sharding'是一个数据分区的概念,并不意味着复制。

在像 cassandra 这样的系统中,复制不是必需的。您可以仅将 cassandra 用于数据 partitioning/sharding,将令牌分配给您的节点以建立环中数据的所有权。 Cassandra 使用称为 consistent hashing 的概念在集群中的节点之间分布数据。

在向 cassandra 读取和写入数据时,Quorum 可用 consistency level。当您写入 cassandra 时,所有副本都会接收并处理写入请求,而不管所使用的一致性级别如何。但是,一旦有足够多的副本成功处理了写入以满足一致性级别,cassandra 就会响应请求。对于读取,这个过程有些不同,因为所有节点都会对数据创建摘要,而只有满足一致性级别的足够节点才会执行读取(在正常情况下)。

正如您所说,没有多个副本,可用性是个问题。如果您的示例中的每个分片都有一个主从配置,那么您实际上是在写入两次数据。 master处理写入时数据库是否响应写入,或者是否也需要完成对slave的写入,这取决于数据库的方案和配置。

Cassandra 在 partitioning/sharding 和复制方面都很出色。其他AP nosql解决方案也是如此。此外,由于 cassandra 支持通过一致性级别调整一致性,这使您可以在应用程序的可用性和一致性之间找到理想的平衡点。通过使用仲裁一致性级别,您可以在丢失副本的情况下幸存下来(即,如果有 3 个副本,您可以在分区中丢失 1 个节点的情况下幸存下来),同时您的应用程序继续工作。

在 cassandra 中使用仲裁一致性(或与此相关的任何其他一致性)进行复制相对于在另一个解决方案中进行分片+备份的优势在于,如果 shard/partition 的主节点发生故障,该分区将不可用,直到备份变为活动状态。在 AP 系统(如 cassandra)中,副本出现故障时,只要满足一致性级别,系统就会继续正常工作。不需要通常不透明的 'active-passive switchover' (实际上取决于数据库解决方案)。此外,如果你有足够高的复制因子,你可以支持一个分区中多个节点的丢失(即使用 QUORUM 和 5 个节点的 RF 允许你在一个分区中丢失 2 个节点)。最后,另一个优点是,由于您可以在一个分区中拥有多个活动副本,因此它们可以同时为请求提供服务,而在主从设置中,只有主服务 reads/writes。这可能会在规模上带来更好的性能。