0

我正在做一个使用 Cassandra 的项目,但我在优化点上遇到了困难。考虑到读取操作在 Cassandra 上的负载非常重,我们希望更改数据库结构。

我在文档和论坛中搜索了答案,但找不到以下问题的明确答案。

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

文档没有显示这种流程,而且这个问题似乎以前从未被问过。先谢谢了!

4

2 回答 2

5

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 或更大时,您的批处理将失败。

于 2017-05-15T11:34:59.520 回答
4

Cassandra 中没有锁,你从哪里读到行锁的?

Cassandra 作为一种“仅附加”写入工作,并在压缩期间删除“陈旧”数据。

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

于 2017-05-15T09:37:54.137 回答