永続ストレージとは、デバイスやアプリケーションを停止したり再起動したりしても利用できるように、不揮発性メモリとしてデータを保持することを指します。データの保存と検索により、ウェブアプリケーションでユーザーの情報や状態を保存し、信頼性の高い運用が可能になります。

モノリシックアプリケーションでは、サーバーとストレージが一体となるため、ストレージへのアクセスは容易です。しかし、地理的に分散したシステムでは、ストレージシステムが世界中のすべてのコンポーネントから利用できる必要があるため、アクセスの構成がより複雑になります。

コンテナは通常、軽量、ステートレス、エフェメラルというデータ保存には適さない特性を持つため、コンテナ化を行うことで先の問題はさらに複雑化します。永続ストレージソリューションがコンテナとシームレスに連携できるようにする作業には、それ相応の手間が伴うということです。

Kinstaのコンテナ型アプリケーションホスティングプラットフォームは、Kubernetesの永続ボリュームを使用して、永続ストレージをアプリケーションの1つまたは複数のプロセスに紐づけています。Kinstaでは、コントロールパネル「MyKinsta」でアプリケーションを作成し、永続ストレージの要件を定義可能です。

この記事では、永続ストレージについて、そして、その種類、アーキテクチャ、用途に迫ります。また、Dockerのボリュームと永続ボリュームの違いを示すハンズオンデモもご紹介します。

永続ストレージの種類

不揮発性ストレージには、従来の回転ディスク(ハードディスクドライブ、HDD)、ソリッドステートドライブ(SSD)、ネットワーク接続型ストレージ(NAS)、ストレージエリアネットワーク(SAN)など、いくつかの種類が存在します。

  • HDD:磁気媒体の回転するディスクを使用してデジタルデータを保存および取得するデータ記憶装置です。可動式アクチュエータが磁気ヘッドやスイングアームを制御します。
  • SSD:半導体ドライブ、ソリッドステートデバイス、ソリッドステートディスクなどと呼ばれることもあります。可動部分がない集積回路を使用してデータを永続的に保存します。フラッシュメモリが使用され、ソリッドステートという性質により、HDDよりも高速で丈夫な選択肢となっています。
  • NAS:NTFS(New Technology File System)やEXT4(fourth extended filesystem)などのファイルシステムを使用してローカルエリアネットワーク(LAN)で接続するタイプの記憶媒体です。HDD、SSD、またはその両方がハードウェアに使用できます。
  • SAN:テープライブラリやディスクアレイのような、ネットワークで接続された高速のブロックレベルストレージデバイスです。その接続は、オペレーティングシステムにはローカルストレージとして表示され、ローカルエリアネットワーク(LAN)を通してアクセスすることはできません。

永続ストレージのアーキテクチャ

永続ストレージには3つのアプローチがあり、それぞれに異なる用途と制限があります。

オブジェクト永続化

オブジェクト永続化では、オブジェクト関係マッピング(ORM)を使用して、データをオブジェクトとしてリレーショナルデータベースまたはキーバリューデータベースに格納します。このアプローチは、ORMがデータの保存と検索を処理するため、データに定義されたスキーマがない場合に有効です。

ブロック永続化

ブロック永続化は、ブロックレベルのストレージデバイスを使用します。大きなファイルを保存する際に有効です。複数のブロックを使用してストレージ容量を増やすことができるため、大量のデータを保存する必要がある場合に有益です。

ファイルストア永続化

ファイルストア永続化では、その名の通り、ファイルシステムを使ってデータを保存します。一つの方法として、データを集中的に保存するデータベースサーバーを使用できます。Kinstaのようなクラウドホスティングソリューションでは、アプリケーションに簡単に接続でき、永続化を可能にするデータベースサーバーが採用されています。

ファイルストア型の永続化は、ファイルを頻繁に取り出す必要があるアプリケーションや、ファイル管理のインターフェースが必要な場合に有用です。

永続ストレージの使用例

続いて、各ストレージタイプの使用例をご紹介します。

オブジェクト永続ストレージ

  • クラウドストレージ:オブジェクト永続ストレージは、画像、動画、文書などの大量の非構造化データを保存・検索するためのクラウドストレージソリューションとしてよく使われます。クラウドサービスプロバイダは、オブジェクトストレージを使用して、拡張性、可用性、耐久性に優れたストレージサービスを提供可能です。
  • ビッグデータ分析:オブジェクト永続ストレージは、ビッグデータの分析、機械学習、AI関連プロジェクトによく使われ、大規模なデータセットの保存と管理に向いています。オブジェクトストレージでは、データに素早くアクセスできるため、ビッグデータアーキテクチャの重要な構成要素となっています。
  • コンテンツデリバリネットワーク:オブジェクトストレージは、コンテンツデリバリネットワーク(CDN)で使用され、画像、動画、静的ファイルなどのコンテンツをサーバーのグローバルネットワークに保存・配信します。オブジェクトストレージを利用することで、CDNは場所に関係なく、世界中のユーザーに円滑にコンテンツを配信することができます。

