Cassandra =单个节点上单行上的列更新的原子性/隔离?

时间:2011-05-17 16:14:31

标签: java concurrency cassandra

抱歉,不得不再次向Cassandra询问一些事情,我非常感谢你的挚爱:

我读过这个:http://wiki.apache.org/cassandra/FAQ#batch_mutate_atomic并且完全迷失了,并且想知道:

是否真的如此,在Cassandra WRITES上的ONE SIGLE NODE for ONE ROW-KEY(在同一列中使用batch_mutate更新许多列)不会对SAME NODE上的READ进行隔离 到相同的ROW-KEY'列,保证读取没有准备好“部分改变数据”?例如:

Current Status:     [KEY=1 , ColumnName=A with Value=A , ColumnName=B with Value=B] on Node 1
Client A => Writes: [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=D] on Node 1

原子

根据cassandra文档,写入是客户执行写入的原子: 上面的写文要么完全成功要么完全失败!? 就像是  [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=B](=列更新的一半成功, 但另一半尚未应用/ faild)在出错的情况下不能成为Write的结果? 这是对的吗?

ISOLATION:

是否真的如此,即使在一个单节点(这里是节点1)上,对于在同一节点上读取相同ROW的人来说,写入也不是孤立的? 如上所述,如果客户端A已更新其一半要更改的列(此处ColumnName = A,其值为C), 确实如此,节点1的另一个客户端B连接确实会将记录视为

Client B => Reads:  [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=B] on Node 1

几毫秒之后,再次阅读它会看到吗?

Client B => Reads:  [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=D] on Node 1

为什么不在每个节点基础上隔离更新?

对我来说,这似乎很容易和便宜? 为什么节点1上没有内存锁定,KEY = 1当前正在更新,所以读取可以等待完成这个写入? (这只是一个非常小的开销,因为锁本地保存在Node1的内存中,并且可以配置为阅读客户端可以接受“锁定”或只是读取脏值? 那么它就像“可配置的隔离级别”?如果我需要高性能,我会忽略锁定/禁用它们,如果我需要基于每个节点进行隔离并接受 负性能影响,然后我等待内存锁(在节点1上)被释放? (注意,我不是在讨论culstered / distributed-locks,而是在单个机器上保证写入是按行键隔离的!)

或者“隔离”与“更改现有列”与“追加/添加列”的操作有所不同。因此chaing columsn(如上例所示)是孤立的,但添加新columsn并不是孤立的。从我的角度来看,更改现有列必须是隔离/原子的....添加columsn并不需要隔离...

为什么我要问的问题:如果上面描述的事情可能发生,那读取真正阅读的部分改变记录,什么 那么用例对nosql / cassandra来说是合法的吗?这意味着任何类型的随机列数据都可以作为columsn以每行为基础存在 可能处于任何随机读/写状态?我几乎不知道任何数据和允许在每行“任意”改变的用例 基础。

非常感谢!!! 延

3 个答案:

答案 0 :(得分:5)

  

为什么节点1上没有内存锁定,KEY = 1当前正在更新,所以读取可以等待完成这个写入?

因为Cassandra非常强调性能的非规范化(分布式连接不能扩展,是的,我在这里正确使用“scale” - 分布式连接在集群中的机器数量上是O(N)),写入卷到“物化视图”行可能非常高。因此,行级锁定会为许多实际工作负载引入不可接受的争用。

答案 1 :(得分:3)

The page you linked to说:

  

“作为一个特例,突变反对   单个键是原子的但不是   隔离的。读取期间发生的事情   这种突变可能会看到部分原因   在他们看到整件事之前写下来。

我不确定这个的原因,但我怀疑所需的锁定会太粗糙并且会对性能造成太大影响。请记住,所有更新都首先写入提交日志,然后在大多数情况下立即写入磁盘上的SSTables(除非您设置的一致性级别非常低),因此纯粹基于内存的锁定不一定有用。

一些无关紧要的用例:

  • 编写数据的系统,可能已添加但未更新
  • 已知读取与写入时间分开的系统
  • 列的值未紧密耦合的系统(如果您的任何值可以聚合为单个列值,则可以安排这样做)
  • 无论如何数据一致性并不重要的系统,以及用户经常刷新其观点的系统

答案 2 :(得分:0)

来自IRC日志的聊天:

itissid: 好的,http://wiki.apache.org/cassandra/FAQ#batch_mutate_atomic说的 这是一个特例 但是,如果我们进行正常的写作,他们会被孤立吗?

thobbs: 列是隔离的单位 上面没有任何东西是孤立的(还)

itissid: 好的问题

thobbs: 将写入隔离到单行

的工作

driftx: 这是为1.1

完成的