12

我是 Cassandra 的新手,我读过 Cassandra 鼓励数据的非规范化和重复。这让我有点困惑。让我们想象以下场景:

我有一个包含四个表的键空间:A、B、C 和 D。

CREATE TABLE A (
  tableID int,
  column1 int,
  column2 varchar,
  column3 varchar,
  column4 varchar,
  column5 varchar,
  PRIMARY KEY (column1, tableID)
);

让我们假设其他表(B,C,D)与表 A 具有相同的结构和相同的数据,只是具有不同的主键,以便响应其他查询。

如果我升级表 A 中的一行,如何确保具有相同数据的其他表中的数据一致性?

4

2 回答 2

6

Cassandra 提供BATCH了这个目的。从文档中:

BATCH 语句将多个数据修改语言 (DML) 语句(INSERT、UPDATE、DELETE)组合成一个逻辑操作,并为批处理中的语句写入的所有列设置客户端提供的时间戳。批处理多个语句可以节省客户端/服务器和服务器协调器/副本之间的网络交换。但是,由于 Cassandra 的分布式特性,请尽可能将请求分散到附近的节点以优化性能。使用批处理来优化性能通常不会成功,如使用和滥用批处理部分所述。有关加载数据的最快方式的信息,请参阅“Cassandra:不使用 Batch 关键字的批量加载”。

默认情况下,批处理是原子的。在 Cassandra 批处理操作的上下文中,原子意味着如果任何批处理成功,那么所有批处理都会成功。为了实现原子性,Cassandra 首先将序列化批处理写入批处理日志系统表,该系统表将序列化批处理作为 blob 数据使用。当批处理中的行已成功写入并持久化(或提示)后,将删除批处理日志数据。原子性会降低性能。如果您不想招致此惩罚,请使用 UNLOGGED 选项阻止 Cassandra 写入批处理日志系统:BEGIN UNLOGGED BATCH

UNLOGGED BATCH 几乎总是不受欢迎的,我相信在未来的版本中会被删除。普通批次提供您想要的功能。

于 2015-12-12T02:37:01.687 回答
1

您还可以探索 Cassandra 3.0 中称为物化视图的新功能:

Cassandra 中数据建模的基本规则涉及根据将针对该表运行的查询将数据手动非规范化到单独的表中。目前,在不指定分区键的情况下查询列的唯一方法是使用二级索引,但它们不能替代将数据非规范化到新表中,因为它们不适合高基数数据。高基数二级索引查询通常需要环中所有节点的响应,这会增加每个请求的延迟。相反,使用客户端非规范化和多个独立表,这意味着为许多不同的用户重写相同的代码。

在 3.0 中,Cassandra 将引入一个名为 Materialized Views 的新功能。物化视图处理自动化的服务器端非规范化,消除了客户端处理这种非规范化的需要,并确保基础数据和视图数据之间的最终一致性。这种非规范化允许使用正常的 Cassandra 读取路径在每个视图中非常快速地查找数据。

这个想法与 Jeff Jirsa 建议的完全一样,但它不需要您处理应用程序中的所有多表一致性逻辑,Cassandra 会自动为您完成。

于 2015-12-15T11:14:55.717 回答