ブロック永続ストレージ

  • ハイパフォーマンスコンピューティング(HPC):HPC環境では、膨大な量のデータを迅速かつ効率的に処理する必要があります。ブロックストレージでは、科学シミュレーション、気象モデリング、金融分析などの大規模なデータセットをHPCクラスタに保存したり、取得したりできます。ブロックストレージは、データの高度な操作、遅延をほとんど伴わないアクセス、そして、並列入出力(I/O)操作を可能にすることで、処理時間を大幅に改善できるため、HPCで採用されることが多いです。
  • 動画編集:動画編集アプリケーションでは、大容量の動画ファイルを扱うことになり、高い性能と遅延の少なさが求められます。また、動画ファイルをリアルタイムでレンダリング、編集するためには、1秒あたりの大量のI/O処理と低レイテンシを実現する必要があります。ブロックストレージはこれらに対応する機能を備えており、動画編集のワークフローにぴったりのソリューションです。
  • ゲーミング:ゲームアプリケーションでは、ゲームアセットやプレイヤーデータへのアクセスに高いパフォーマンスと低レイテンシが求められます。ブロックストレージは、大量のデータを迅速に保存・取得し、ゲーム環境のロードとゲームプレイ中の応答性を実現する優れた選択肢です。

ファイルストア永続ストレージ

  • メディアとエンターテインメント:動画編集、アニメーション、レンダリングなどのアプリケーションでは、一般的に永続ストレージが使用されます。動画、オーディオ、画像などの大容量メディアファイルを扱う際には、ハイパフォーマンスかつ遅延の徹底的排除が求められます。ファイルストアは、複数のクライアントからアクセス可能な共有ファイルシステムとなるため、このような用途に適うストレージソリューションです。
  • ウェブコンテンツ管理ウェブコンテンツ管理システム(CMS)では、テキスト、画像、マルチメディアファイルなどのウェブサイトコンテンツを保存・管理するのに、共有ファイルシステム内のファイルストア永続ストレージが使用されます。ファイルストアでは、ウェブサイトコンテンツの保存や管理、更新が容易に行えます。また、複数のユーザーが同時に同じコンテンツを扱うことができ、協働や生産性向上につながります。

コンテナと永続ストレージ

コンテナは軽量、ポータブル、セキュア、シンプルな構造で、アプリケーション間の融合を可能にします。コンテナの再起動や削除の際にデータを保持するには、永続化のメカニズムが必要になります。コンテナは従来のアプリケーションのようにファイルストレージやファイルシステムを備えていますが、変更を加えて再構築するたびに、非永続的な(つまり永続化されていない)データはすべて失われます。

このような構造のため、コンテナには必要に応じて、特別にストレージを組み込むか、ストレージボリュームをマウントすることができます。コンテナのストレージボリュームはディレクトリとして扱われ、ボリュームに書き込まれたデータは、ホストファイルシステムに入ります。

コンテナを再起動すると新しいインスタンスが作成され、古いインスタンスは破棄されるため、コンテナ用の永続的なストレージは上記のように動作する必要があります。コンテナでデータの一貫したビューが確保されないと、コンテナの再起動時にデータは消失します。ストレージボリュームは、セッションやコンテナの再起動の枠を超えてデータを保持するため、コンテナが移動したり再起動したりしても、その状態を維持することが可能です。

ボリュームと永続ボリュームの違い

コンテナには、永続的にデータを保存する方法として、ボリュームの使用と永続ボリュームの使用という2つの選択肢があります。両者には大きな違いがあります。コンテナは、ボリュームストレージでデータを管理します。コンテナを停止してもデータは残り、コンテナを再起動すると利用可能になります。しかし、コンテナを削除すると、そこにあるボリュームストレージも削除されるため、データは失われます。

永続ボリュームストレージ(バインドマウント)では、コンテナのファイルシステム外でデータが保存されます。こうすることで、コンテナを削除してもデータが失われることはありません。手動で削除するまで存続します。

次のセクションでは、両方のボリュームタイプを例を使ってご紹介します。

コンテナ永続ストレージのデモ

Dockerコンテナによる永続ストレージを実証するために、簡単なウェブアプリケーションを作成しました。Dockerをインストールし、こちらのGitHubリポジトリからコードを取得することで、流れに沿って進めることができます。

