Closed14

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

ganyariyaganyariya

https://github.com/ganyariya/playground/tree/feature/gcp-disk-snapshot

上記ブランチで terraform を書いた
具体的には動作確認用ディスク・インスタンスとして

  • disk1
  • instance1

を用意した
(disk1 のような命名にしているのはスナップショットが 60 分の間に 6 回までしか取れないため、上限に到達したら disk2, instance2 を用意したいため)

ganyariyaganyariya

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
ganyariyaganyariya


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

ganyariyaganyariya

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:~$

ganyariyaganyariya


「増分スナップショット」のため、2 回目のスナップショットは差分だけ取得されている。
random2 = 10MB のため、 10.01 MB ぐらいかなと思ったが 11.21 MB ある

おそらくシステムファイル側で変更があって +1M ぐらいになっている?

ganyariyaganyariya

同様に 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:~$

ganyariyaganyariya


3 回目のスナップショットは 5MB 強になった

random2(10MB) を書き換えて random2(5MB) にしたため、 10 + 5 = 15MB になるかと思ったが
そのままの容量を取るようであるため 5 MB 担っている気がする

ganyariyaganyariya

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を順に取っているとする。
このとき、 k 番目のスナップショットを指定して VM の起動ディスクとすると、 s_1, s_2, \dots, s_k までのスナップショットが順番に結合されたディスクが生成される。
s_{k+1}, \dots, s_N は適用されない。

ganyariyaganyariya

続いて 2 つ目のスナップショットを削除する。


この状態でスナップショット 1 とスナップショット 3 を clone した VM をそれぞれ作成する。


ganyariyaganyariya
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} を参照するようになる。

ganyariyaganyariya

https://cloud.google.com/compute/docs/disks/about-snapshot-schedules?hl=ja

スナップショットの挙動が確認できたため、スナップショットスケジュールを設定する。

スナップショットの自動削除までの期間 によって、何個スナップショットが保持されるかが決まる。
今回は 4 に設定したため、 4 日間経ったら削除される。
(古いものが消されたとき、1つ次に新しいものに自動でマージされる)

1 時間ごとにスナップショットを取っているため、 4 * 24 = 96 個スナップショットが保存され、1時間ごとに 1 つ消える & 1 時間ごとに1つ増えるという挙動になるはず。
(そのため、常に 96 個スナップショットが残っている。)

会社で行っているスナップショットの挙動を見ると、手動でスナップショットとして取ったものはスナップショットスケジュールでは消されない
スナップショットスケジュールで消されるものは「スナップショットスケジュールによって自動的に取得された。かつ、自動削除期間経過したもの」になるためである。

ganyariyaganyariya

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

このスクラップは2025/02/16にクローズされました