jen*_*ens 3 java concurrency cassandra
抱歉再次向Cassandra再问一些事情,我非常感谢你的喜好:
我读过这个:http://wiki.apache.org/cassandra/FAQ#batch_mutate_atomic并且完全迷失了,并且想知道:
这是真的吗,在Cassandra WRITES上一个SIGLE NODE for ONE ROW-KEY(有很多列在同一列中使用batch_mutate进行更新)不会在同一节点上对同一行键盘上的READ进行隔离,保证读取没有准备好"部分更改数据"?例:
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
Run Code Online (Sandbox Code Playgroud)
原子性:
根据cassandra文档,写入是客户执行写入的原子:上面的写入要么完全成功要么完全失败!?类似的事情
[KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=B]
(=一半的列更新成功,但另一半尚未应用/ faild)在出错时不能成为Write的结果?它是否正确?
隔离:
这是真的吗,即使在一个单节点(这里是节点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
Run Code Online (Sandbox Code Playgroud)
几毫秒后,再次阅读它会看到什么?
Client B => Reads: [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=D] on Node 1
Run Code Online (Sandbox Code Playgroud)
.
为什么不在每个节点基础上隔离更新?
对我来说,这似乎很容易和便宜?为什么节点1上没有内存锁定,KEY = 1当前正在更新,所以读取可以等待完成这个写入?(这只是一个非常小的开销,因为锁在本地保存在Node1的内存中,并且可以配置为读取客户端可以接受"锁定"或只是读取脏值?所以它类似于"可配置的隔离级别"?如果我需要高性能,我会忽略锁定/禁用它们,如果我需要基于每个节点隔离并接受负面性能影响,那么我等待内存锁定(在节点1上)被释放? (注意,我不是在讨论culstered/distributed-locks,而是在单个机器上保证写入是按行键隔离的!)
或者就"更改现有列"与"追加/添加列"的操作而言,隔离是不同的.因此,chaing columsn(如上例所示)是孤立的,但添加新的columsn并不是孤立的.从我的角度来看,更改现有列必须是隔离/原子的....添加columsn并不需要隔离...
我要问的问题是:如果上面描述的内容可能会发生,那读取真正读取了部分更改的记录,那么哪些用例对nosql/cassandra来说是合法的?这意味着任何类型的随机列数据都可以基于每行存在,因为columsn可能处于任何随机读/写状态?我几乎不知道任何数据和允许在每行"任意"更改的用例.
非常感谢你!!!延
为什么节点1上没有内存锁定,KEY = 1当前正在更新,所以读取可以等待完成这个写入?
因为Cassandra非常强调性能的非规范化(分布式连接不能扩展,是的,我在这里正确使用"scale" - 分布式连接在集群中的机器数量上是O(N)),将卷写入"物化视图"行可以非常高.因此,行级锁定会为许多实际工作负载引入不可接受的争用.