Cassandra 建模模式

Cassandra modeling pattern

我是 Cassandra 的新手,我一直在尽我所能阅读并进行试验。

我看到文档说您可以根据需要为每个查询创建 1 个 table。因此,如果我有一个 "Customer" 记录,其中有 4 个不同的字段需要查询,那么我可以创建 4 个不同的 table 来做到这一点。

然后我遇到了一个叫做 "Batch" 的功能,它似乎说如果我将它们放在一个批处理中,我可以通过事务进行 4 次更新。

但我在文档中找不到任何明确的内容将所有部分放在一起并说 "You SHOULD create 1 table per query, and you SHOULD use a Batch to keep all of those query tables in sync. This is the best practice."

这是最佳做法吗?对于新手,我可以少一点 "CAN" 多一点 "SHOULD" :)

你不应该使用批处理。有两大原因:

  • 比较慢
  • 它可能会失败,如果发生这种情况:您的所有数据都将丢失。

更好:将所有内容拆分为不同的查询。如果您需要在所有节点上成功查询,请使用 ALL 或 QUORUM 的一致性级别。更多信息:https://docs.datastax.com/en/cql/3.3/cql/cql_reference/consistency_r.html

您可以在此处阅读有关此功能的更多信息。批处理的工作原理:https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/

但是批处理有一个用例:如果您已经发送了一些具有相同分区键的插入查询,并且这些查询仍在进行中,请缓冲下一个查询并在获得成功响应时作为批处理执行对于之前的查询。这样,您可以防止数据库负载过高。

编辑: 我忘记了一件事:你写了关于创建语句的文章。我认为 batch 和 ALL/QOURUM 对于创建语句都不重要。通常,您不会动态创建 table 并同时向此 table 插入新行。通常:您在开发环境中创建一个新的 table,更改您的应用程序,并且在测试之后,您在生产环境中创建一个新的 table。一段时间后,您将部署应用程序的新版本。此时,您可以确定在每个节点上都创建了新的 table。一些框架提供了 table 的这种动态创建,但我认为最好手动控制它。用代码来做这件事太危险了。也许有人拼错了 table 或类似的东西。

您是否考虑过使用物化视图?这是 Cassandra 3.0 中的一项新功能,可以很好地满足您的用例,您可以有一个基础 table,然后为每个查询创建一个 table 的视图。例如,以this blog post为例:

CREATE TABLE users (
    id uuid PRIMARY KEY,
    username text,
    email text,
    age int
 );

CREATE MATERIALIZED VIEW users_by_name AS 
    SELECT * FROM users 
    WHERE username IS NOT NULL
    PRIMARY KEY (username, id);

当您将数据插入用户时,数据也会传播到视图。然而,它不完全是事务性的(获得成功的写入响应并不意味着它已经传播到视图,但它们最终会传播到视图),但它可以减轻客户端的负担并且应该处理任何关于tables/views 同步。