在WAL-G中以良好的方式备份MongoDB
起初
Misskey v10, 喵喵密钥服务器的各位,
你们有备份数据库吗?
最近,我尝试了一下我一直在使用PostgreSQL的物理备份工具WAL-G先生对mongoDB的支持(虽然只是beta版本)。
以前对于mongoDB,只能使用mongodump在本地创建备份,然后压缩并保存到存储中,但现在通过这个工具可以将备份压缩并上传到对象存储中,非常方便。
虽然只是beta版本,但它可以导出类似WAL的Oplog,可能对点恢复很有帮助。
以前处理Oplog比WAL复杂一些,但WAL-G先生做了一些改进,使得操作更容易了。
さらに可用性を高めるならレプリケーションと併用するとよいでしょう。
https://qiita.com/atsu1125/items/df0ca4d47b835f22dbd3
こちらにまとめておきました。
工作环境
OS: Debian Bullseye
Software version: mongoDB Community Edition 5.0.10
WAL-G: v2.0.1
mongoDBを使用しているアプリケーションはめいすきーです。
https://github.com/atsu1125/misskey
個人的にとても優れたオープンソースのSNSソフトウェアなのでおすすめです。
が基本的にはmongoDBの利用するソフトウェア全て向けに書いています。
WAL-G的安装
将已编译的可执行文件放入其中。
wget https://github.com/wal-g/wal-g/releases/download/v2.0.1/wal-g-mongo-ubuntu-20.04-amd64
chmod +x wal-g-mongo-ubuntu-20.04-amd64
mv wal-g-mongo-ubuntu-20.04-amd64 /usr/local/bin/wal-g-mongo
環境變數的定義
接下来创建/usr/local/bin/wal-g-mongo.sh。
这是一个包装器脚本。这个脚本用来操作环境变量。
请自行根据个人需求进行配置。
我们使用了S3兼容的存储,但也可以使用GS。
具体参考https://qiita.com/atsu1125/items/676d24c0473ad94b3f2b#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E5%AE%9A%E7%BE%A9。
#!/bin/bash
export AWS_ACCESS_KEY_ID="アクセスキー"
export AWS_SECRET_ACCESS_KEY="シークレット"
export AWS_ENDPOINT="https://エンドポイント"
export WALG_S3_PREFIX="s3://バケット名/"
export MONGODB_URI="mongodb://ユーザー名:パスワード@localhost:27017/?authSource=認証データベース名&socketTimeoutMS=60000&connectTimeoutMS=10000"
export WALG_STREAM_CREATE_COMMAND='mongodump --archive --oplog -h localhost:27017 -u ユーザー名 -p パスワード --authenticationDatabase 認証データベース名'
export WALG_STREAM_RESTORE_COMMAND='mongorestore --archive --oplogReplay -h localhost:27017 -u ユーザー名 -p パスワード --authenticationDatabase 認証データベース名'
export OPLOG_ARCHIVE_TIMEOUT_INTERVAL="30s"
export OPLOG_ARCHIVE_AFTER_SIZE="20971520"
export OPLOG_PITR_DISCOVERY_INTERVAL="168h"
export OPLOG_PUSH_WAIT_FOR_BECOME_PRIMARY="true"
export WALG_COMPRESSION_METHOD="brotli"
exec /usr/local/bin/wal-g-mongo "$@"
设置完整备份
我希望将完全备份服务化。
systemctl edit --full --force wal-g-mongo-dump.service
在中国境内,只需要一种选择
[Unit]
Description = Push mongodump
[Service]
Type = oneshot
User = root
WorkingDirectory = /usr/local/bin
ExecStart = /usr/bin/bash -c '/usr/local/bin/wal-g-mongo.sh backup-push'
ExecStartPost = /usr/bin/bash -c '/usr/local/bin/wal-g-mongo.sh delete --retain-count 7 --confirm'
ExecStartPost = /usr/bin/bash -c '/usr/local/bin/wal-g-mongo.sh oplog-purge --confirm'
可以通过手动执行此服务来将数据库备份传输到对象存储中。
我们保留了最近7个备份。
因此,我希望能够定期执行此操作。
systemctl edit --full --force wal-g-mongo-dump.timer
在中文中,只需要提供一种选项即可:
因为上文无具体描述,这句话的中文翻译很难确定。可能需要更多的背景信息来提供准确的翻译。若提供更多上下文信息,我将很乐意帮助您进行翻译。
[Unit]
Description=Push mongodump Timer
[Timer]
OnCalendar=daily
Persistent=false
RandomizedDelaySec=3600
[Install]
WantedBy=timers.target
每天大约在午夜0点内,执行延迟不超过3600秒。
systemctl enable --now wal-g-mongo-dump.timer
你可以通过这个计时器来开始。
关于执行日志等方面
systemctl status wal-g-mongo-dump
journalctl -xeu wal-g-mongo-dump
systemctl list-timers
我会在附近确认一下。
oplog的归档设置
我想要对oplog进行归档,以便在点恢复中使用。
在MongoDB中执行oplog push似乎是一个很好的服务。
systemctl edit --full --force wal-g-mongo-oplog.service
我不懂日语,请问你能不能用中文重新解释一下?
[Unit]
Description = Push mongo oplog
Requires = mongod.service
[Service]
Type = simple
User = root
WorkingDirectory = /usr/local/bin
ExecStart = /usr/bin/bash -c '/usr/local/bin/wal-g-mongo.sh oplog-push'
Restart = always
[Install]
WantedBy = multi-user.target
请提供输入。
这个是在 MongoDB 启动后作为一个服务运行的。
systemctl enable --now wal-g-mongo-oplog.service
请自动启动并开始服务。
systemctl status wal-g-mongo-oplog.service
journalctl -xeu wal-g-mongo-oplog.service
让我们来看一下是否正常运行。