xjpvictor's Blog
小老鼠,上灯台,两只耳朵竖起来

vps备份


各种折腾·backupdropboxlinuxscriptvps

vps要勤备份,因为不知道什么时候就挂了,尤其是越来越多的资料放在vps上。就算是linode这种号称很牛掰的,也要防患于未然,不然哭都没地方哭去。

一个很流行的方案是用dropbox。两种办法,一种是安装dropbox客户端,一种是利用dropbox的api。用客户端很方便,直接把需要备份的文件mv或者ln -s到dropbox文件夹里就好。但问题是dropbox客户端实在是太耗费资源了,至少要占用100+MB的内存,内存不够就扣swap,导致磁盘io飙升。

而用dropbox的api虽然可以避免资源占用的问题,但是只能上传文件,如果是备份整个目录,尤其是目录里文件比较多,而且有很多次级目录的时候就很不方便。所以比较适合少量的单独的文件备份,比如说导出的数据库文件。

我的上传脚本

#!/bin/bash

dir=/path/to/the/directory/containing/the/script

APP_KEY="xxx"
APP_SECRET="xxx"
ACCESS_TYPE="dropbox"
API_REQUEST_TOKEN_URL="https://api.dropbox.com/1/oauth/request_token"
API_USER_AUTH_URL="https://www.dropbox.com/1/oauth/authorize"
API_ACCESS_TOKEN_URL="https://api.dropbox.com/1/oauth/access_token"
API_FILES_PUT_URL="https://api-content.dropbox.com/1/files_put/dropbox"

CONFIG="$dir/vps-upload.config"
TEMPFILE="/tmp/vps-upload"

if [ -f $CONFIG ];then
  OAUTH_ACCESS_TOKEN_SECRET=`cat $CONFIG | sed -n '1p'`
  OAUTH_ACCESS_TOKEN=`cat $CONFIG | sed -n '2p'`
  OAUTH_ACCESS_UID=`cat $CONFIG | sed -n '3p'`
  TIME_STAMP=`date +%s`
else
  #User authorize the app
  TIME_STAMP=`date +%s`
  curl -s --data "oauth_consumer_key=$APP_KEY&oauth_signature_method=PLAINTEXT&oauth_signature=$APP_SECRET%26&oauth_timestamp=$TIME_STAMP&oauth_nonce=$RANDOM" "$API_REQUEST_TOKEN_URL" -o $TEMPFILE
  AUTHORIZE_TOKEN_SECRET=`cat $TEMPFILE | awk -F'[=&]' '{print $2}'`
  AUTHORIZE_TOKEN=`cat $TEMPFILE | awk -F'[=&]' '{print $NF}'`
  echo "$API_USER_AUTH_URL?oauth_token=$AUTHORIZE_TOKEN"
  cat $TEMPFILE
  read

  #Obtain app access token
  TIME_STAMP=`date +%s`
  curl -s --data "oauth_consumer_key=$APP_KEY&oauth_token=$AUTHORIZE_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APP_SECRET%26$AUTHORIZE_TOKEN_SECRET&oauth_timestamp=$TIME_STAMP&oauth_nonce=$RANDOM" "$API_ACCESS_TOKEN_URL" -o $TEMPFILE
  OAUTH_ACCESS_TOKEN_SECRET=`cat $TEMPFILE | awk -F'[=&]' '{print $2}'`
  OAUTH_ACCESS_TOKEN=`cat $TEMPFILE | awk -F'[=&]' '{print $4}'`
  OAUTH_ACCESS_UID=`cat $TEMPFILE | awk -F'[=&]' '{print $NF}'`

  echo $OAUTH_ACCESS_TOKEN_SECRET > $CONFIG
  echo $OAUTH_ACCESS_TOKEN >> $CONFIG
  echo $OAUTH_ACCESS_UID >> $CONFIG
fi

