在卡桑德拉DataStax入门课程中,他们说卡桑德拉集群节点的所有时钟都必须同步,以防止将查询读取到“旧”数据。
如果一个或多个节点处于故障状态,则无法获得更新,但一旦它们再次备份,它们就会更新,并且没有问题。
那么,为什么Cassandra集群需要节点之间的同步时钟呢?
发布于 2016-01-20 15:01:57
一般来说,保持服务器时钟保持同步总是一个好主意,但节点之间需要时钟同步的一个主要原因是,Cassandra使用了一个名为“最后写赢”的概念来解决冲突,并确定哪种突变代表了最新的数据状态。这在为什么卡桑德拉不需要矢量时钟中得到了解释。
每当您在cassandra中“更改”(写或删除)列时,处理请求的协调程序就会指定一个时间戳。该时间戳是用单元格中的列值编写的。
当发生读取请求时,cassandra将生成您的结果,为您的查询条件查找突变,当它看到多个单元格代表同一列时,它将选择一个带有最近时间戳的单元格(读取路径比这更复杂,但这是您在这个上下文中需要知道的全部内容)。
当节点的时钟变得不同步时,事情就开始出现问题。如前所述,处理请求的协调节点分配时间戳。如果对同一列执行多个突变,并且分配了不同的协调员,则可以创建一些情况,在这种情况下,过去发生的写操作会被返回,而不是最近的。
下面是一个基本的场景,描述如下:
假设我们有一个包含节点A和B的2节点集群,让我们假设一个初始状态,其中A在时间上是t10,B在时间上是t5。
DELETE C FROM tbl WHERE key=5。节点A协调请求,并分配时间戳t10。UPDATE tbl SET C='data' where key=5。节点B协调请求,并分配时间戳t6。SELECT C from tbl where key=5。因为步骤1中的DELETE具有较新的时间戳(t10 > t6),因此不返回任何结果。注意,更新版本的datastax驱动程序将开始默认使用客户端时间戳来让客户端应用程序生成时间戳并将时间戳分配给请求,而不是依赖C*节点来分配它们。datastax驱动程序从3.0开始默认为客户端时间戳(请参阅“客户端一代”中的更多内容)。如果所有请求都来自同一个客户端,这是非常好的,但是如果您有多个应用程序写信给cassandra,那么您现在必须担心保持客户端时钟同步。
https://stackoverflow.com/questions/34898693
复制相似问题