我使用的堆栈的相关部分是Node.js,MongoDB和Elasticsearch.
到目前为止,备份是通过转储整个MongoDB数据库,保存ES配置以及复制应用程序目录中的所有其他文件(日志,代码本身等)来完成的.如果是本月的第一天,所有用户文件也会被复制,否则只会添加自本月第一天起更改的文件.然后将所有这些压缩到一个文件中并上传到Amazon S3.
数据大小已达到此进程占用过多磁盘空间的程度,并且无法一次性将文件上载到S3.
这个大小的应用程序的下一个级别是什么(8 GB用户文件,125,000个用户,3,000个其他文档,所有可在ES中搜索)?
我理解基于意见的问题在服务器故障上是不行的.我不是在征求意见,而是正常的,具有成本效益的解决方案适用于这种规模的应用.
更新:这些是我试图使用Duplicity的脚本和配置的相关部分.我正在使用Node来管理备份,因为它适合我现有的日志记录解决方案,已经安排在低活动时间内与其他所有内容保持一致,并且可以在操作系统之间移植.
节点脚本,日志记录当然需要改进:
- // Walks a directory recursively and returns a flat list of files
- function walkDir() {};
- // Node based rm -rf
- function rmrf() {};
- exec("mongodump --out dump",{ cwd: process.cwd() },function(err,dta) {
- if (err) return log("Error backing up: couldn't dump MongoDB!");
- exec("sudo duply ats backup",function(err) {
- if (err) log("Error running Duplicity");
- else rmrf("dump");
- log("Exiting.");
- process.exit();
- });
- });
Duplicity配置:
- GPG_PW='GPG password'
- TARGET='s3://s3-us-east-1.amazonaws.com/bucket'
- TARGET_USER='Known working AWS credentials'
- TARGET_PASS='AWS secret key'
- SOURCE='/var/appdir'
- MAX_AGE=6M
- DUPL_PARAMS="$DUPL_PARAMS --exclude "/var/appdir/elasticsearch/data/**" "
我尝试过-s3-use-new-style,使用s3 http://,然后设置S3_USE_SIGV4但没有运气.
这是我从Duplicity获得的日志:
- Start duply v1.5.10,time is 2015-07-05 09:30:13.
- Using profile '/root/.duply/ats'.
- Using installed duplicity version 0.6.23,python 2.7.6,gpg 1.4.16 (Home: ~/.gnu pg),awk 'GNU Awk 4.0.1',bash '4.3.11(1)-release (x86_64-pc-linux-gnu)'.
- Signing disabled. Not GPG_KEY entries in config.
- Test - Encryption with passphrase (OK)
- Test - Decryption with passphrase (OK)
- Test - Compare (OK)
- Cleanup - Delete '/tmp/duply.25562.1436103014_*'(OK)
- --- Start running command PRE at 09:30:14.155 ---
- Skipping n/a script '/root/.duply/ats/pre'.
- --- Finished state OK at 09:30:14.183 - Runtime 00:00:00.027 ---
- --- Start running command BKP at 09:30:14.208 ---
- Reading globbing filelist /root/.duply/ats/exclude
- BackendException: No connection to backend
- 09:31:27.427 Task 'BKP' Failed with exit code '23'.
- --- Finished state Failed 'code 23' at 09:31:27.427 - Runtime 00:01:13.218 ---
- --- Start running command POST at 09:31:27.465 ---
- Skipping n/a script '/root/.duply/ats/post'.
- --- Finished state OK at 09:31:27.491 - Runtime 00:00:00.026 ---
解决方法
通常问题是备份数据库(MongoDB,ElasticSearch,MysqL,你的名字)是一致性.同样的事情适用于支持常见文件,但对于数据库,数据损坏的风险可能是最高的.
你有几个选择(希望其他人会增加更多)
>转储数据库并备份转储.这是最简单,最安全,最直接的.
>停止数据库(或使用其他方法使磁盘数据保持一致)并进行备份. (这样会造成很长的停机时间,并非总是可行)
>停止数据库(如在#2中),执行快照(卷或fs,确保fs在该点保持一致),启动数据库,以只读方式挂载快照并将其备份.但并非所有设置都适用于此.
>停止数据库(如在#2中),执行快照(这次它仅适用于卷,将快照备份为块设备.这可能会增加备份的大小,并且可能无法在所有配置上实现.
>备份实时数据库文件,并希望它在恢复时能够正常工作. (你在这里玩火.)如果可能的话,远离这个.
>如果您的技术有特殊的备份方式,请使用它. (就像从ELB到S3的直接快照备份一样.)
无论您选择哪种方式,请记住,您绝对应该测试您是否能够从备份中多次从几个不同的备份中恢复.
- #!/bin/bash
- BACKUP_BASE="/data/backups/"
- DIRNAME="mongo"
- BUCKET="mybackups"
- ARCHIVE_DIR="/data/backups_duplicity_archives/${DIRNAME}"
- VERBOSE="-v 4"
- S3_PARAMS="--s3-use-new-style" # --s3-use-multiprocessing" # --s3-use-rrs"
- export PASSPHRASE="something"
- export AWS_ACCESS_KEY_ID="AN_ID"
- export AWS_SECRET_ACCESS_KEY="A_KEY"
- cd ${BACKUP_BASE}
- rm -rf ${BACKUP_BASE}/${DIRNAME}
- /usr/bin/mongodump -h 10.0.0.1 -o ${BACKUP_BASE}/${DIRNAME}/databasename --oplog
- /usr/bin/duplicity $S3_PARAMS --asynchronous-upload ${VERBOSE} --archive-dir=${ARCHIVE_DIR} incr --full-if-older-than 14D ${BACKUP_BASE}/${DIRNAME} "s3+http://${BUCKET}/${DIRNAME}"
- if [ ! $! ]; then
- /usr/bin/duplicity $S3_PARAMS ${VERBOSE} --archive-dir=${ARCHIVE_DIR} remove-all-but-n-full 12 --force "s3+http://${BUCKET}/${DIRNAME}"
- /usr/bin/duplicity $S3_PARAMS ${VERBOSE} --archive-dir=${ARCHIVE_DIR} remove-all-inc-of-but-n-full 4 --force "s3+http://${BUCKET}/${DIRNAME}"
- fi