filename=`echo "$1"|awk -F'/' '{print $NF}'`
DIR=`echo "$1"|awk -F'/' '{print $(NF-1)}'`
filesize=`du -b $1|awk -F' ' '{print $1}'`

curl -s -H "Content-Length: $filesize" -T "$1" "$API_FILES_PUT_URL/$DIR/$filename?oauth_consumer_key=$APP_KEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APP_SECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$TIME_STAMP&oauth_nonce=$RANDOM" -o /dev/null

用法很简单,去dropbox建立一个新app,然后修改 dir 为脚本所在目录,修改 APP_KEY和 APP_SECRET,执行脚本,这时候会给出一个网址,到浏览器打开这个网址对app进行授权,然后回到脚本enter,脚本会在同一个目录下新建 vps-upload.config 文件,里面是 ACCESS_TOKEN_SECRET, ACCESS_TOKEN 和 USER_ID。这样就可以用了。需要上传文件的时候就用

/full/path/of/the/script /full/path/of/the/file/to/be/uploaded

上传的文件最好用绝对路径,因为脚本会判断文件所在的目录,然后上传到dropbox里相应的目录下,比如我的备份文件放在 /backup/vps/xxxx.gz,上传后就会放在dropbox里的 vps/ 目录下。需要事先在dropbox里建立好目录。懒得添加判断目录是否存在新建目录之类的了,太麻烦,而且我也用不到,反正是定时备份,目录都是固定的,建好就不用管了。

这个脚本我用来备份几个数据库文件,以及系统目录的打包文件,但是对于有一堆文件的目录就不行了。当然可以遍历整个目录再一个个上传,但还是不方便。所以对于这类文件的备份,我选择了git。

先把这些要备份的文件ln -s到一起,然后备份的时候用

cp -rL .

把所有文件拷到另一个目录下,而这个目录就是git所在的目录的。要这么麻烦是因为git不会follow链接的,如果不把源文件拷过去就只能上传一个链接了。然后在bitbucket建立一个私有项目,上传就好了。

git add .
git commit -a -m 'update'
git push -u origin master

不要用github,除非能确定一定以及肯定上传的东西里没有任何敏感的隐私一类的,因为github的免费账户只能有公开项目,而bitbucket可以有私有项目。

使用git的好处在于可以备份一堆文件又不需要打包。比如/etc中的配置文件,这些文件在各种目录中,而且数量也多,用dropbox的api一个一个上传显然很麻烦。git的另外一个好处是每次只需要上传有变化的文件,而dropbox的api是不管三七二十一先上传再说,然后再看文件有没变化。

所以我把/etc中所有修改过的配置文件都用这种方法备份,这样我可以隔很久才打包整个/etc进行备份,而且如果vps出了小问题,我不需要把整个/etc的打包文件下载下来,只需要下载需要的配置文件就好了。当然系统目录的打包备份还是需要的,毕竟如果系统完全挂掉了的话,直接把打包文件下载再还原会比较方便。

所以现在我的备份方法就是每天备份数据库,通过api上传到dropbox,然后每周通过git更新bitbucket上备份的配置文件,每个月把系统目录打包备份,再每三个月做一次整磁盘镜像,应该算是够用了吧。其实对于git的备份可以用rsync替代,但是我没有另外一台服务器,又不想备份到自己笔记本上,所以还是算了吧。

本文 "vps备份" 由 K. Huang 首先发表于 xjpvictor's Blog 并以 CC BY-NC 4.0 许可证发布 © 2012
转载注明引用来源 https://blog.xjpvictor.info/2012/07/vps-backup/

赞助我

评论

你的邮箱地址不会被公开。必填项以 * 标出

无意义或不相关评论将被删除

取消 上传图片 或拖拽上传

* Some files will not be uploaded. Only png, gif, jpg are allowed and maximum 10 images, each file less than 10M.

你可以添加 10 个 png/gif/jpg 图片 (每个文件小于 10M)

允许使用以下html标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

你可以上传文件,粘贴代码或长文至 Drop.it.r

更多相似文章