在DataStax中提到,Cassandra中每个列族都有一个内存表。
让我们假设我有一个RF = 2的2节点Cassandra集群。现在,如果一个节点发生故障,则另一个节点在那里,我们可以从中检索数据。但是有可能说在我的集群中,节点1失败,然后节点2处理对数据的请求,经过一段时间后,节点1启动,节点2失败,然后是节点1处理该请求。
那么memtable在集群中的什么位置?如果它在节点中,那么每个列族只有一个内存表的说法是错误的。
答案 0 :(得分:3)
memtable是一种内存中数据结构,可以为每个节点上的每个表保留或不保留堆内存。
内存表定期刷新到新的sstable,这些新的sstable与该内存表合并以进行读取。提交日志为内存表提供持久性,直到刷新为止。
读取时,协调器作业将根据请求的一致性级别合并来自不同副本的数据。如果您的CL覆盖了node1和node2,则协调器将解决丢失的数据。当node1或node2发生故障或丢弃突变时,协调器会将突变存储在提示中,以便在恢复时进行传递。如果所有失败,反熵修复程序将在运行时修复所有不一致性。
答案 1 :(得分:1)
您应该查看Cassandra写路径以了解更多详细信息。内存表是基于单个CF的内存结构。当数据写入Cassandra时,首先写入commitLog,然后写入memtable,然后刷新到磁盘(sstable)
了解更多HERE