如何确保Cassandra在不同表上的数据一致性?

时间:2015-12-11 20:08:12

标签: cassandra duplicates cassandra-2.0 data-consistency

我是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中的一行,我如何确保具有相同数据的其他表中数据的一致性?

2 个答案:

答案 0 :(得分:6)

Cassandra为此目的提供了BATCH。来自documentation

  

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

     

默认情况下,批次是原子的。在Cassandra批处理操作的上下文中,atomic表示如果任何批处理成功,则所有批处理都将成功。为了实现原子性,Cassandra首先将序列化批处理写入批处理系统表,该表使用序列化批处理作为blob数据。成功编写并保留(或提示)批处理中的行后,将删除批处理日志数据。原子性会降低性能。如果您不想承担此罚款,请阻止Cassandra使用UNLOGGED选项写入批处理日志系统:BEGIN UNLOGGED BATCH

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

答案 1 :(得分:1)

您还可以从Cassandra 3.0中探索名为materialized views的新功能:

  

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

     

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

这个想法与Jeff Jirsa建议的完全相同,但它不会要求你处理应用程序中的所有多表一致性逻辑,Cassandra会自动为你做这件事。