この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
IPFSでのガベージコレクションは、不要になったと思われるデータを削除することにより、IPFSノードのディスク領域を解放します。 ストレージは有限であるため、新しいリソース用のスペースを確保するためにこれが行われます。
しかし、全てのデータがガベージコレクションの対象になる訳ではありません。 IPFSではピンニングされていないデータが対象になるため、必要なデータはピンニングして保護するようにしないといけませんね。
では実際にガベージコレクションの挙動を試していきます。
やってみる
IPFSは手動で行うガベージコレクションと自動で定期的に行うガベージコレクションがありますので、両方とも試してみましょう。
手動でガベージコレクション
ipfs repo gc
コマンドを実行すると手動でガベージコレクションを実施することができます。
$ ipfs repo gc
removed bafkreihshanjznywfxaxc664xcmsnzwqydntrgsxmbnqqjqeeqxecos2w4
removed bafkreigbyivpq6rzmva4hl6n65ztg6u5u3zo2zpmgzaceqxlqtnpi77dq4
removed bafkreiblqtq4qdsdqt2ph7xsap5cp2myiuqftt7xd5crljlgj2prwlkqsa
removed bafkreib6ofpfz3wpht3fnitq5tnkrmcxwkqzqfso75djgcjutauzsfsvce
~~~~
対象のデータがないと
$ ipfs repo gc
のように何も表示はされません。
ipfs add
で追加したファイルは自動的にピンニングされるため、ガベージコレクションの対象とはなりません。
$ ipfs add sample-15s.mp4
added QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F sample-15s.mp4
$ ipfs pin ls QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F
QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F recursive
$ ipfs repo gc
// 実施されなかった
他のノードからダウンロードしてきたデータは自動でピンニングされないので、対象となるはず。。。
bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
というCIDのデータを取得してみます。
画像が格納されているフォルダです。
$ ipfs get bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
Saving file(s) to bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
$ ipfs refs bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
bafkreifvallbyfxnedeseuvkkswt5u3hbdb2fexcygbyjqy5a5rzmhrzei
この状態で手動ガベージコレクションを実施してみると、
$ ipfs repo gc
removed bafkreicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
removed bafkreifvallbyfxnedeseuvkkswt5u3hbdb2fexcygbyjqy5a5rzmhrzei
$ ipfs ls bafkreicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
// 何も表示されない
getしたcidとそれに紐づくcidがキャッシュから削除されました。
自動でガベージコレクション
自動で行うには、IPFSデーモン起動時に--enable-gc
コマンドフラグを使用します。
$ ipfs daemon --enable-gc
IPFSのガベージコレクター設定
ガベージコレクターの設定ですが、go-ipfsの構成ファイル内に記述されています。
ガベージコレクション関連としては、
- StorageMax
- ipfsリポジトリのデータストアのサイズのソフト的な上限値で、デフォルトは10GB
- StorageGCWatermark と共に、ガベージコレクションの実行をトリガーするかどうかを計算するために使用
- StorageGCWatermark
- ガベージコレクションが自動的にトリガーされるStorageMax値のパーセンテージで、デフォルトは90%
- GCPeriod
- ガベージコレクションを実行する頻度で、デフォルトは1h
です。
この設定は、--enable-gc
で有効にしたときのみ反映される設定となっており、ipfs repo gc
を使った手動実行では上記の設定を無視します。
※) 例
ソフトリミットを20MBで、90%以上使用していたら実行する。間隔は1h。
$ vi ~/.ipfs/config
{
"Identity": {
"PeerID": "12D3KooWRLy8e5YJhga8K8V3vpx2ggw5PJ5UZxzxaEffvGn64cp1",
"PrivKey": "CAESQOaeePUAVCOa8ACQLKgt6zGd4d7nIFwg+8tD0XrVAGfY5rZDA1TeLpql9Y3DIegbnRHSB+KhiKUvNM5hNxDzza7o="
},
"Datastore": {
"StorageMax": "20MB",
"StorageGCWatermark": 90,
"GCPeriod": "1h",
"Spec": {
"mounts": [
{
~~~~~
~~~~~
}
以下のレポジトリの状態で確認してみましょう。
$ ipfs repo stat
NumObjects: 126
RepoSize: 29092541
StorageMax: 20000000
RepoPath: /Users/mori.ryosuke/.ipfs
Version: fs-repo@12
RepoSizeがStorageMax
で指定した20MBと、StorageGCWatermark
で指定した90%からガベージコレクションの対象となっているので、
自動的に実施されるはずです.
IPFSでのガベージコレクションを試してみました。
実際に運用していく際には、優先度の高いリソースのためにストレージのリソースをあける必要が出てくるかと思われます。