アプリケーションはシンプルなフォームです。2つのフィールドがあります。

  • タイトル
  • ドキュメントテキスト
デモアプリケーションのGUI
デモアプリケーションのGUI(タイトルドキュメントテキストフィールド)

ユーザーによる入力内容を保存したら、Titleフィールドで指定された名前のファイル(feedbackディレクトリ内)を開くことで、その情報にアクセスすることができます。Document Textフィールドからの入力が、ファイルの中身になります。

ボリュームの使用方法

コンピュータにアプリケーションをインストールすると、Dockerfileにあるようにボリュームを利用することができます。

ボリュームの利用を示す画面(Dockerfile)
ボリュームの利用を示す画面(Dockerfile)

そして、イメージをビルドし、コンテナを実行します。これを行うには、以下のコマンドを実行してください。

docker build -t feedback-node:volumes .
docker run -d -p 3000:80 --name feedback-app feedback-node:volumes
ボリュームでアプリケーションを構築する
ボリュームでアプリケーションを構築する
コンテナを実行すると、ボリュームを管理していることがわかる
コンテナを実行すると、ボリュームを管理していることがわかる

アプリケーションを実行したら、localhost:3000に移動してフィードバックを送信してください。

アプリケーションにフィードバックを送信する
アプリケーションにフィードバックを送信する

保存」をクリックし、localhost:3000/feedback/test.txtに移動して、入力内容が保存されたかどうかを確認します。

無事に保存されていることを確認
無事に保存されていることを確認

コンテナを取り外して再起動し、入力された内容が存続するかどうかを確認します。

docker stop feedback-app
docker start feedback-app

そして同じURLにアクセスすると、フィードバックが残っていることがわかります。それでは、コンテナを削除して再起動するとどうなるでしょうか?

docker stop feedback-app
docker rm feedback-app
docker run -d -p 3000:80 --name feedback-app feedback-node:volumes

再起動後、同じURLを開いても(コンテナの削除によりデータが失われたため)フィードバックが確認できません。ボリュームのデータは、コンテナの停止を経ても存続しますが、コンテナを削除したときには保持されません。

Screenshot: Browser reporting failure to open test.txt file.
フィードバックデータが消失してしまった

この問題に対処し、コンテナを削除してもデータが残るようにするには、永続ボリューム(名前付きストレージ)を使用する必要があります。まず、コンテナとイメージをクリーンアップします。

docker stop feedback-app
docker rm feedback-app
docker rmi feedback-node:volumes

永続ボリュームの使用方法

これをテストする前に、DockerfileからVOLUME属性を削除し、イメージを再構築する必要があります。

Dockerfileを更新し、VOLUME属性を削除
Dockerfileを更新し、VOLUME属性を削除
docker build -t feedback-node:volumes .
docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes

ご覧のように、2番目のコマンドでは、-vフラグを使用して、コンテナの外側に永続ボリュームを定義しており、コンテナを削除しても存続します。

前のステップと同様に、フィードバックを追加して、コンテナを停止、削除、再起動したら、アクセスしてみてください。

永続性をテストするために新しいフィードバックを送信する
永続性をテストするために新しいフィードバックを送信する
docker stop feedback-app
docker rm feedback-app
docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes

ご覧のように、停止してコンテナを削除しても、データにはアクセス可能です。

停止してコンテナを削除してもデータは残る
停止してコンテナを削除してもデータは残る

まとめ

永続ストレージは、コンテナのライフサイクルの外側でデータを永続化できるため、コンテナ型アプリケーションに不可欠な選択肢です。コンテナ型アプリケーションの永続ストレージには、主にボリュームと永続ボリューム(バインドマウント)の2種類があり、利点と使用例が異なります。

ボリュームはコンテナのファイルシステム内に保存され、バインドマウントはホストマシンで直接アクセスできます。

永続ストレージにより、コンテナ間でデータを共有することができ、複雑な多層アプリケーションの構築が可能になります。これは、コンテナ型アプリケーションの安定性と継続性を確保するために不可欠であり、重要なデータを保存する信頼性と柔軟性の高い手段になります。

永続ストレージを必要とするアプリケーションを開発中であれば、クイックスタートをご確認ください。GitHub、GitLabやBitbucketなどのGitサービスからKinstaにアプリケーションをデプロイする方法をご紹介しています。また、アプリケーションとそのデータの操作については、永続ストレージについてのドキュメントをご参照ください。

Steve Bonisteel Kinsta

Steve Bonisteel is a Technical Editor at Kinsta who began his writing career as a print journalist, chasing ambulances and fire trucks. He has been covering Internet-related technology since the late 1990s.