2015-12-11 26 views
9

我是卡桑德拉的新人,我读过卡桑德拉鼓励数据的非规范化和重复。这让我有点困惑。 让我们想象以下场景:如何确保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中的一行,我如何确保其他表中具有相同数据的数据的一致性?

回答

6

Cassandra为此提供了BATCH。从documentation

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

批次默认为原子。在Cassandra批处理操作的上下文中,原子意味着如果批处理中的任何一个成功完成,它将全部结束。为了实现原子性,Cassandra首先将序列化的批次写入批量日志系统表中,该批量日志系统表将批量序列化为blob数据。当批处理中的行成功写入并保留(或暗示)时,批处理日志数据将被删除。原子性有一个性能损失。如果你不想承担这个点球,防止卡桑德拉从编写到使用未注册的选项batchlog系统:BEGIN未登录批

未登录批几乎都是不可取的,我相信在未来的版本中被删除。正常批次提供您想要的功能。

1

您也可以从卡珊德拉3.0称为materialized views探索的一项新功能:

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

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

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

+2

尽管如此,但要小心,因为物化视图是异步更新的,这意味着您的应用程序需要能够处理最终的一致性。批处理方法可以让您确保为这类问题提供更好的一致性,但会降低应用程序的复杂性。 – awinder

相关问题