如何在 Cassandra 中为 TinyURL 用例设计 table?

How do I design a table in Cassandra for a TinyURL use case?

最近我遇到了一个著名的设计问题。 'Tiny URL'

我发现人们为 NoSQL DBS 提供担保,例如 DynamoDB 或 Cassandra。几天来我一直在阅读有关 Cassandra 的资料,我想针对这个特定问题围绕这个数据库设计我的解决方案。

  1. table 的定义是什么?如果我选择以下 table 定义:

创建table UrlMap(tiny_url text PRIMARY KEY, url text);

这不会造成很多分区吗?因为我的分区键可以接受大约 68B 个值(使用 6 个 char base64 字符串)

这会不会以某种方式影响整体 read/write 性能?如果是这样,什么是更好的模型来定义 table.

很多分区都很好,可以将其视为使用 c* 作为键值存储。

Cassandra 中数据建模的主要原则是为每个应用程序查询设计一个table。

对于 URL 缩短服务,主要的应用程序查询是为给定的微型 URI 检索等效的完整 URL。在 pseudo-code 中,查询如下所示:

    GET long url FROM datastore WHERE uri = ?

请注意,出于服务目的,我们不会存储网络域名以使应用程序可重复用于任何域。过滤器(WHERE 子句)是 URI,因此这就是您想要的分区键,因此我们将相应地设计 table:

CREATE TABLE urls_by_uri (
    uri text,
    long_url text,
    PRIMARY KEY(uri)
)

如果我们要检索 http://tinyu.rl/abc123 的 URL,CQL 查询是:

    SELECT long_url FROM urls_by_uri WHERE uri = 'abc123'

正如 Phact 和 Andrew 指出的那样,无需担心您将存储在 table 中的分区(记录)数量,因为您可以在一个文件中存储多达 2^128 个分区Cassandra table 出于实用目的是无限的。

在 Cassandra 中,每个分区都使用 Murmur3 哈希算法(默认分区程序)哈希为令牌值。此实现将每个分区随机分布在集群中的所有节点上。相同的散列算法用于确定哪个节点“拥有”分区,使得 Cassandra 中的检索(读取)速度非常快。

只要将 SELECT 查询限制在单个分区内,检索数据就会非常快。事实上,我与数百家公司合作,这些公司的 SLA 要求在 6-9 毫秒之间读取 95%。当您正确建模数据并正确调整集群大小时,这在 Cassandra 中是可以实现的。干杯!