Cassandra基于轻量级事务的序列生成器一致性故障?
总结 我们的团队继承了使用Cassandra实现的序列生成器 桌子 它一直运行良好,直到昨天,我们发现两个不同的java应用程序节点具有相同的序列号 这件事发生的时间戳Cassandra基于轻量级事务的序列生成器一致性故障?,cassandra,eventual-consistency,sequence-generators,Cassandra,Eventual Consistency,Sequence Generators,总结 我们的团队继承了使用Cassandra实现的序列生成器 桌子 它一直运行良好,直到昨天,我们发现两个不同的java应用程序节点具有相同的序列号 这件事发生的时间戳 AppNode 1 getlock: 4:25:14.480 UpdateSequence: 4:25:14.486 AppNode 2 getlock: 4:25:14,489 UpdateSequence: 4:25:14,496 这怎么会发生?我们怎样才能知道
AppNode 1
getlock: 4:25:14.480
UpdateSequence: 4:25:14.486
AppNode 2
getlock: 4:25:14,489
UpdateSequence: 4:25:14,496
这怎么会发生?我们怎样才能知道到底发生了什么事?可能发生的情况
- 如果由于
TTL
- 现在假设以下操作序列
设置锁-->instanceOne
instance\u name=instanceOne
读取instanceOne
值-->next\u id
next\u id=value1
有一些问题,它在10秒内没有调用instanceOne
UPDATE\u SEQUENCE
- 10s已通过-->
instance\u name=null
设置锁->instanceTwo
instance\u name=instanceTwo
读取相同的instanceOne
value->next\u id
next\u id=value1
- 两个实例都尝试使用相同的next值更新
。但是根据此时的值,next\u id
成功,并且对instancewo
instanceOne
- 这两个实例都试图通过删除
来解锁。但是基于此时的值,实例\u名称
成功,并且实例两次
实例一次
- 不确定操作的时间戳。
- 一个问题是它们如何成功地与相同的值关联
- 如果日志来自应用程序,它可以表示
,而不是Cassandra中的查询尝试时间
查询执行时间
完成getlock
以及更新序列
方法
GET_LOCK("UPDATE sequences USING TTL 10 set instance_name = ? where id_name = ? IF instance_name = null", ConsistencyLevel.LOCAL_QUORUM),
SELECT_SEQUENCE("SELECT next_id from sequences where id_name = ?",
ConsistencyLevel.LOCAL_QUORUM)
UPDATE_SEQUENCE("UPDATE sequences SET next_id= ? where id_name= ? IF next_id= ?",ConsistencyLevel.LOCAL_QUORUM),
REMOVE_LOCK("UPDATE sequences set instance_name = null where id_name = ? IF instance_name = ?", ConsistencyLevel.LOCAL_QUORUM);
(note: ConsistencyLevel was set to LOCAL_SERIAL in Java)
AppNode 1
getlock: 4:25:14.480
UpdateSequence: 4:25:14.486
AppNode 2
getlock: 4:25:14,489
UpdateSequence: 4:25:14,496
SELECT_SEQUENCE("SELECT next_id from sequences where id_name = ?",
ConsistencyLevel.LOCAL_QUORUM)