GCP のディスクスナップショットの挙動を動かしながら学ぶ

学びます

上記ブランチで terraform を書いた
具体的には動作確認用ディスク・インスタンスとして
- disk1
- instance1
を用意した
(disk1 のような命名にしているのはスナップショットが 60 分の間に 6 回までしか取れないため、上限に到達したら disk2, instance2 を用意したいため)

instance1 に sample.txt を用意して hello, world! 2025-02-09 1st
を記載した。
また、どれぐらい容量を使ったかテストするために、 100MB の random1 ファイルを用意した(中身はランダム文字列が 100MB ぶんある)
ganyariya@instance1:~$ dd if=/dev/urandom of=~/random1 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.576969 s, 182 MB/s
ganyariya@instance1:~$ ls -lah
total 101M
drwxr-xr-x 3 ganyariya ganyariya 4.0K Feb 9 07:01 .
drwxr-xr-x 4 root root 4.0K Feb 9 06:45 ..
-rw-r--r-- 1 ganyariya ganyariya 220 Mar 29 2024 .bash_logout
-rw-r--r-- 1 ganyariya ganyariya 3.5K Mar 29 2024 .bashrc
-rw-r--r-- 1 ganyariya ganyariya 807 Mar 29 2024 .profile
drwx------ 2 ganyariya ganyariya 4.0K Feb 9 06:45 .ssh
-rw------- 1 ganyariya ganyariya 793 Feb 9 06:58 .viminfo
-rw-r--r-- 1 ganyariya ganyariya 100M Feb 9 07:01 random1
-rw-r--r-- 1 ganyariya ganyariya 29 Feb 9 06:58 sample.txt

1 回目のスナップショットを取る
789 MB あり、「bin 配下などの debian システムファイル群 + random1 + sample.txt」 を圧縮してこれだけのサイズになっていそう

2 回目のスナップショット前に
- sample.txt に行を追加する (2nd)
- random2 (10MB) を生成する
を行う
ganyariya@instance1:~$ cat sample.txt
hello, world! 2025-02-09 1st
hello, world! This is second!! 2025-02-09 2nd
ganyariya@instance1:~$ ls -lah
total 111M
drwxr-xr-x 3 ganyariya ganyariya 4.0K Feb 9 07:12 .
drwxr-xr-x 4 root root 4.0K Feb 9 06:45 ..
-rw-r--r-- 1 ganyariya ganyariya 220 Mar 29 2024 .bash_logout
-rw-r--r-- 1 ganyariya ganyariya 3.5K Mar 29 2024 .bashrc
-rw-r--r-- 1 ganyariya ganyariya 807 Mar 29 2024 .profile
drwx------ 2 ganyariya ganyariya 4.0K Feb 9 06:45 .ssh
-rw------- 1 ganyariya ganyariya 1.2K Feb 9 07:11 .viminfo
-rw-r--r-- 1 ganyariya ganyariya 100M Feb 9 07:01 random1
-rw-r--r-- 1 ganyariya ganyariya 10M Feb 9 07:12 random2
-rw-r--r-- 1 ganyariya ganyariya 75 Feb 9 07:11 sample.txt
ganyariya@instance1:~$

「増分スナップショット」のため、2 回目のスナップショットは差分だけ取得されている。
random2 = 10MB のため、 10.01 MB ぐらいかなと思ったが 11.21 MB ある
おそらくシステムファイル側で変更があって +1M ぐらいになっている?

同様に 3 回目も行う
- sample.txt に 3 行目の追加
- random2 (10MB) を書き換えて 5MB に変更
- 本当は random3(5MB) を作りたかったけど、コマンド修正し忘れて random2 を直接書き換えちゃった
dd if=/dev/urandom of=~/random2 bs=1M count=5
ganyariya@instance1:~$ cat sample.txt
hello, world! 2025-02-09 1st
hello, world! This is second!! 2025-02-09 2nd
hello, world! This is third... 2025-02-09 3rd
ganyariya@instance1:~$ ls -lah
total 106M
drwxr-xr-x 3 ganyariya ganyariya 4.0K Feb 9 07:16 .
drwxr-xr-x 4 root root 4.0K Feb 9 06:45 ..
-rw-r--r-- 1 ganyariya ganyariya 220 Mar 29 2024 .bash_logout
-rw-r--r-- 1 ganyariya ganyariya 3.5K Mar 29 2024 .bashrc
-rw-r--r-- 1 ganyariya ganyariya 807 Mar 29 2024 .profile
drwx------ 2 ganyariya ganyariya 4.0K Feb 9 06:45 .ssh
-rw------- 1 ganyariya ganyariya 1.6K Feb 9 07:16 .viminfo
-rw-r--r-- 1 ganyariya ganyariya 100M Feb 9 07:01 random1
-rw-r--r-- 1 ganyariya ganyariya 5.0M Feb 9 07:16 random2
-rw-r--r-- 1 ganyariya ganyariya 121 Feb 9 07:16 sample.txt
ganyariya@instance1:~$

