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

4

据我所知,在Cassandra中,当客户端向单个服务器写入数据时,它会写入提交日志(追加式日志而不是随机寻址)。然后它将数据放入存储在内存中的MEMTable。然后确认写入成功。当MEMTable已满时,它作为SSTable(顺序写入)刷新到磁盘上。

在一个名为(node1,node2)的多节点集群中。当客户端向本应驻留在node2中的node1写入数据(根据分配给节点的标记)时。

  1. 相应的提交日志留在Node1还是Node2?
  2. 数据进入node1或Node2的哪个MEMTable?
  3. 相应的SSTable留在Node1还是Node2?
  4. 当尝试从Node1读取数据时,查询如何提供其他节点中的内存中的数据?
1个回答

4
当客户端发出写入请求时,连接的节点将成为该写入请求的协调者。因此,在您的场景中,node1将成为协调者。然后,node1将计算写入请求的标记哈希值,并查看该标记是否由node2拥有。然后,它会将写入请求转发给node2。
node1会将写入请求发送给node2,由于这是本地写入,所以node2会将其添加到commitlog和memtable上。这样,如果node2在memtable刷新之前崩溃,它可以通过重放commitlog来重建memtable。
当在node2上刷新memtable时,它将保存到磁盘上。
一旦在node2上完成写入操作,它将告诉node1写入成功,然后node1将告诉客户端写入成功。
读取操作的工作方式基本相同。客户端向成为读取协调者的节点发出读取请求。协调者联系拥有数据标记的节点,并将结果发送回协调者。协调者根据最新时间戳合并结果,并将最终结果发送回客户端。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接