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



我是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。来自文件:

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新