我读过这个: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以每行为基础存在 可能处于任何随机读/写状态?我几乎不知道任何数据和允许在每行“任意”改变的用例 基础。
非常感谢!!! 延
答案 0 :(得分:5)
为什么节点1上没有内存锁定,KEY = 1当前正在更新,所以读取可以等待完成这个写入?
因为Cassandra非常强调性能的非规范化(分布式连接不能扩展,是的,我在这里正确使用“scale” - 分布式连接在集群中的机器数量上是O(N)),写入卷到“物化视图”行可能非常高。因此,行级锁定会为许多实际工作负载引入不可接受的争用。
答案 1 :(得分:3)
“作为一个特例,突变反对 单个键是原子的但不是 隔离的。读取期间发生的事情 这种突变可能会看到部分原因 在他们看到整件事之前写下来。
我不确定这个的原因,但我怀疑所需的锁定会太粗糙并且会对性能造成太大影响。请记住,所有更新都首先写入提交日志,然后在大多数情况下立即写入磁盘上的SSTables(除非您设置的一致性级别非常低),因此纯粹基于内存的锁定不一定有用。
一些无关紧要的用例:
答案 2 :(得分:0)
itissid: 好的,http://wiki.apache.org/cassandra/FAQ#batch_mutate_atomic说的 这是一个特例 但是,如果我们进行正常的写作,他们会被孤立吗?
thobbs: 列是隔离的单位 上面没有任何东西是孤立的(还)
itissid: 好的问题
thobbs: 将写入隔离到单行
的工作driftx: 这是为1.1
完成的