Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra基于轻量级事务的序列生成器一致性故障?_Cassandra_Eventual Consistency_Sequence Generators - Fatal编程技术网

Cassandra基于轻量级事务的序列生成器一致性故障?

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 这怎么会发生?我们怎样才能知道

总结

我们的团队继承了使用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
这怎么会发生?我们怎样才能知道到底发生了什么事?


可能发生的情况
  • 如果由于
    TTL
  • 现在假设以下操作序列

  • instanceOne
    设置锁-->
    instance\u name=instanceOne
  • instanceOne
    读取
    next\u id
    值-->
    next\u id=value1
  • instanceOne
    有一些问题,它在10秒内没有调用
    UPDATE\u SEQUENCE
  • 10s已通过-->
    instance\u name=null
  • instanceTwo
    设置锁->
    instance\u name=instanceTwo
  • instanceOne
    读取相同的
    next\u id
    value->
    next\u id=value1
  • 两个实例都尝试使用相同的next值更新
    next\u id
    。但是根据此时的值,
    instancewo
    成功,并且对
    instanceOne
  • 这两个实例都试图通过删除
    实例\u名称
    来解锁。但是基于此时的值,
    实例两次
    成功,并且
    实例一次
  • 不确定操作的时间戳。
  • 一个问题是它们如何成功地与相同的值关联
  • 如果日志来自应用程序,它可以表示
    查询尝试时间
    ,而不是Cassandra中的
    查询执行时间

1)您在什么时候读取序列?2) 这两个呼叫是对同一数据中心的吗?3) 你从哪里获得这些时间戳。例如,是应用程序节点中的请求时间还是响应时间,还是来自cassandra logsIt。get_锁定后,在UPDATE_序列之前,这两个调用读取计数器时,都指向同一数据中心。时间戳来自Java应用程序的日志在主帖子中添加了select/read语句。这可能是解释发生了什么的一种可能的场景,但是日志中的时间戳似乎不支持它。10秒是很长的时间。我们想看看是否能在卡桑德拉自己的日志中找到任何痕迹。谢谢你的分析!如果您无法在Cassandra中找到此操作的时间,则可能值得修改您的应用程序日志,如“发出getlock”和
完成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)