• Emacs と Perl を使って,XML-RPC 経由で Movable Type のエントリを編集するツールを配布しています.良かったら持っていってください.( 2004/10/24 update) mapae logo
  • Movable Type で footnote*1 を生成する plugin を配布しています.良かったら持っていってください.( 2004/03/04 update )
  • その他の配布物等

*1: 脚注.よ〜するに,こ〜ゆ〜やつです.

ShionBackup

| コメント(0) | トラックバック(0)

去年、ウェブサーバを外の VPS に変えたのですが、ついでなのでバックアップを AWS S3 にしたいな、と思いまして。

実は、半年近く前から運用を始めているのですが、コードの整理が進まず今更の公開になった次第。

  • やりたかったこと
    • シェルコマンドの組み合わせでバックアップを取得する
    • バックアップデータを暗号化する
    • バックアップ作成時の使用ディスク量を少なくする
      • VPS のディスクが 10GB しかないので、バックアップの中間データ作成に 5GB 必要、とかいうのはナンセンス。
    • 複数世代のバックアップを保持する
  • やらなくてもよかったこと
    • アトミックなバックアップ
      • 更新頻度はそれほど高くないので、バックアップをアトミックにとる必要は無い。
      • どうしても必要になったら、lvm とか btrfs とかで、バックアップの外側で考える。
  • できればよいこと
    • 設定をテンプレート化し、テンプレートの組み合わせで目的の動作をさせたい
      • 圧縮するテンプレートとか、暗号化するテンプレートとか。
    • 公開鍵で暗号化してサーバ上には秘密鍵は置かない、という運用をしてみたい
    • S3 の 低冗長化ストレージ(Reduced Redundancy Storage/ RRS) を使えるようにしたい

というわけで、実装方針。

  • 各コマンドは直接パイプで接続して、できるだけディスクを消費しないようにする
  • アップロードするデータは、S3 の分割アップロードに必要なだけパイプから読み出し、中間ファイルに保存する
    • アップロードが終わるまでの間は、パイプの IO が勝手にブロックしてくれる
  • 設定ファイルは yaml で記述
  • テンプレートは、利用時に深さ優先でマージする
  • ↑でマージアルゴリズムを書いたので、設定ファイルも分割記述できるようにして、使用時にマージする
    • S3 の secret が書いてあるファイルだけパーミッション 600にする、とかができるようになる
  • 動作ログは、標準/標準エラー出力に出す
    • 必要に応じて、logmailerで内容をメールする。
  • アップロード先の URL 指定は、perl のコードで記述し動的に生成できるようにして、複数世代を実現する

ソースコードやヘルプは https://github.com/nymjp/ShionBackup に。名前の由来は、shion という名前をつけているマシンのバックアップ用に書いたから。

ちなみに、このサーバの場合は、

## s3.yaml
uploader:
  id     : ひみつ
  secret : ひみつ
  url    : !!perl/code: '{"https://ひみつ.s3.amazonaws.com/set" . (time/( 3600*24*7 ) % 2 + 1) . "/"}'
## target.yaml
target:
  # git
  - filename: git.tar.bz2.gpg
    template: fs-compress
    arg:
      tar_src: some/where/git

# diary
  - filename: diary-db.sql.bz2.gpg
    template: mysql
    arg:
      mysqldump_db: ひみつ
  - filename: diary-data.tar.gpg
    template: fs
    arg:
      tar_src: some/where/htdocs/diary

として感じで、

## crontab
25 1 * * * logmailer --config /etc/backup/logmailer.yaml \
  --ts --subject="Backup: `date +\%F`" --subject-prefix='2:**ALERT** ' \
  --tee=3 --type=3:nomail --file=3:/var/log/backup.log --nots=3 \
  -- shion-backup /etc/backup/{template.yaml,s3.yaml,target.yaml}

のような感じで運用している。

トラックバック(0)

トラックバックURL: http://d.nym.jp/mt/trackback/2109

コメントする

最近のコメント

アーカイブ

Author

nym <n...@nym.jp>
Powered by Movable Type 5.161-ja