表題の通り ACFS(ASM Cluster File System) のスナップショットで COW(コピーオンライト) を体験してみますやで。
彡(^)(^)
1. COW(コピーオンライト)とは?
Wikipedia に解説されています。この記事ではファイルシステムおよびファイルシステムのスナップショットとしてのコピーオンライトを取り扱います。
ファイルシステムにおけるコピーオンライトは、ファイルの特定断面をスナップショット(ファイルの実体へのポインタ集合)として管理/保護して、変更差分を別領域に書き込む仕組み(コピーオンライト)です。
ACFS のスナップショットについては下記マニュアルに記載があります。
Oracle ACFSスナップショットについて
https://docs.oracle.com/cd/G47991_01/acfsg/understand-acfs-concepts.html#GUID-5A3EF695-A795-4FEA-8BE2-AF657BD2238C
スナップショット・コピーは領域使用効率がよく、copy-on-write機能を使用します。
環境は OCI BaseDB の GI/ASM環境を使用します。ACFSの構築は下記記事を参照してください。
2. 初期状態
初期状態として ACFS のマウントポイントに aaa.txt と bbb.txt というファイルを配置しておきます。
[grid@ayubaseasm test1]$ pwd
/acfs1/test1
[grid@ayubaseasm test1]$ ls -la
total 92
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:40 .
drwxr-xr-x 5 root root 32768 Feb 28 12:39 ..
-rw-r--r-- 1 grid oinstall 4 Feb 28 12:40 aaa.txt
-rw-r--r-- 1 grid oinstall 7 Feb 28 12:40 bbb.txt
[grid@ayubaseasm test1]$ cat aaa.txt
AYU
[grid@ayubaseasm test1]$ cat bbb.txt
AYUAYU
[grid@ayubaseasm test1]$
3. スナップショット(1回目)の取得
この状態でスナップショット(1回目)を取得します。
acfsutil snap create -r snap1 /acfs1
[grid@ayubaseasm test1]$ acfsutil snap create -r snap1 /acfs1
acfsutil snap create: Snapshot operation is complete.
[grid@ayubaseasm test1]$
上記コマンドで取得した場合、スナップショットを参照するためのディレクトリは <マウントポイントのパス>/.ACFS/snaps配下に作成されます。
※.ACFS は隠しディレクトリで lsコマンド等では見えません。
[grid@ayubaseasm test1]$ ls -la /acfs1/.ACFS/snaps
total 96
drwxr-xr-x 3 root root 32768 Feb 28 12:41 .
drwxr-xr-x 5 root root 32768 Feb 28 12:38 ..
drwxr-xr-x 5 root root 32768 Feb 28 12:41 snap1
[grid@ayubaseasm test1]$
コマンドで指定したスナップショットを参照するためのディレクトリ(snap1)が作成されています。
4. ファイルの新規作成と更新、スナップショットからの参照
次に ccc.txt というファイルを作成して、aaa.txt を更新します。
[grid@ayubaseasm test1]$ pwd
/acfs1/test1
[grid@ayubaseasm test1]$ echo "AYUYUYU" > aaa.txt
[grid@ayubaseasm test1]$ echo "AYU-chan" > ccc.txt
[grid@ayubaseasm test1]$ ls -la
total 96
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:42 .
drwxr-xr-x 5 root root 32768 Feb 28 12:39 ..
-rw-r--r-- 1 grid oinstall 4 Feb 28 12:40 aaa.txt
-rw-r--r-- 1 grid oinstall 7 Feb 28 12:40 bbb.txt
-rw-r--r-- 1 grid oinstall 9 Feb 28 12:42 ccc.txt
[grid@ayubaseasm test1]$ cat aaa.txt
AYUYUYU
[grid@ayubaseasm test1]$ cat bbb.txt
AYUAYU
[grid@ayubaseasm test1]$ cat ccc.txt
AYU-chan
[grid@ayubaseasm test1]$
ここで前述2. で取得したスナップショットを参照してみます。
[grid@ayubaseasm test1]$ cd /acfs1/.ACFS/snaps/snap1
[grid@ayubaseasm snap1]$ ls -la
total 116
drwxr-xr-x 5 root root 32768 Feb 28 12:41 .
drwxr-xr-x 3 root root 32768 Feb 28 12:41 ..
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:40 test1
[grid@ayubaseasm snap1]$ cd test1
[grid@ayubaseasm test1]$ ls -la
total 92
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:40 .
drwxr-xr-x 5 root root 32768 Feb 28 12:41 ..
-rw-r--r-- 1 grid oinstall 4 Feb 28 12:40 aaa.txt
-rw-r--r-- 1 grid oinstall 7 Feb 28 12:40 bbb.txt
[grid@ayubaseasm test1]$ cat aaa.txt
AYU
[grid@ayubaseasm test1]$ cat bbb.txt
AYUAYU
[grid@ayubaseasm test1]$
aaa.txt はスナップショット(1回目)を取得した状態です。
ccc.txt は作成されていないことも確認できます。
5. スナップショットの取得(2回目)
この状態でスナップショット(2回目)を取得します。
acfsutil snap create -r snap2 /acfs1
[grid@ayubaseasm test1]$ acfsutil snap create -r snap2 /acfs1
acfsutil snap create: Snapshot operation is complete.
[grid@ayubaseasm test1]$
スナップショットが取得されているか確認します。
[grid@ayubaseasm test1]$ ls -la /acfs1/.ACFS/snaps
total 128
drwxr-xr-x 4 root root 32768 Feb 28 12:53 .
drwxr-xr-x 5 root root 32768 Feb 28 12:38 ..
drwxr-xr-x 5 root root 32768 Feb 28 12:41 snap1
drwxr-xr-x 5 root root 32768 Feb 28 12:53 snap2
[grid@ayubaseasm test1]$
コマンドで指定したスナップショットを参照するためのディレクトリ(snap2)が作成されています。
6. ファイルの更新と削除、スナップショットからの参照
ccc.txt を削除して aaa.txt を更新します。
[grid@ayubaseasm test1]$ pwd
/acfs1/test
[grid@ayubaseasm test1]$ rm ccc.txt
[grid@ayubaseasm test1]$ echo "Wai ga AYU ya!" > aaa.txt
[grid@ayubaseasm test1]$ ls -la
total 92
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:59 .
drwxr-xr-x 5 root root 32768 Feb 28 12:39 ..
-rw-r--r-- 1 grid oinstall 15 Feb 28 12:59 aaa.txt
-rw-r--r-- 1 grid oinstall 7 Feb 28 12:40 bbb.txt
[grid@ayubaseasm test1]$ cat aaa.txt
Wai ga AYU ya!
[grid@ayubaseasm test1]$ cat bbb.txt
AYUAYU
[grid@ayubaseasm test1]$
ファイルが削除&更新されました。
スナップショット(1回目)から参照してみます。
[grid@ayubaseasm test1]$ cd /acfs1/.ACFS/snaps/snap1/test1
[grid@ayubaseasm test1]$ ls -la
total 92
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:40 .
drwxr-xr-x 5 root root 32768 Feb 28 12:41 ..
-rw-r--r-- 1 grid oinstall 4 Feb 28 12:40 aaa.txt
-rw-r--r-- 1 grid oinstall 7 Feb 28 12:40 bbb.txt
[grid@ayubaseasm test1]$ cat aaa.txt
AYU
[grid@ayubaseasm test1]$ cat bbb.txt
AYUAYU
[grid@ayubaseasm test1]$
スナップショット(1回目)の状態であることが確認できました。
スナップショット(2回目)から参照してみます。
[grid@ayubaseasm test1]$ cd /acfs1/.ACFS/snaps/snap2/test1
[grid@ayubaseasm test1]$ ls -la
total 96
drwxr-xr-x 2 grid oinstall 20480 Feb 28 12:42 .
drwxr-xr-x 5 root root 32768 Feb 28 12:53 ..
-rw-r--r-- 1 grid oinstall 8 Feb 28 12:48 aaa.txt
-rw-r--r-- 1 grid oinstall 7 Feb 28 12:40 bbb.txt
-rw-r--r-- 1 grid oinstall 9 Feb 28 12:42 ccc.txt
[grid@ayubaseasm test1]$ cat aaa.txt
AYUYUYU
[grid@ayubaseasm test1]$ cat bbb.txt
AYUAYU
[grid@ayubaseasm test1]$ cat ccc.txt
AYU-chan
[grid@ayubaseasm test1]$
aaa.txt は更新前の状態で、ccc.txt は削除されていません。
スナップショット(2回目)の状態であることが確認できました。
7. 上記2.~6.の動作を図解してみる。
上記2.~6.の動作を図解してみます。まずは初期状態です。
次にスナップショット(1回目)を取得した状態になります。
スナップショットはファイルの実体への参照(ポインタ)のため、取得は一瞬で終了します。使う領域も少量です。
本記事のコマンドの場合は<マウントポイントのパス>/.ACFS/snaps配下にスナップショットを参照するためのディレクトリ(snap1)が作成されます。
次にスナップショットの取得後にファイルを更新、新規作成した状態です。
更新されたファイル および 新規作成されたファイルは、スナップショットに参照されている領域とは別領域に書き込まれます。(コピーオンライト)
この時、スナップショット(1回目)の領域は更新からは保護されているため、スナップショット(snap1)経由で参照するとスナップショット(1回目)取得時の状態を参照できます。
ファイルシステムのユーザーからは最新の状態が参照されます。
次にスナップショット(2回目)を取得した状態になります。
スナップショットはファイルの実体への参照(ポインタ)のため、取得は一瞬で終了します。使う領域も少量です。
本記事のコマンドの場合は<マウントポイントのパス>/.ACFS/snaps配下にスナップショットを参照するためのディレクトリ(snap2)が作成されます。
最後のファイルを削除&更新した状態です。
スナップショットは過去の更新が累積した状態で参照されます。このケースの場合は、スナップショット(2回目)はスナップショット(1回目)に2回目の差分を反映した状態で参照されます。スナップショット(2回目)取得時の 更新済みaaa.txt', 更新されていないbbb.txt, 新規作成のccc.txt を参照可能です。
スナップショット(1回目)ではスナップショット(1回目)取得時の初期状態の aaa.txt, bbb.txt を参照できます。
ファイルシステムのユーザーからは最新の状態が参照されます。
補足:本セクションの図ではファイル全体を差分として書き込んでいるように表現していますが、ほとんどのファイルシステムやストレージのコピーオンライトには重複排除機能が備わっており、更新があったブロックのみを差分として書き込みます。ポインタもブロックへの参照になります。
下記記事のコピーオンライトの図11が良いので、ご参照ください。
8. まとめ
ACFS でコピーオンライトを体験してみました。ACFSをサンプルにしていますが、世の中のコピーオンライトを標榜するファイルシステムやストレージはおおよそ同様の仕組みで動作している理解です。
皆さんご活用くださいね。
彡(^)(^)
Appendix. 雑感
記事を書いて思いましたが、コピーオンライトを体験してみると言いつつ、スナップショット取得時に内部動作として実体をコピーしててもこれ解りませんね……。
ファイル容量を大きくして、ファイルをコピーした時とスナップショット取得時の時間差を体験できるようにするとシナリオとしては良いかもですやね。
彡(^)(^)




