【问题标题】:How to ensure data consistency in Cassandra on different tables?如何确保 Cassandra 中不同表上的数据一致性?
【发布时间】:2016-03-17 20:22:50
【问题描述】:

我是 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 duplicates cassandra-2.0 data-consistency


    【解决方案1】:

    Cassandra 为此提供了BATCH。来自documentation

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 走这条路时要小心,因为物化视图是异步更新的,这意味着您的应用程序需要能够处理最终的一致性。批处理方法可以让您确保此类问题的更好一致性,但会降低应用程序的复杂性。
      猜你喜欢
      • 2017-05-15
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2016-05-29
      • 2018-06-21
      • 1970-01-01
      • 2018-09-01
      相关资源
      最近更新 更多