【问题标题】:How does cassandra Query data that is present in another node's SSTablecassandra如何查询另一个节点的SSTable中存在的数据
【发布时间】:2015-12-21 05:10:38
【问题描述】:
根据我对 cassandra 的理解
当客户端将数据写入单个服务器时,它会写入提交日志(仅附加日志而不进行随机搜索)。然后将数据放入驻留在内存中的 MEMTable 中。然后确认说写入成功。当 MEMTable 已满时,它会作为 SSTable(顺序写入)刷新到磁盘
在具有 2 个名为 (node1,node2) 的节点的多节点集群中。
当客户端将数据写入应该驻留在节点2中的节点1时(根据分配给节点的令牌)。
- 对应的提交日志在Node1还是Node2的哪里?
- 数据到node1还是Node2哪个MEMTable?
- 对应的SSTable在Node1还是Node2的哪里?
- 查询如何提供存在于其他节点内存中的数据(尝试从 Node1 读取时)?
【问题讨论】:
标签:
cassandra
cassandra-2.0
【解决方案1】:
客户端在发出写入时连接到的节点成为该写入的协调器。因此,在您的场景中, node1 将是协调器。然后,Node1 将计算写入的令牌哈希值,并查看该令牌由 node2 拥有。然后它将写入转发到 node2。
Node2 将接收来自 node1 的写入请求,并且由于它是本地写入,因此会将其添加到 node2 上的提交日志和内存表中。这样一来,如果 node2 在刷新内存表之前宕机,它可以通过重播提交日志来重建内存表。
当 memtable 在 node2 上刷新时,它将被保存到 node2 上的磁盘。
一旦node2上的写入完成,它会告诉node1写入成功,然后node1会告诉客户端写入成功。
读取的工作方式几乎相同。客户端向成为读取协调器的节点发出读取。协调器联系拥有数据令牌的节点,并将结果发送回协调器。协调器根据最新的时间戳合并结果,并将最终结果发送回客户端。