第3章 Object Storage
OpenStack Object Storage (openstack-swift) は、コンテナー内にオブジェクト (データ) を格納します。コンテナーとは、ファイルシステムにおけるディレクトリーと似ています。ただし、入れ子にはできません。コンテナーは、あらゆるタイプの非構造化データを格納する簡単な方法をユーザーに提供します。たとえば、オブジェクトには写真、テキストファイル、イメージなどが含まれます。格納されるオブジェクトは圧縮されません。
3.1. Object Storage サービスの管理 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順では、Object Storage サービスをニーズに合わせてさらにカスタマイズする方法について説明します。
3.1.1. Erasure Coding の設定 リンクのコピーリンクがクリップボードにコピーされました!
Erasure coding (EC) は、データの断片化、拡張、冗長データによる暗号化、別の場所やストレージメディアセットでの保存の際にデータを保護する方法です。EC は、従来のレプリケーションより小さいストレージボリュームを使用して、必要とされる耐久性を取得します。レプリケーションファクターが 3 のものと比較すると、注意深くデプロイメントを行うことで、50% の節約が実現できます。ただし、ワークロードによっては、Erasure Coding がパフォーマンスに悪影響を与える可能性があります。
Erasure Coding は、Object Storage Service 向けにストレージポリシーとしてサポートされます。ストレージポリシーにより複数のオブジェクトリングを作成することでさまざまな目的のクラスターをセグメント化できます。Red Hat は、Erasure Coding およびレプリケーションストレージポリシーで使用するデバイスを分割することを推奨します。これにより、クラスターの動きをより簡単に分析することができます。
選択する方向性は、Erasure Coding ポリシーのデプロイの理由により異なります。主な検討事項は以下のとおりです。
- 既存のインフラストラクチャーのレイアウト
- 専用の Erasure Coding ノード (または Erasure Coding デバイス)の追加コスト
- 目的とする使用モデル
3.1.1.1. Erasure Coding ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Erasure Coding を使用するには、最初に /etc/swift/swift.conf で EC の追加のポリシーを定義します。以下の「Erasure Coding ポリシーの例」では、一般的な例を紹介しています。
Erasure Coding ポリシーの例
Object Storage ポリシーヘッダー (例: [storage-policy:1]) にはインデックスの番号が含まれます。今回の場合は 1 です。Object Storage のインデックス数は 0 から開始するので、上記の「Erasure Coding ポリシーの例」では、ポリシーインデックスが 0 の別のポリシーがすでに存在することを想定しています。以下に例を示します。
[storage-policy:0] name = default default = yes
[storage-policy:0]
name = default
default = yes
Erasure Coding ポリシーの定義後に、関連のオブジェクトストレージリングを作成、設定する必要があります。説明は「オブジェクトストレージリングの設定」を参照してください。
以下の表では、「Erasure Coding ポリシーの例」で使用する各種パラメーターについて説明しています。
| 用語 | 説明 |
|---|---|
|
default |
このポリシーがデフォルトのものかどうかを設定します (yes/no)。これは、/etc/swift/swift.conf に複数のポリシーが定義されている場合に使用します。 |
|
name |
標準のストレージポリシーのパラメーター |
|
alias |
ポリシーの別名をコンマ区切りにしたリスト |
|
policy_type |
この値を erasure_coding に設定して、Erasure Coding ポリシーであることを指定します。 |
|
ec_type |
使用予定の Erasure Coding スキームを指定します。サポートされる値の一覧については表3.2「サポートされる Erasure Coding スキーム」を参照してください。 |
|
ec_num_data_fragments |
データを構成するフラグメントの合計数 |
|
ec_num_parity_fragments |
パリティーを構成するフラグメントの合計数 |
|
ec_object_segment_size |
セグメントをエンコーダー/デコーダーにフィードする前に増やすデータのバッファー量。デフォルト値は 1048576 です。 |
| スキーム | 説明/参照 |
|---|---|
|
liberasurecode_rs_vand |
Vandermonde Reed-Solomon エンコーディング。liberasurecode により実装されるソフトウェアのみのバックエンド |
|
jerasure_rs_vand |
Jerasure をベースにする Vandermonde Reed-Solomon エンコーディング |
|
jerasure_rs_cauchy |
Jerasure をベースにする Cauchy Reed-Solomon エンコーディング (Jerasure の派生) |
|
flat_xor_hd_3, flat_xor_hd_4 |
Flat-XOR ベースの HD 組み合わせコード (liberasurecode) |
|
isa_l_rs_vand |
Intel Storage Acceleration Library (ISA-L): SIMD accelerated Erasure Coding バックエンド |
Object Storage サービスがオブジェクトを暗号化する際には、N 個のフラグメントに分割します。設定時に、フラグメントのうち何個がデータで、何個がパリティーであるかを知っておくことが重要です。Erasure Coding ポリシーの例では、PyECLib はオブジェクトを 14 個のフラグメントに分割して、そのうち、実際のオブジェクトデータは 10 個で、パリティーデータは 4 個 (計算は ec_type に左右される) です。このような設定では、システムは、ディスクの障害は 4 回分までであればデータの損失なしで済みます。その他に一般的に使用される設定は 4+2 (データフラグメント 4 個とパリティーフラグメント 2 個) または 8+3 (データフラグメント 8 個とパリティーフラグメント 3 個) です。
この手順では、director を使用せずにサービスを設定する必要があります。そのため、オーバークラウドを再デプロイまたは更新する際には、同じ手順を繰り返す必要がある場合があります。
ポリシーをデプロイして、そのポリシーでオブジェクトを作成した後にはこれらの設定オプションの変更はできません。設定の変更が望ましい場合には、新規ポリシーを作成して、データを新しいコンテナーに移行します。ただし、定義が済むと、ポリシーのインデックスは破棄できません。ポリシーを終了する場合には、ポリシーを無効にすることはできますが、削除はできません。基本的に、以前のポリシーが残っていてもパフォーマンスへの影響はありませんが、若干、管理の負担が出てきます。
3.1.1.2. オブジェクトストレージリングの設定 リンクのコピーリンクがクリップボードにコピーされました!
オブジェクトストレージは、リング と呼ばれるデータ構造を使用して、パーティション領域をクラスターに分散します。このパーティション領域は、Object Storage サービスのデータ永続性エンジン (data durability engine) の中核となります。これにより、Object Storage サービスが迅速かつ簡単にクラスター内の各パーティションを同期できるようになります。Swift のコンポーネントがデータと対話する必要がある場合には、ローカルでリング内を素早く検索して、各レプリカに使用可能なパーティションを見つけます。
Object Storage サービスにはすでに 3 つのリングがあり、各種データが格納されています。リングは、アカウント情報に 1 つ、(アカウント内のオブジェクトを整理するのに役立つ) コンテナーに 1 つ、オブジェクトのレプリカに 1 つあります。Erasure Code をサポートするために、Erasure Code のチャンクを格納するために作成された追加のリングがあります。
たとえば、典型的なレプリケーションリングを作成するには、以下のコマンドを使用します。
swift-ring-builder object-1.builder create 10 3 1
# swift-ring-builder object-1.builder create 10 3 1
3 は、レプリカの数です。
以下のように、Erasure Coding のオブジェクトリングを作成するには、レプリカの数の部分にフラグメントの数を指定する必要があります。
swift-ring-builder object-1.builder create 10 14 1
# swift-ring-builder object-1.builder create 10 14 1
14 は、データフラグメント 10 とパリティーフラグメント 4 (10+4) を合わせた設定です。
Erasure Coding ポリシーのオブジェクトリングで使用するデバイスを決定する際には、パフォーマンスの影響を考慮します。デプロイメントの前の設定に対して、テスト環境でパフォーマンスのベンチマーキングを実行することを推奨します。/etc/swift/swift.conf で Erasure Coding のポリシーを設定してオブジェクトリングを作成した後には、指定のポリシー名でコンテナーを作成して通常通りに対話することで、アプリケーションでの Erasure Coding の使用準備が整います。
3.1.1.3. Erasure Coding の使用 リンクのコピーリンクがクリップボードにコピーされました!
新規の Erasure Coding ポリシーを定義して、そのオブジェクトストレージリングを設定した後には、初めて新しいコンテナーを作成する際に EC ポリシーを使用することができます。複数のポリシーを定義した場合には、デフォルトのストレージポリシーが割り当てられたコンテナーが作成されます。
新しいコンテナーでデフォルト以外のストレージポリシーを使用するには、コンテナーの作成時に特別なメタデータヘッダー送信する必要があります。たとえば、新規コンテナー (CONTAINERNAME) で「Erasure Coding ポリシーの設定」に定義した「Erasure Coding ポリシーの例」で提示したポリシーを使用するには、以下のコマンドを実行します。
swift post -H "X-Storage-Policy:ec104" CONTAINERNAME
# swift post -H "X-Storage-Policy:ec104" CONTAINERNAME
3.1.2. Fast-POST の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Object Storage サービスは、メタデータの一部でも変更があると必ず、オブジェクト全体をコピーします。fast-post 機能を使用することでこれを回避できます。これは、複数の大型オブジェクトのコンテンツタイプを変更する際に時間を節約する際に役立ちます。
Fast-Post 機能を有効化するには、Object Storage プロキシーサービスの object_post_as_copy オプションを無効にします。これには、以下を実行します。
- Object Storage プロキシーサービスをホストするノードにログインします。
-
/etc/swift/proxy-server.confを開きます。 以下のように、
[app:proxy-server]のセクションで、object_post_as_copyをfalseに設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノードで Object Storage プロキシーサービスを再起動します。
systemctl restart openstack-swift-proxy.service systemctl restart openstack-swift-object-expirer.service
# systemctl restart openstack-swift-proxy.service # systemctl restart openstack-swift-object-expirer.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow policy-0以外のストレージポリシーが/etc/swift/swift.confに記載されている場合には、以下も実行してください。systemctl restart openstack-swift-container-reconciler.service
# systemctl restart openstack-swift-container-reconciler.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
この手順では、director を使用せずにサービスを設定する必要があります。そのため、オーバークラウドを再デプロイまたは更新する際には、同じ手順を繰り返す必要がある場合があります。
一般的なオーバークラウドのデプロイメントでは、Object Storage サービスはコントローラーノードにインストールされています。
3.1.3. Image サービスのバックエンドとしてのオブジェクトストレージの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、OpenStack の Image サービスは、イメージおよびインスタンスのスナップショットを /var/lib/glance/images/ のローカルのファイルシステムに保存します。または、(可能な場合には) Image サービスが Object Storage サービスにイメージとスナップショットを保存するように設定することも可能です。
この設定には、以下の手順を実行します。
root として Image サービスを実行中のノード (Identity も実行するコントローラーノード) にログインし、OpenStack の認証情報 (これは通常
openrcという名前のファイル) を読み込みます。source ~/openrc
# source ~/openrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow Image サービスが
adminロールを持つservicesテナントの一部であることを確認します。openstack user role list --project services glance
# openstack user role list --project services glanceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 返されたロールの 1 つは、
adminでなければなりません。/etc/glance/glance.confファイルを開き、以下の行をコメントアウトします。##### DEFAULT OPTIONS ##### #default_store = file #filesystem_store_datadir = /var/lib/glance/images/
##### DEFAULT OPTIONS ##### #default_store = file #filesystem_store_datadir = /var/lib/glance/images/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 同じファイル内で
DEFAULT OPTIONSのセクションに以下の行を追加します。default_store = swift swift_store_auth_address = http://KEYSTONEIP:35357/v2.0/ swift_store_user = service:glance swift_store_key = ADMINPW swift_store_create_container_on_put = True
default_store = swift swift_store_auth_address = http://KEYSTONEIP:35357/v2.0/ swift_store_user = service:glance swift_store_key = ADMINPW swift_store_create_container_on_put = TrueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の設定で、
-
KEYSTONEIPは、Identity サービスの IP アドレスに置き換えてください。 -
ADMINPWは、/etc/glance/glance-api.confファイルの管理者パスワードの値に置き換えてください。
-
Image サービスを再起動して変更を適用します。
systemctl restart openstack-glance-api systemctl restart openstack-glance-registry
# systemctl restart openstack-glance-api # systemctl restart openstack-glance-registryCopy to Clipboard Copied! Toggle word wrap Toggle overflow
この時点から、(Dashboard または glance 経由) Image サービスにアップロードされたイメージは glance という名前の Object Storage コンテナーに保存されるはずです。このコンテナーは、サービスアカウントに存在します。
新規作成イメージが Image サービスに保存されたことを確認するには、以下のコマンドを実行します。
ls /var/lib/glance/images
# ls /var/lib/glance/images
Dashboard または glance image-list により、イメージがアクティブな状態であることが報告されたら、以下のコマンドを実行してイメージがオブジェクトストレージにあるかどうかを確認できます。
swift --os-auth-url http://KEYSTONEIP:5000/v2.0 --os-tenant-name service --os-username glance --os-password ADMINPW list glance
# swift --os-auth-url http://KEYSTONEIP:5000/v2.0 --os-tenant-name service --os-username glance --os-password ADMINPW list glance
この手順では、director を使用せずにサービスを設定する必要があります。そのため、オーバークラウドを再デプロイまたは更新する際には、同じ手順を繰り返す必要がある場合があります。
3.1.4. 保存データの暗号化の有効化 リンクのコピーリンクがクリップボードにコピーされました!
保存データの暗号化は、Red Hat OpenStack Platform 11 にはテクノロジープレビューとして実装されています。テクノロジープレビューとして提供されている機能のサポートスコープに関する詳しい情報は、https://access.redhat.com/ja/support/offerings/techpreview を参照してください。
デフォルトでは、Object Storage にアップロードされるオブジェクトは暗号化されずに保管されます。このため、ファイルシステムからオブジェクトに直接アクセスすることが可能です。このため、ディスクを破棄する前に適切に消去しなかった場合には、セキュリティーリスクとなってしまいます。
暗号化している場合でも、別の方法を使用してプロキシーのルートディスクを破棄することが重要となります。これは、ルートディスクとストレージノードディスクの両方にアクセスすることによって、攻撃者がデータの暗号化を解除することが可能となる場合があるためです。
オーバークラウドで、以下の変更を行う必要があります。
Swift オブジェクトストアの暗号化を有効化するには、以下のステップを実行します。
/etc/swift/proxy-server.confで、以下の行を追記して、encryption_root_secretの値は、使用する暗号化キーに置き換えます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロキシーサービスを再起動して、変更を有効にします。
systemctl restart openstack-swift-proxy.service
# systemctl restart openstack-swift-proxy.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
オブジェクトが暗号化されたことを確認するには、次のステップを実行します。
テストする新規オブジェクトを追加します。
swift upload container1 testobj
# swift upload container1 testobjCopy to Clipboard Copied! Toggle word wrap Toggle overflow catコマンドで、データが暗号化されたことを確認します。以下に例を示します。cat /srv/node/sdb/objects/603/424/35c4ea21cc96663792465462570b2424/1477399821.58002.data
# cat /srv/node/sdb/objects/603/424/35c4ea21cc96663792465462570b2424/1477399821.58002.dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow
暗号化キーを変更してから、以前にアップロードしたファイルのダウンロードを試みるとエラーが発生して、データ損失につながる可能性があります。
3.2. 基本的なコンテナー管理 リンクのコピーリンクがクリップボードにコピーされました!
擬似フォルダーは、オブジェクトを格納することができる論理デバイスで、入れ子が可能となっているので、整理がしやすくなります。たとえば、画像を保管する Images フォルダーや、ビデオを保管する Media フォルダーなどを作成することができます。
各プロジェクトに 1 つまたは複数のコンテナーを作成することができます。また、各コンテナーには、1 つまたは複数の擬似フォルダーを作成することができます。
3.2.1. コンテナーの作成 リンクのコピーリンクがクリップボードにコピーされました!
- Dashboard で プロジェクト > オブジェクトストア > コンテナー を選択します。
- コンテナーの作成 をクリックします。
コンテナー名 を指定して、コンテナーアクセス フィールドで以下のいずれかのオプションを選択します。
Expand タイプ 説明 プライベート現在のプロジェクトでユーザーに対してアクセスを制限します。
パブリックパブリックの URL を使用して API アクセスを全員に許可します。ただし、Dashboard では、プロジェクトユーザーには、他のプロジェクトのパブリックコンテナーおよびデータは表示されません。
- コンテナーの作成 をクリックします。
新しいコンテナーはデフォルトのストレージポリシーを使用します。複数のストレージポリシーが定義されている場合には (たとえば、デフォルトのポリシーと、Erasure Coding を有効にするポリシーなど)、コマンドラインからデフォルト以外のストレージポリシーを使用するようにコンテナーを設定することができます。これには以下を実行してください。
swift post -H "X-Storage-Policy:POLICY" CONTAINERNAME
# swift post -H "X-Storage-Policy:POLICY" CONTAINERNAME
上記の設定で、
- POLICY は、コンテナーで使用するポリシーの名前またはエイリアスに置き換えます。Erasure Coding を使用するサンプルのポリシーについては、「Erasure Coding ポリシーの設定」を参照してください。
- CONTAINERNAME は、コンテナーの名前に置き換えてください。
3.2.2. コンテナー用の擬似フォルダーの作成 リンクのコピーリンクがクリップボードにコピーされました!
- Dashboard で プロジェクト > オブジェクトストア > コンテナー を選択します。
- 擬似フォルダーを追加するコンテナーの名前をクリックします。
- 疑似フォルダーの作成 をクリックします。
- 疑似フォルダー名 フィールドに名前を指定し、作成 をクリックします。
3.2.3. コンテナーの削除 リンクのコピーリンクがクリップボードにコピーされました!
- Dashboard で プロジェクト > オブジェクトストア > コンテナー を選択します。
- コンテナー のセクションの一覧を参照して全オブジェクトが削除済みであることを確認します (「オブジェクトの削除」を参照)。
- 対象のコンテナーの矢印メニューで コンテナーの削除 を選択します。
- コンテナーの削除 をクリックして、コンテナーを削除する操作を確定します。
3.2.4. オブジェクトのアップロード リンクのコピーリンクがクリップボードにコピーされました!
実際のファイルをアップロードしない場合でも、オブジェクトは (プレースホルダーとして) 作成され、後でファイルをアップロードする際に使用することができます。
- Dashboard で プロジェクト > オブジェクトストア > コンテナー を選択します。
- アップロードしたオブジェクトの配置先となるコンテナーの名前をクリックします。そのコンテナーに擬似フォルダーがすでに存在している場合には、擬似フォルダーの名前をクリックすることもできます。
- ファイルをブラウズしてオブジェクトのアップロード をクリックします。
オブジェクト名 フィールドに名前を指定します。
- 擬似フォルダーはスラッシュ (/) の記号を使用して指定することができます (例: Images/myImage.jpg)。指定したフォルダーがまだ存在していない場合には、オブジェクトのアップロード時に作成されます。
- その場所 (オブジェクトがすでに存在している場所) に一意ではない名前は、そのオブジェクトの以前のコンテンツを上書きします。
- オブジェクトのアップロード をクリックします。
3.2.5. オブジェクトのコピー リンクのコピーリンクがクリップボードにコピーされました!
- Dashboard で プロジェクト > オブジェクトストア > コンテナー を選択します。
- オブジェクトのコンテナーまたはフォルダーの名前をクリックします (オブジェクトを表示します)。
- オブジェクトのアップロード をクリックします。
- コピーするファイルを参照し、矢印メニューで コピー を選択します。
以下の項目を設定します。
Expand フィールド 説明 宛先コンテナー
新規プロジェクトの宛先コンテナー
パス
宛先コンテナーの擬似フォルダー。フォルダーが存在しない場合は、作成されます。
宛先オブジェクト名
新規オブジェクト名。その場所に一意ではない名前を使用した場合 (そのオブジェクトがすでに存在している場合) には、そのオブジェクトの以前のコンテンツが上書きされます。
- オブジェクトのコピー をクリックします。
3.2.6. オブジェクトの削除 リンクのコピーリンクがクリップボードにコピーされました!
- Dashboard で プロジェクト > オブジェクトストア > コンテナー を選択します。
- 一覧を参照して対象のオブジェクトを特定し、矢印メニューで オブジェクトの削除 を選択します。
- オブジェクトの削除 をクリックして、オブジェクトを削除する操作を確定します。