卡桑德拉写锁



我正在做一个使用 Cassandra 的项目,我在一个优化点上遇到了困难。我们希望更改数据库结构,因为读取操作对 Cassandra 来说是一个相当沉重的负载。

目前,我们小批量地写信给Cassandra,阅读将持续进行。我们想让批次更大,所以我们可能每 10-15 分钟左右更换一次桌子的一半。据我所知,Cassandra 仅在应用写入操作时锁定该行。但这是真的吗?还是在写入时锁定整个表。而且(也许有点愚蠢的问题)您可以在有写锁定的情况下阅读吗?(因为当只有写锁定权限时,您仍然有机会阅读?

文档未显示此类流。

Cassandra 不锁定行

在Cassandra批处理中用于实现原子性。原子意味着如果任何批次成功,则所有批次都会成功。

为了实现原子性,默认情况下,Cassandra 首先将序列化批处理写入批处理日志系统表,该表将序列化批处理用作 blob 数据。成功写入并保留(或提示)批处理中的行后,将删除批处理日志数据

虽然原子批次保证原子性。没有批处理隔离。客户端能够从批处理中读取第一个更新的行,而其他行仍在服务器上更新。但是,分区键中的事务行更新是隔离的:客户端无法读取部分更新

来源 : http://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html

另一件事 建议批量必须很小。cassandra.yaml中有两个配置属性,不建议更改batch_size_warn_threshold_in_kbbatch_size_fail_threshold_in_kb

默认值 :

batch_size_warn_threshold_in_kb: 5
batch_size_fail_threshold_in_kb: 50

因此,当您的批量大小为 5k 时,将记录警告,当批量大小为 50k 或刨丝器时,您的批次将失败。

Cassandra 中没有锁,您在哪里读到行锁定?

Cassandra 的工作方式是"仅追加"写入,压缩期间删除了"过时"数据。

通过您所做的所有更改,您可以创建许多"过时"单元格,并且您的读取将很繁重,因此对行进行如此多的更改,我建议使用 LCS,它最适合许多此类工作流。

相关内容

  • 没有找到相关文章

最新更新