3 回目のスナップショットは 5MB 強になった
random2(10MB) を書き換えて random2(5MB) にしたため、 10 + 5 = 15MB になるかと思ったが
そのままの容量を取るようであるため 5 MB 担っている気がする

3 回目のスナップショットまで行っている。
ここで取得済みのスナップショットを利用して新しいインスタンスを立ててみる。
2 回目のスナップショットを起動ディスクとして cloned-instance1-by-instance1-snapshot2
を用意する。
作成されたインスタンスにログインすると以下のようになっていた。
1, 2 つ目までのスナップショットが結合され、 This is second!! 2025-02-09 2nd
までになっていた
(This is 3rd はない)
ganyariya@cloned-instance1-by-instance1-snapshot2:~$ ls
random1 random2 sample.txt
ganyariya@cloned-instance1-by-instance1-snapshot2:~$ cat sample.txt
hello, world! 2025-02-09 1st
hello, world! This is second!! 2025-02-09 2nd
ganyariya@cloned-instance1-by-instance1-snapshot2:~$ ls -la
total 112672
drwxr-xr-x 3 ganyariya ganyariya 4096 Feb 9 07:12 .
drwxr-xr-x 4 root root 4096 Feb 9 06:45 ..
-rw-r--r-- 1 ganyariya ganyariya 220 Mar 29 2024 .bash_logout
-rw-r--r-- 1 ganyariya ganyariya 3526 Mar 29 2024 .bashrc
-rw-r--r-- 1 ganyariya ganyariya 807 Mar 29 2024 .profile
drwx------ 2 ganyariya ganyariya 4096 Feb 9 07:27 .ssh
-rw------- 1 ganyariya ganyariya 1183 Feb 9 07:11 .viminfo
-rw-r--r-- 1 ganyariya ganyariya 104857600 Feb 9 07:01 random1
-rw-r--r-- 1 ganyariya ganyariya 10485760 Feb 9 07:12 random2
-rw-r--r-- 1 ganyariya ganyariya 75 Feb 9 07:11 sample.txt
そのため、ここから以下のように言える。
あるディスク
について X 個のスナップショット N を順に取っているとする。 s_1, s_2, \dots, s_N
このとき、番目のスナップショットを指定して VM の起動ディスクとすると、 k までのスナップショットが順番に結合されたディスクが生成される。 s_1, s_2, \dots, s_k
は適用されない。 s_{k+1}, \dots, s_N

続いて 2 つ目のスナップショットを削除する。
この状態でスナップショット 1 とスナップショット 3 を clone した VM をそれぞれ作成する。

ganyariya@cloned-instance1-by-instance1-snapshot1:~$ ls
random1 sample.txt
ganyariya@cloned-instance1-by-instance1-snapshot1:~$ cat sample.txt
hello, world! 2025-02-09 1st
ganyariya@cloned-instance1-by-instance1-snapshot1:~$
ganyariya@cloned-instance1-by-instance1-snapshot3:~$ ls
random1 random2 sample.txt
ganyariya@cloned-instance1-by-instance1-snapshot3:~$ cat sample.txt
hello, world! 2025-02-09 1st
hello, world! This is second!! 2025-02-09 2nd
hello, world! This is third... 2025-02-09 3rd
cloned-instance1-by-instance1-snapshot{1, 3} の中をそれぞれ確認したところ
- cloned-instance1-by-instance1-snapshot1 の中身はそのまま
1st
のテキストのみ - cloned-instance1-by-instance1-snapshot3 の中身はそのまま
1st, 2nd, 3rd
のテキストのみ
だった。
そのため、 snapshot2 の削除内容は snapshot3
に移動・適用されたと考えられる。
あるディスク
について X 個のスナップショット N を順に取っているとする。 s_1, s_2, \dots, s_N
このとき、番目のスナップショット k を削除したとき s_k の内容は s_k に適用・移動される。 s_{k+1}
その後、のスナップショットは s_{k+1} を参照するようになる。 s_{k-1}

スナップショットの挙動が確認できたため、スナップショットスケジュールを設定する。
スナップショットの自動削除までの期間
によって、何個スナップショットが保持されるかが決まる。
今回は 4 に設定したため、 4 日間経ったら削除される。
(古いものが消されたとき、1つ次に新しいものに自動でマージされる)
1 時間ごとにスナップショットを取っているため、 4 * 24
= 96 個スナップショットが保存され、1時間ごとに 1 つ消える & 1 時間ごとに1つ増えるという挙動になるはず。
(そのため、常に 96 個スナップショットが残っている。)
会社で行っているスナップショットの挙動を見ると、手動でスナップショットとして取ったものはスナップショットスケジュールでは消されない。
スナップショットスケジュールで消されるものは「スナップショットスケジュールによって自動的に取得された。かつ、自動削除期間経過したもの」になるためである。

スナップショットを実際にディスクに適用するには、「作成されたスナップショットスケジュール」をディスク側で指定する必要がある