删除命令不从 Aerospike 中删除记录
Delete command not removing records from Aerospike
我正在使用 Java Aerospike 客户端的以下方法来删除 records/bins:
def truncate(startTime: Long, durableDelete: Boolean): List[AtomicInteger] = {
logger.info(s"truncate($startTime) Triggered")
val calendar = new GregorianCalendar()
calendar.setTimeInMillis(startTime)
// Define Scan and Write Policies
val scanPolicy = new ScanPolicy()
scanPolicy.filterExp = Exp.build(Exp.le(Exp.lastUpdate(), Exp.`val`(calendar)))
val writePolicy = client.writePolicyDefault
writePolicy.durableDelete = durableDelete
// Scan all records such as LUT <= startTime
for (recoverBins <- config.binsToRecover) yield {
val recordCount = new AtomicInteger(0)
client.scanAll(scanPolicy, recoverBins.namespace, recoverBins.set, new ScanCallback() {
override def scanCallback(key: Key, record: Record): Unit = {
recoverBins.specificBins match {
// multi-bin scenario
case Some(specificBins) =>
specificBins foreach (bin => client.put(writePolicy, key, Bin.asNull(bin)))
logger.debug(s"Bins $specificBins of record: $record with key: $key are set to NULL")
// single-bin scenario
case None =>
client.delete(writePolicy, key)
logger.debug(s"Record: $record with key: $key DELETED")
}
recordCount.incrementAndGet()
}
})
duruableDelete 设置为 true
问题是当我删除垃圾箱时 (Bin.asNull
) 我可以立即看到结果但是当检查“已删除”键时我仍然可以看到它们 (aql> select * from ns.set where PK = <ShouldBeDeleted>
有什么想法吗?我做错了什么?
另一个问题:duruableDelete
是如何防止“僵尸记录”的?幕后发生了什么?
谢谢!
Zombie Record:早先从集群中删除但稍后在集群中恢复活动的记录。在各种情况下都可能发生这种情况。持久删除记录可以防止除其中一种情况外的所有情况。持久删除通过在集群中保存墓碑来实现。示例:您在主服务器和副本服务器上都有记录。您关闭主节点,然后非持久地删除集群中的记录。当你重新启动 master 时,记录将被复活。如果您持久删除,集群将有一个墓碑(假设您在墓碑生命周期内重新启动主服务器 - 默认为 1 天)并且当传入主服务器在加入集群时比较记录元数据时,它不会恢复其记录副本。
我正在使用 Java Aerospike 客户端的以下方法来删除 records/bins:
def truncate(startTime: Long, durableDelete: Boolean): List[AtomicInteger] = {
logger.info(s"truncate($startTime) Triggered")
val calendar = new GregorianCalendar()
calendar.setTimeInMillis(startTime)
// Define Scan and Write Policies
val scanPolicy = new ScanPolicy()
scanPolicy.filterExp = Exp.build(Exp.le(Exp.lastUpdate(), Exp.`val`(calendar)))
val writePolicy = client.writePolicyDefault
writePolicy.durableDelete = durableDelete
// Scan all records such as LUT <= startTime
for (recoverBins <- config.binsToRecover) yield {
val recordCount = new AtomicInteger(0)
client.scanAll(scanPolicy, recoverBins.namespace, recoverBins.set, new ScanCallback() {
override def scanCallback(key: Key, record: Record): Unit = {
recoverBins.specificBins match {
// multi-bin scenario
case Some(specificBins) =>
specificBins foreach (bin => client.put(writePolicy, key, Bin.asNull(bin)))
logger.debug(s"Bins $specificBins of record: $record with key: $key are set to NULL")
// single-bin scenario
case None =>
client.delete(writePolicy, key)
logger.debug(s"Record: $record with key: $key DELETED")
}
recordCount.incrementAndGet()
}
})
duruableDelete 设置为 true
问题是当我删除垃圾箱时 (Bin.asNull
) 我可以立即看到结果但是当检查“已删除”键时我仍然可以看到它们 (aql> select * from ns.set where PK = <ShouldBeDeleted>
有什么想法吗?我做错了什么?
另一个问题:duruableDelete
是如何防止“僵尸记录”的?幕后发生了什么?
谢谢!
Zombie Record:早先从集群中删除但稍后在集群中恢复活动的记录。在各种情况下都可能发生这种情况。持久删除记录可以防止除其中一种情况外的所有情况。持久删除通过在集群中保存墓碑来实现。示例:您在主服务器和副本服务器上都有记录。您关闭主节点,然后非持久地删除集群中的记录。当你重新启动 master 时,记录将被复活。如果您持久删除,集群将有一个墓碑(假设您在墓碑生命周期内重新启动主服务器 - 默认为 1 天)并且当传入主服务器在加入集群时比较记录元数据时,它不会恢复其记录副本。