2.6. Ceph の入出力操作
Ceph クライアントは、Ceph モニターからクラスターマップを取得し、プールにバインドして、プールの配置グループ内にあるオブジェクトに対して入力/出力 (I/O) を実行します。プールの CRUSH ルールセットと配置グループの数は、Ceph がデータを配置する方法を決定する主要な要因です。クラスターマップの最新バージョンでは、クライアントは、クラスター内のすべてのモニターおよび OSD、およびそれらの現在の状態を認識します。ただし、クライアントはオブジェクトの場所について何も知りません。
クライアントが必要とする入力は、オブジェクト ID とプール名のみです。これは単純な方法です。Ceph はデータを名前付きプールに保管します。クライアントがプールに名前付きのオブジェクトを保存する場合は、オブジェクト名、ハッシュコード、プール名の PG 数およびプール名を入力として取り、次に CRUSH (Controlled Replication Under Scalable Hashing) は配置グループの ID および配置グループのプライマリー OSD を計算します。
Ceph クライアントは、以下の手順を使用して PG ID を計算します。
-
クライアントはプール ID とオブジェクト ID を入力します。たとえば、
pool = liverpool
およびobject-id = john
です。 - CRUSH はオブジェクト ID を取得し、それをハッシュします。
-
CRUSH は PG 数のハッシュモジュロを計算し、PG ID を取得します。たとえば
58
です。 - CRUSH は PG ID に対応するプライマリー OSD を計算します。
-
クライアントはプール名が指定されたプール ID を取得します。たとえば、プール
liverpool
はプール番号4
です。 -
クライアントはプール ID を PG ID の前に追加します。たとえば
4.58
です。 - クライアントは、動作セットのプライマリー OSD と直接通信することにより、書き込み、読み取り、削除などのオブジェクト操作を実行します。
Ceph Storage クラスターのトポロジーおよび状態は、セッション時に比較的安定しています。librados
を介して Ceph クライアントにオブジェクトの場所を計算する権限を付与することは、クライアントが読み取り/書き込み操作ごとにチャットセッションを介してストレージクラスターにクエリーを実行することを要求するよりもはるかに高速です。CRUSH アルゴリズムにより、クライアントはオブジェクトが 保存される 場所を計算でき、クライアントが動作セットのプライマリー OSD に直接アクセスできる ようにし、オブジェクト内のデータを保存または取得できるようにします。エクサバイト規模のクラスターには数千もの OSD があるため、クライアントと Ceph OSD 間のネットワークオーバーサブスクリプションは重大な問題ではありません。クラスターの状態が変更された場合は、クライアントは単に Ceph モニターからクラスターマップへ更新をリクエストすることができます。