live定位cassandra分区key策略

Live location cassandra partition key strategy

我正在观看有关 Uber 使用 Cassandra 进行实时位置存储的 talk,并对分区键感到好奇。我最初的思路是有以下字段:

对于分区键,我介于以下之间:

查询时,我想查询给定行程的位置数据,并可能查询给定 driver 的位置数据。创建复合键有意义吗?我希望每个节点都有 ~100k 行。我是否也可以有两个单独的重复数据表但索引不同,以便我可以根据索引进行查询?

在 Uber 谈话中,他们提到他们使用 uuid(我假设与 driver 或乘车相关)和时间戳的分钟偏移量作为分区键。这是更好的方法吗?

在Cassandra数据建模中,首要的objective是为每个应用查询设计一个table。另一种表达方式是 table 和应用查询具有 one-to-one 关系:一个应用查询映射到一个 table。如果有10个app查询,需要设计10个tables.

[编辑] - 在评论中获得更多信息后更新了我的答案。

对于此应用查询:

I would want to query for the location data for a given trip

您希望 table 按行程划分,因此它看起来像:

CREATE TABLE location_by_trip (
    trip_id text,
    trip_timestamp timestamp,
    latitude float,
    longitude float,
    driver text,
    passenger text,
    ...
    PRIMARY KEY (trip_id, trip_timestamp)
)

您将在特定时间检索位置:

SELECT latitude, longitude
FROM location_by_trip 
WHERE trip_id = ?
  AND trip_timestamp = ?

然后对于第二个应用查询:

... the location data for a given driver

table 架构看起来几乎相同,只是 table 被 driver 分区:

CREATE TABLE location_by_driver (
    driver text,
    trip_timestamp timestamp,
    latitude float,
    longitude float,
    trip_id text,
    passenger text,
    ...
    PRIMARY KEY (driver, trip_timestamp)
)

并且您将使用 driver 作为 WHERE 子句中的过滤器查询 table:

SELECT latitude, longitude
FROM location_by_driver
WHERE driver = ?
  AND trip_timestamp = ?

如果您愿意,ID 可以是 UUID,但这完全取决于您。但请记住,您不需要创建人工 ID 来用作分区键,因为最好始终使用“自然键”。自然键的示例是电子邮件地址、URL、fully-qualified phone 数字(包括国家/地区代码)。

如果您需要多个列来使分区键唯一,则只需要使用复合分区键。例如,电影可以共享相同的标题,因此我们通常建议添加发行年份以使其独一无二。如果您有兴趣,我已经通过 post -- https://community.datastax.com/questions/6171/.

中的示例对其进行了更详细的解释

如果您是 Cassandra 的新手,请查看 datastax.com/dev。它有很多免费的 hands-on 教程,每个教程只持续几分钟,因此您可以非常快速地学习关键概念。

Cassandra Fundamentals course is a good place to start. The Data Modeling 教程也很适合您。免费教程是交互式的,运行 在您的浏览器中,因此无需安装或配置。干杯!