サーバーのバックアップシステムの見直し

サーバー定期メンテで再起動に失敗したのでいろいろ調べた結果、バックアップのやり方を変えることにした。

何があったか

また月次バックアップと再起動後にサーバーが再起動できなかった。
原因はわかっていて、バックアップデータがあまりにも大きくてサーバーのストレージを圧迫してしまい、mysqlが起動しなくなるから。

$ ls -lha
合計 41G
drwxrwxr-x  2 user user 4.0K  5月  1 20:20 .
drwxr-x--- 12 user user 4.0K  5月  8 23:02 ..
-rw-r--r--  1 root root  41G  5月  1 00:29 backup_volumes_20260501.tar.gz

なんせまぁバックアップファイル1個だけで41GBもある。

現在の状態

現在のシステムは、dockerのボリュームをまとめてるディレクトリを丸ごとtar.gzで圧縮している。で、後でその圧縮ファイルをダウンロードしている。

問題はこのtar.gzファイルが上記の通り1個40GBを超えてて、3個もあればストレージの2/3を持っていくくらいにでかい。

ちなみに、圧縮にも20~30分くらい掛かってる。ダウンロードも30分はかかる。

新システム

前にローカルでちょこっと使ってたresticを使うことにした。このツールだったら差分バックアップも取れるし、何かと便利だったから。

resticの準備

公式の手順に従ってresticをインストール。

$ cat /dev/random | base64 | head -c 20 > restic_password.txt
$ export RESTIC_PASSWORD=$(cat restic_password.txt)

適当にパスワードを作って環境変数のRESTIC_PASSWORDに設定。この環境変数を設定しておくと、resticでアレコレするときにパスワードを聞かれなくて済む。

$ sudo -E restic init -r /path/to/backup

restic initでresticを初期化。sudoするのであれば、環境変数を渡さないといけないので、-Eオプションを付ける。

resticが初期化できたら、

$ sudo -E restic -r /path/to/backup --verbose backup /path/to/volumes/

でバックアップ実行。

……なんか妙にバックアップが重い。流れているログをよーく見たらminecraftのディレクトリの中にminecraftのデータのバックアップディレクトリとそれを圧縮した.tar.gzファイルがある。そんなのバックアップしてもしょうがないので、一旦バックアップを中止してからファイルとディレクトリを削除して再度バックアップ。

最終的に2分ほどでバックアップ完了。.tar.gzにするのが20~30分なので、かなり速くなった。バックアップも18GBほどで、半分ほどになった。(minecraftの謎のバックアップを消したからかな?)

バックアップデータの回収

今のままだと実データとバックアップが同じところにあって全く意味がないので、バックアップデータを家のNASに回収する。

とりあえず回収してみる

resticにもバックアップリポジトリのコピー機能があるんだけど、ちょっとよくわからなかったので、rsyncで取得することに。

$ rsync -ave 'ssh' mattyan.net:/path/to/backup /path/to/backup_local/mattyan.net/
receiving incremental file list
rsync: [sender] opendir "/path/to/backup/data" failed: Permission denied (13)
rsync: [sender] opendir "/path/to/backup/index" failed: Permission denied (13)
rsync: [sender] opendir "/path/to/backup/keys" failed: Permission denied (13)
rsync: [sender] opendir "/path/to/backup/locks" failed: Permission denied (13)
rsync: [sender] opendir "/path/to/backup/snapshots" failed: Permission denied (13)
rsync: [sender] send_files failed to open "/path/to/backup/config": Permission denied (13)
./
data/
index/
keys/
locks/
snapshots/

sent 70 bytes  received 245 bytes  210.00 bytes/sec
total size is 155  speedup is 0.49
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1865) [generator=3.2.7]

取得に失敗。resticのバックアップデータのパーミッションが

$ ls -la /path/to/backup/
合計 32
drwxr-xr-x   7 root root 4096  5月  1 20:46 .
drwxr-xr-x   5 root root 4096  5月  1 20:23 ..
-r--------   1 root root  155  5月  1 20:46 config
drwx------ 258 root root 4096  5月  1 20:46 data
drwx------   2 root root 4096  5月  1 20:48 index
drwx------   2 root root 4096  5月  1 20:46 keys
drwx------   2 root root 4096  5月  1 20:48 locks
drwx------   2 root root 4096  5月  1 20:48 snapshots

とroot以外読めなくなっているため。仕方がないので、visudoでrsyncのみパスワードなしでsudoできるようにして

$ rsync -acve 'ssh' --rsync-path="sudo rsync" mattyan.net:/path/to/backup /path/to/backup_local/mattyan.net/

でsudoしてrsyncするようにしたら取得に成功。

バックアップデータの確認

「取得はできたけど開けませんでした」では意味がないので、ダウンロードしたバックアップデータを開いてみる。

$ mkdir backup
$ restic -r /path/to/backup_local/mattyan.net/ mount ./backup/

でバックアップを開いて

$ ls backup/snapshots/latest/path/to/volumes/

で中身を確認。とりあえずバックアップは開けそうだ。

自動化

とりあえず月次メンテナンススクリプトを修正して、tar.gzをするのではなくresticでバックアップするように変更。あとは家のラズパイにrsyncするスクリプトを作ってインストール。来月からはもっと早くサーバー再起動までできるはず。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です