cassandra如何查询存在于另一个节点的SSTable中的数据

How does cassandra Query data that is present in another node's SSTable

根据我对cassandra的理解 当客户端将数据写入单个服务器时,它会写入提交日志(仅附加日志而不进行随机查找)。然后将数据放入驻留在内存中的 MEMTable 中。然后确认说写入成功。当 MEMTable 已满时,它会作为 SSTable(顺序写入)刷新到磁盘

在具有 2 个名为 (node1,node2) 的节点的多节点集群中。 当客户端将数据写入应该驻留在节点 2 中的节点 1 时(根据分配给节点的令牌)。

  1. 对应的commit log在Node1还是Node2哪里?
  2. 数据到node1还是Node2哪个MEMTable?
  3. 对应的SSTable在Node1还是Node2哪里?
  4. 查询如何提供存在于其他节点内存中的数据(当尝试从节点 1 读取时)?

客户端发出写入时连接到的节点成为该写入的协调器。因此,在您的场景中,node1 将是协调器。然后,节点 1 将计算写入的令牌哈希值,并发现该令牌属于节点 2。然后它将写入转发到 node2.

Node2 会收到来自 node1 的写入请求,并且由于它是本地写入,因此会将其添加到 node2 上的提交日志和内存表中。这样一来,如果 node2 在刷新 memtable 之前关闭,它可以通过重播提交日志来重建 memtable。

当 node2 上的 memtable 被刷新时,它将被保存到 node2 上的磁盘。

一旦 node2 上的写入完成,它会告诉 node1 写入成功,然后 node1 会告诉客户端写入成功。

读取的工作方式几乎相同。客户端向成为读取协调器的节点发出读取。协调器联系拥有数据令牌的节点,然后它们将结果发送回协调器。协调器根据最新的时间戳合并结果,并将最终结果返回给客户端。