CephとOpenStackは、現在すでにIaaSにおける定番の組み合わせとなっています。 2017年6月〜12月のOpenStackユーザー調査(User Survey)によると、すべてのOpenStackデプロイメントのうち、57%がCinderのバックエンドとしてCeph RBDを使用しています。もちろん、CephをOpenStackのGlanceやCinderのバックエンドとして使用する際には、設定で調整可能なベストプラクティスがいくつか存在します。本記事では、これらの調整方法とその設定を行う理由について紹介します。
目次
Glanceでshow_image_direct_urlを使用する
Ceph RBDを使用する場合、デフォルトでRBD Layering機能が有効になります。これは、読み書き可能なスナップショットのようなものだと考えることができます。これにより、元のイメージのクローンが作成されますが、Cephは元のイメージと異なる部分のRADOSオブジェクトのみを作成します。これは、次の2つのことを意味します。
- 省スペース — 元のイメージから変更された RADOS オブジェクトのみが作成されるため、複数のインスタンスのボリュームがこのイメージに基づいている場合、大幅なスペースの節約になります。
- 変更されていない部分、つまり元のイメージは、最初のボリュームから読み込まれます。これは、どのクローンからであっても、読み取り時には同じ RADOS オブジェクト、つまり同じ OSD が読み取られることを意味します。そのため、これらのオブジェクトは OSD のページキャッシュ、つまり RAM から読み取られる可能性が非常に高くなります。RAM は現在のあらゆる永続ストレージデバイスよりも高速であるため、クローンからデータを提供する方が、完全なコピーボリュームから提供するよりも高速になります。
Cinder 跟 Nova 預設都會利用 RBD Layering 的功能,但是會需要在 Glance 中的 並且使用 Glance v2 API。glance-api.conf 設定 show_image_direct_url=true
更新
由於安全性問題,目前 Ceph community 建議把 show_image_direct_url 設為 false。
コンピュートノードでRBDキャッシュを使用する
librbd,也就是 qemu/kvm 跟 RBD 儲存裝置溝通的 driver,可以利用主機的 RAM 作為 RBD 的 disk cache 使用
このキャッシュの使用は安全です。 Qemu RBD ストレージドライバーがデータの正確なフラッシュを保証します。VM 内のアプリケーションが「このファイルをディスク上に保存したい」と要求すると、Qemu と Ceph は以下の事項を完了した後にのみ、データの書き込み完了を報告します。virtio-blk
- プライマリ OSD への書き込み
- 他の OSD へのレプリケーション
- OSD の永続ジャーナルに配置されたことが通知される
Ceph 自体にも組み込みの安全機構(フェイルセーフ)があり、キャッシュがライトバックモードに設定されていても、Ceph はユーザーから最初のフラッシュリクエストを受け取るまでライトスルーモードで動作します。このメカニズムに対応する設定は rbd cache writethrough until flushで、デフォルトでは trueに設定されています。これを無効にしようとは絶対にしないでください。
Cephのキャッシュを有効にするには、nova-computeのnova.confで設定を行う必要があります。
[libvirt]
...
images_type = rbd
disk_cachemodes="network=writeback"
Cinder、Glance、Novaで異なるプールを使用する
3つの異なるサービスに異なるCephプールを使用させるのには、いくつかの理由があります:
- 異なるプールを使用することで、プールごとに異なる権限設定が可能になります。これは、不幸にも nova-compute ノードが侵害され、侵入者が nova ディスクを破壊または削除できるようになったとしても、同時に Glance イメージまで破壊されるという最悪の事態を防ぐことにつながります。
- 異なるプールを使用することは、サイズや pg_num など、プールごとに異なる設定を行えることも意味します。
- 最も重要なのは、プールに対して異なるCRUSHルールセットを適用できることです。例えば、Cinderには高速なSSD、NovaにはHDD、Glanceにはイレイジャーコーディングプールを使用させるといったことが可能です。
プールを分けることでRBDレイヤリングが機能しなくなることを心配されるかもしれませんが、心配はいりません。これらのクローンはプールをまたいで使用することが可能です。
そのため、OpenStackのデプロイにおいて、Cinder用、Glance用、Nova用として3つの異なるCephプールを用意することは非常に一般的です。
All-Flash OSDプールを使用する
SSDをWALやDBに使用しても、読み取り速度は向上しません。SSDの高速な読み取り速度を活用するには、それらを独立したOSDとし、crush_rulesetを使用してAll-flash OSDプールを設定してください。Luminousバージョン以降、Cephはデバイスクラスを自動的に検出するため、All-flashのCRUSHルールを作成するのは非常に簡単です。
例えば、「flash」という名前のAll-flashプール(障害ドメイン:ホスト)を作成するには、次のコマンドを使用します。 ceph osd crush rule create-replicated <rule-name> <root> <failure-domain-type> <device-class>
ceph osd crush rule create-replicated fast default host ssd
OpenStackとCephのインストール
OpenStackとCephのインストール手順については、以前執筆したこちらの記事を参考にしてください:
- Kolla-Ansible とコンテナによる OpenStack のデプロイ
- Ceph-Ansible を使用した Ceph クラスターのデプロイ
- 外部Cephを使用したKolla-Ansibleのデプロイ
続きを読む パート II
リファレンス
OpenStackにおけるCephの推奨事項と禁止事項(The Dos and Don’ts for Ceph for OpenStack)

