MongoDB备份与恢复实战(二)

前戏 老花: 话接上回, 我们今天总结下MongoDB分片集群部署模式下, 需要注意一些地方。 分布式全量备份和恢复实践 首先, 明确一点, mongdump/mongorestore支持热备份和热恢复。 为了提升备份工作流的并发性能, 我们可以将命令改为多个shard同时后台下发, 那么如何确保这些备份任务及时下发和反馈进度呢? 我们可以引入一个管控面, 这可以是一个组件暴露成接口, 也可以是k8s上的一个job或者cronjob, 定时去执行。 不管怎么说, 它理论上应该有这些功能: 异步下发指令。 监控指令完成。 执行下一个指令。 最终返回备份成功或者失败的状态, 以及一些其他附加信息。 我们把这个流程画成时序图。 全备时序图 主要步骤: 管控系统遍历每个Shard查找主节点:管控系统首先需要确定每个分片(Shard)的主节点。 并行执行mongodump异步命令:对于每个Shard,管控系统并行执行mongodump命令来备份数据。这里需要进行二次封装,确保每次执行后都能写入一个本地的status文件,记录备份的成功或失败状态。 轮询每个Shard上的状态文件:管控系统需要轮询每个Shard上的状态文件,检查备份是否成功。如果所有Shard都返回成功,则备份成功;如果存在失败或文件不存在,则需要继续轮询。 完成Shard备份后执行Configsvr备份:一旦所有Shard的备份都成功完成,管控系统将开始备份Configsvr。这同样需要查找Configsvr的主节点,然后执行备份。 Configsvr备份结果:Configsvr备份完成后,管控系统将收到备份结果,完成整个备份流程。 由此可见, 封装mongodump后的需要附加以下功能: 对接不同的灾备产品, 比如oss 对备份进行切分, 将备份上传到存储系统 上传备份数据到远程存储 全量恢复时序图 主要步骤: 管控系统遍历每个Shard查找主节点:管控系统首先需要确定每个分片(Shard)的主节点。 主节点上下载远程的存储文件:管控系统从远程存储下载备份文件。 重命名本地存储或发起本地备份:管控系统将下载的文件重命名或备份到本地存储,以便在恢复程序报错时支持数据回滚。 并行执行mongorestore异步命令:对于每个Shard,管控系统并行执行mongorestore命令来恢复数据。这里需要进行二次封装,确保每次执行后都能写入一个本地的status文件,记录恢复的成功或失败状态。 轮询每个Shard上的状态文件:管控系统需要轮询每个Shard上的状态文件,检查恢复是否成功。如果所有Shard都返回成功,则恢复成功;如果存在失败或文件不存在,则需要继续轮询。 完成Shard恢复后执行Configsvr恢复:一旦所有Shard的恢复都成功完成,管控系统将开始恢复Configsvr。这同样需要查找Configsvr的主节点,然后执行恢复。 Configsvr恢复结果:Configsvr恢复完成后,管控系统将收到恢复结果,完成整个恢复流程。 上面的时序新增了远程存储, 但是恢复的时候需要先下载到容器中, 可能导致数据有可能的三份膨胀: 下载到本地的远程的备份 本节点的原有备份数据 恢复过程中的数据 除了数据膨胀, 如果原先孵化pod的pvc存储不够, 可能会直接导致失败。 可能有人会这样想: 直接把本地数据删除, 然后远程下载解压不香吗? 还有人这样想, 我直接搞个新集群, 恢复完了, 再重命名回来? 第一个问题, 可以是可以, 但是服务就相当于宕机了, 而且恢复失败, 回滚也是比较费事了。第二个问题呢, 云原生里面的设计, 多租户隔离比较常见的, 可能这么操作比较不优雅。 ...

十二月 17, 2024 · 1 分钟 · 137 字 · zhu733756

MongoDB备份与恢复实战(一)

前戏 小白: 嘿, 老花。今天能聊聊 MongoDB 的数据备份与恢复, 特别是涉及到用户和用户权限数据的部分。这可是个技术活儿。 老花: 好的, 在回答你的问题前, 我们先思考几个问题。 关于备份恢复的几个问题 我们先搞清楚要备份的数据有哪些? 生产数据 用户 用户权限 备份是追求准确性还是性能? 从master备份, 可能会影响写数据, 但数据是全的 从slave备份, 不影响读写, 单如果主从同步延迟, 可能会丢数据 备份的集群模式是分片还是副本? 分片模式: 需要从多个节点上同时备份, 以提高性能, 注意, 需要备份configsvr。 副本模式: 只需要考虑从一个节点上备份。 要做增量备份还是全量备份? 恢复到其他实例? 管理员账号要调过还是覆盖? (这个只能业务处理了) 备份恢复工具简介 mongodump mongodump是官方提供的一个备份工具, 它支持一些参数: -h, –host:这个参数用来指定远程 MongoDB 数据库的地址。如果你不设置这个参数, mongodump 默认会尝试连接到本地的 MongoDB 实例。 –port:这个参数用来指定远程 MongoDB 数据库的端口号。默认情况下, mongodump 会连接到端口 27017, 这是 MongoDB 的默认端口。 -u, –username:如果你的数据库设置了认证, 这个参数就非常重要了。它用来指定连接远程数据库的用户名。 -p, –password:与用户名相对应, 这个参数用来输入对应用户名的密码, 以验证身份。 -d, –db:这个参数让你指定想要备份的特定数据库。 -c, –collection:如果你只想备份数据库中的某个特定集合, 这个参数就能派上用场。 -o, –out:这个参数用来指定备份文件的输出目录。备份完成后, 所有数据都会存储在这个目录下。 -q, –query:这个参数允许你指定查询条件, 从而只备份满足特定条件的数据。 -j, –numParallelCollections:这个参数用来设置并行转储的集合数, 可以提高备份效率。默认情况下, mongodump 会并行转储 4 个集合。 –gzip:如果你想要节省存储空间, 可以使用这个参数。它会将备份文件压缩成 gzip 格式。 –oplog:这个参数允许你使用 oplog(操作日志)进行时间点快照, 这对于需要精确到特定时间点的数据备份非常有用。` –authenticationDatabase:这个参数用来指定进行用户认证的数据库。有时候, 认证数据库和你要备份的数据库不是同一个。 全量备份 全量备份有两个思路, 挨个db进行备份, 或者通过--oplog来做日志全量备份。 ...

十二月 13, 2024 · 5 分钟 · 1052 字 · zhu733756