如何在 Cassandra 中为 TinyURL 用例设计 table?
How do I design a table in Cassandra for a TinyURL use case?
最近我遇到了一个著名的设计问题。
'Tiny URL'
我发现人们为 NoSQL DBS 提供担保,例如 DynamoDB 或 Cassandra。几天来我一直在阅读有关 Cassandra 的资料,我想针对这个特定问题围绕这个数据库设计我的解决方案。
- 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 中是可以实现的。干杯!
最近我遇到了一个著名的设计问题。 'Tiny URL'
我发现人们为 NoSQL DBS 提供担保,例如 DynamoDB 或 Cassandra。几天来我一直在阅读有关 Cassandra 的资料,我想针对这个特定问题围绕这个数据库设计我的解决方案。
- 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 中是可以实现的。干杯!