为什么Cassandra如此依赖于客户端本地时间戳?

为什么Cassandra如此依赖于客户端本地时间戳?,cassandra,timestamp,consistency,Cassandra,Timestamp,Consistency,以下情况对于Cassandra来说可能是逻辑正确的,但对于用户来说很困难。 比如说: Cassandra一致性级别:全写,一读 复制系数:3 对于一条记录,行键:001,列:status 客户端1,为行键001插入值,状态:True,时间戳 11:00:05 客户端2切片查询,获取行键001的值True,@11:00:00 客户端2,行键001的更新值,状态:False,时间戳 11:00:02 因此,客户机更新序列是True到False,尽管更新请求来自不同的节点,但序列是逻辑顺序的 但结果是

以下情况对于Cassandra来说可能是逻辑正确的,但对于用户来说很困难。 比如说:

Cassandra一致性级别:全写,一读 复制系数:3

对于一条记录,行键:001,列:status

  • 客户端1,为行键001插入值,状态:True,时间戳 11:00:05
  • 客户端2切片查询,获取行键001的值True,@11:00:00
  • 客户端2,行键001的更新值,状态:False,时间戳 11:00:02
  • 因此,客户机更新序列是True到False,尽管更新请求来自不同的节点,但序列是逻辑顺序的

    但结果是rowkey:001,column:status,value:True

    那么为什么卡桑德拉如此依赖客户当地时间呢?为什么不使用服务器本地时间而不是客户端本地时间

    因为我使用的是一致性级别的write all和replication_factor:3,所以对于所有3个节点,更新顺序都是正确的(True->False),它们可以给出正确的最终结果

    如果出于某种原因,它需要强依赖于操作的时间戳,那么查询操作也需要时间戳,那么客户端2将看不到值True,这发生在“future”中

    因此,无论是使用服务器时间戳,还是还需要查询时间戳(这意味着第二步查询将看不到结果,因为数据在“将来”),都将更加一致


    否则,Cassandra的一致性很弱,甚至R+W>N.

    CQL使用服务器端时间戳,而传统的Thrift接口使用客户端时间戳

    请注意,您所描述的并不是一致性问题,因为在编写之后,所有响应都将彼此一致。但这违反了因果关系。即使使用服务器端时间戳,您也可能会遇到同时写入相同列的问题


    这里讨论了一些问题:

    CQL使用服务器端时间戳,但是传统的Thrift接口使用客户端时间戳

    请注意,您所描述的并不是一致性问题,因为在编写之后,所有响应都将彼此一致。但这违反了因果关系。即使使用服务器端时间戳,您也可能会遇到同时写入相同列的问题


    这里讨论了一些问题:

    简单的回答是,CQL实际上默认为服务器提供的时间戳


    作为一个较长的回答,我在上写了一篇关于时间戳在冲突解决中的作用的帖子。

    简短的回答是,CQL实际上默认为服务器提供的时间戳


    作为一个较长的回答,我在上写了一篇关于时间戳在冲突解决中的作用的帖子。

    什么是服务器提供的时间戳?例如,我的复制系数是3,一致性级别是全部写入,那么哪个节点的时间戳将用于一个特定记录?在你的博客中,你说Cassandra在这里放弃的是基于现有值为更新创建自定义行为的能力。但这里需要的是因果关系结果,因为新数据已经被客户机读取,并且基于此,它进行了更新。卡桑德拉被时间戳愚弄了(由于时钟漂移)。所以对于具有强一致性写入的单列更新,服务器端时间戳可能更好。什么是服务器提供的时间戳?例如,我的复制系数是3,一致性级别是全部写入,那么哪个节点的时间戳将用于一个特定记录?在你的博客中,你说Cassandra在这里放弃的是基于现有值为更新创建自定义行为的能力。但这里需要的是因果关系结果,因为新数据已经被客户机读取,并且基于此,它进行了更新。卡桑德拉被时间戳愚弄了(由于时钟漂移)。因此,对于具有强一致性写入的单列更新,服务器端时间戳可能会更好。从上面看,我认为在步骤2之后可以得到值True的原因是Cassandra根据序列而不是时间戳进行插入。否则,您不应该看到真值,这意味着Cassandra不太依赖于客户端本地时间。从上面看,我认为在步骤2之后可以得到真值的原因是Cassandra基于序列而不是时间戳进行插入。否则,您不应该看到真正的值,这意味着Cassandra不那么依赖于客户端本地时间。