当前位置: 首页 > 知识库问答 >
问题:

现场卡珊德拉分区关键策略

慕学海
2023-03-14

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

  • ride_id
  • driver_id
  • 时间戳
  • 纬度
  • 经度

对于分区键,我在以下各项之间:

    < li >复合主键(ride_id,driver_id) < li >主键(ride_id) < li >主键(driver_id)

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

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

共有1个答案

薛经艺
2023-03-14

在Cassandra数据建模中,主要目标是为每个应用程序查询设计一个表。另一种说法是,表和应用程序查询具有一对一关系:一个应用程序查询映射到一个表。如果有10个应用程序查询,则需要设计10个表。

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

对于此应用程序查询:

我想查询给定行程的位置数据。

您希望该表按行程进行分区,这样看起来就像:

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 = ?

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

...给定驾驶员的位置数据

表架构看起来几乎相同,只是表是按驱动程序分区的:

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

您可以在WHERE子句中使用驱动程序作为过滤器来查询该表:

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

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

如果需要多个列才能使分区键唯一,则只需要使用组合分区键。例如,电影可以共享相同的标题,因此我们通常建议添加发行年份以使其独特。如果你感兴趣,我在这篇文章中用例子更详细地解释了它——https://community.datastax.com/questions/6171/.

如果你是卡珊德拉的新手,看看datastax.com/dev.它有很多免费的动手教程,可以让你非常快速地学习关键概念,因为每个教程只持续几分钟。

卡珊德拉基础课程是一个很好的起点。数据建模教程对你来说也是一本好书。免费教程是交互式的,在你的浏览器中运行,所以不需要安装或配置任何东西。干杯!

 类似资料:
  • 请看下面的代码,让我知道我哪里做错了? 使用: DSE版本-5.1.0 172.31.16.45:9042连接到测试群集。[cqlsh 5.0.1|Cassandra3.10.0.1652|DSE 5.1.0|CQL规范3.4.4|本地协议v4]使用HELP寻求帮助。 谢谢 斯卡拉 斯卡拉 斯卡拉 我在这里什么都得不到?甚至没有错误。

  • DSE版本4.8.2 我用数据向集群添加了6个新节点,并将bootstrap:false。他们加入后,我正在对每一个进行重建。我相信1NODE已完成,但控制台上的命令仍在“运行”(例如,我还无法运行另一个命令)。我想确保它完全完成。该单元没有压实,也没有活动的溪流。更新:现在已经4天了,仍然处于命令提示符下。 除了compationstats和netstats,还有什么我可能缺少的吗?我看到它流式

  • 引用这篇文章: http://www.datastax.com/dev/blog/4-simple-rules-when-using-the-datastax-drivers-for-cassandra Cassandra的存储引擎进行了优化,以避免存储不必要的空列,但是当使用预准备语句时,那些未提供的参数会导致空值被传递给Cassandra(从而存储墓碑)。目前,这种情况的唯一解决方法是为最常见

  • 刚才,我们使用datastax spark连接器计算了一些统计数据。重复的查询在每次执行时返回不同的结果。 这可能是卡桑德拉、火花或连接器的问题吗?在每一种情况下,是否存在一些配置方法来防止这种情况?

  • 我用的是Spring boot < code > 1 . 3 . 8 . release 。为了使用cassandra 3.x驱动程序,我尝试了如下方法: 但我出错了; 我在https://github.com/spring-projects/spring-boot/issues/5835,有一个帖子; 在Spring Data Cassandra 1.5(Ingalls)中采用Cassandra

  • 我已经和Cassandra合作了一段时间,并遵循了以下链接中的基准测试提示: http://www.datastax.com/dev/blog/how-not-to-benchmark-cassandra 我有4个节点运行Cassandra,2个不同的节点使用本机基准测试工具“cassandra-stress”为集群提供数据。我知道,由于Cassandra写操作的LSM特性,它们很难绑定到IO,但