【问题标题】:Keeping an archive of all data even if it's deleted in the master instance保留所有数据的存档,即使它在主实例中被删除
【发布时间】:2014-12-31 21:50:04
【问题描述】:

我在服务器中有一个 mongod 实例,并且每天都会删除旧数据(我只保留数据 30 天)。另一方面,我想在我的客户端中拥有一个包含完整数据的数据库镜像副本,并且不想在我的客户端中应用任何删除指令(我需要将所有旧数据保留在客户端中,这些旧数据在服务器中已删除) .

哪种类型的复制对我有帮助?

【问题讨论】:

  • 客户端中数据库的镜像副本是什么意思?您想将数据存储在客户端上吗?你能详细说明一下用例是什么吗?

标签: mongodb


【解决方案1】:

如果您只需要数据(相对于真正的数据库镜像),那么请考虑查看基于 automysql 备份auto mongobackup 的备份脚本,该脚本每天、每周、每月进行轮换备份。在删除数据之前运行它(假设它是一个批处理)。它简单且愿意适应。 如果需要镜像,可以根据导出编写一个 mongo 导入脚本。

-----编辑----

给定的 cmets 考虑一个定期执行的mongo shell script(使用 crontab)。

// mirror every 10 seconds
db.collection.find({"is_mirrored" : { $exists: false }  }).forEach(function(doc) {  
   db.mirror.insert(doc);
   db.collection.update({doc._id}, {"is_mirrored": true}, {upsert: false});
}

创建“镜像表”而不是镜像数据库。一个镜像数据库需要一个连接,所以按照以下方式添加

var mirrordb = connect("localhost:27020/mirrored_db"); // 或任何其他有效的连接字符串 mirrordb.collection.insert(doc) // 替换上面的插入

另一个删除 30 天前的东西。

var now = ISODate();
var ago = now - (30 * 86400 seconds); //some javascript to subtract 30 days

// find all date that is less (or older) than 30 days old
db.collection.find({"created_date" : {$lt : ago }}).forEach(function(doc) {  
   db.collection.remove(doc._id);        // remove the 30 day old data
}

【讨论】:

  • 备份/恢复系统不适合我,我需要客户端中的新数据没有长时间的延迟(大约 10 秒延迟是好的)
【解决方案2】:
  1. 停止主要
  2. 编辑 /etc/mongod.conf 注释行:
#replication:
#  replSetName: "yourreplicaname"
  1. 启动 mongodb 主数据库
  2. 已删除旧数据
  3. 编辑 /etc/mongod.conf 取消注释行:
replication:
  replSetName: "yourreplicaname"
  1. 启动 mongodb 主数据库
  2. 停止 mongodb 辅助
  3. 启动 mongodb 辅助

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多