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

如何确保Cassandra中不同表上的数据一致性?,cassandra,duplicates,cassandra-2.0,data-consistency,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) ); 让我们假设其他表

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

Cassandra为此提供了
BATCH
。从:

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

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


未标记的批处理几乎总是不受欢迎的,我相信在将来的版本中会被删除。正常批次提供您所需的功能。

您还可以探索Cassandra 3.0中的一项新功能,名为:

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

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


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

但在这条路上要小心,因为物化视图是异步更新的,这意味着您的应用程序需要能够处理最终的一致性。批处理方法可以让您以牺牲应用程序复杂性为代价,确保此类问题具有更好的一致性。MV似乎不是一个好主意