卡桑德拉写锁

时间:2017-05-15 09:25:33

标签: cassandra batch-processing readwritelock

我正在做一个我们使用Cassandra的项目,而且我已经陷入了优化点。我们想要改变数据库结构,因为读取操作对Cassandra来说是一个非常重的负载。

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

目前我们小批量写入Cassandra,阅读将不断发生。我们希望使批次更大,所以我们可能每10-15分钟左右改变一半。据我所知,Cassandra只在应用写入操作时锁定行。但这是真的吗?或者在写入时锁定整个表格。并且(可能有点愚蠢的问题)你可以在有写锁时阅读吗? (因为当只有一个写锁定权时,你仍然可以读取它吗?)。

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

2 个答案:

答案 0 :(得分: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或更大时,您的批次将失败。

答案 1 :(得分:3)

Cassandra没有锁,你在哪里读过关于行锁定的内容?

Cassandra作为一种"只追加"写作,"陈旧"压缩过程中删除的数据。

通过您正在进行的所有更改,您可以创建许多"陈旧"细胞,你的读数会很重,所以对行的这么大的改变,我建议使用LCS,这对许多这样的工作流程来说都是最适合的。