TECHSTEP

ITインフラ関連の記事を公開してます。

Ceph概要まとめ

はじめに

昨年、Kubernetes上でCloud Native Storageを実現するRookについて調査しました。Rookは複数のストレージソフトウェアを統合しますが、最もよく使われるものがCephです。Rookについて調査・検証をするうちに、そもそもCephの動きを理解していない中でRookの理解を進めることが難しいと感じていたので、Cephについて調査しました。Cephは10年以上前に登場したストレージシステムのため、様々な書籍や記事でその機能や裏側の動きが紹介されています。今回はそれらの記事や論文、公式ドキュメントを眺めたうえでまとめ、自身のCephへの理解を深める第一歩として公開しました。誤った理解や記載がある場合は、ご連絡いただければ幸いです。

Cephとは

  • オープンソースな統合的ストレージシステム
    • オブジェクトストレージ・ブロックストレージ・ファイルストレージを提供
  • 高信頼性・拡張性・高パフォーマンスを実現する

ceph-architecture

Ceph公式ドキュメントより抜粋

Cephの登場する背景(論文より抜粋)

※論文では分散ファイルシステムであることを強調しているため、それに関連した導入となっている

  • 大規模アプリケーションのパフォーマンスを向上するうえで、ファイルシステムのパフォーマンスは重要である
  • パフォーマンスと拡張性を向上するため、分散ストレージシステムが有効であると考えられた
    • 現在幅広く使われるNFSのようなサーバー/クライアントモデルによる「中央集権化」は、拡張性に問題を抱えている
  • OSD(Object Storage Device)の登場により、クライアントはより多くのデータの読み書きが可能になった
    • ブロックストレージベースからオブジェクトストレージベースへの変更
    • クライアントはメタデータをMDS(Metadata Server)と、データをOSDと直接やり取りすることで、パフォーマンスを向上することができる
  • OSDの利用にもかかわらず依然残った問題として「メタデータの分散」がある
  • 上記問題を解消するため、Cephが考案された

Cephコンポーネント

クラスタ

□RADOS

  • Reliable Autonomic Distributed Object Store
  • Cephのストレージクラスターの名称
    • Reliable: 分散データの複製を作成(レプリケーション
    • Autonomic: コンポーネント間で独立して相互監視
    • Distributed Object Store: 保存対象のデータを複数のオブジェクトデータにストライピングし、分散データとして保存

□CRUSH

  • Controlled Replication Under Scalable Hashing
  • RADOSで利用される機能、分散したオブジェクトデータをどのストレージに配置するかを決定する
    • 単一障害点、パフォーマンスボトルネック、物理的制約からの拡張性上限などを避けることができる
  • ハッシュ関数を利用した計算により、分散データの配置を決定
  • ストレージデバイスの階層情報、レプリカの複製ルールを設定する必要がある

□CRUSHマップ

  • CRUSHアルゴリズムで利用される、ストレージデバイスマッピング情報
  • OSDリスト、Bucketリスト、ルールリストを含む
    • Bucket: 物理的なストレージデバイスの階層構造
    • ルール: レプリカの作成ポリシー、CRUSHルール
  • 物理的な階層構造を反映し、隣接するデバイス間でレプリカを作成しないよう設定できる
    • 異なるfailure domain間でレプリカを作成するよう配置する

□RADOSの各コンポーネント

f:id:FY0323:20200127133852p:plain
RADOS構成例

1. OSD

  • Object Storage Device daemon
  • ストレージデバイスと1対1で対応、ファイルのI/Oを行うデーモン
    • 動作しているマシンの指定のサブディレクトリ以下、または指定のブロックデバイスにファイルを格納

f:id:FY0323:20200127154537p:plain
オブジェクト構成

Ceph公式ドキュメントより抜粋

  • それぞれの動作状態を相互監視
    • 障害発生時はCRUSHマップの書き換えでレプリカを再配置
    • 一定時間生存確認できない場合、OSD→MONに通知、CRUSHマップから該当のOSDを削除
  • write-ahead journalingの採用
    • 実際の書き込み前にログに書き込む
    • メタデータ+実データをjournalディスクに書き込む
    • journalが溜まってからオブジェクトファイルに反映

2. MON

3. MDS

  • Metadata Server daemon
  • ファイルシステムメタデータディレクトリ、ファイル権限、アクセスモードなど)の保存・操作を行う
  • ファイルストレージでのみ利用
  • MDSがメタデータを担当し、クライアントはデータをOSDと直接やり取りすることでパフォーマンスを向上
  • 複数のMDSを作成することで可用性・拡張性を提供
    • 高可用性: 余分なMDSをstandby状態にし、activeなMDSが処理に失敗した際に対応。メタデータジャーナリングも含めてRADOSに保存されており、MDSの切り替えはMONによって動的に行われる
    • 拡張性: 複数のMDSをactiveにし、ディレクトリツリーをサブツリーに分割して負荷を分散する

f:id:FY0323:20200127131143p:plain
Ceph MDS Subtree

Ceph論文(PDF)より抜粋

4. Placement Group

  • OSDのリスト
  • 後述のPoolが作成されるたびに設定される
  • 分散データのオブジェクトはまずPG単位で分散し、PGに含まれるOSDにレプリカを作成する
  • すべてのOSDに対して均等にオブジェクトが分散配置されるとは限らない(理由は後述)

f:id:FY0323:20200127134731p:plain
オブジェクト分散配置例

5. Pool

  • 以下の要素を含む論理的なグルーピング
  • 指定したPoolのSnapshotを取得できる

■クライアント

□CephFS

f:id:FY0323:20200202140056p:plain
CephFS

Ceph公式ドキュメントより抜粋

□RBD

f:id:FY0323:20200127104923p:plain
RBD

Ceph公式ドキュメントより抜粋

□RADOS GW

  • アプリケーション向けにCephストレージクラスターを提供する、オブジェクトストレージデーモン
  • S3/Swiftと互換性あり

f:id:FY0323:20200127103545p:plain
RADOS GW

Ceph公式ドキュメントより抜粋

Cephが分散ストレージを実現する流れ

■データのストライピング

  • ファイルを受け取ると複数のオブジェクトにストライピングし、RADOSに保存
    • 複数オブジェクトからの並列読み込みが可能になる
  • ストライピングの方法として最も近いのはRAID-0
  • クライアント側がストライピングを行う
    • 3つの変数(オブジェクトサイズ、ストライプ幅、ストライプ数)

f:id:FY0323:20200127110245p:plain
データのストライピング

■データの分散配置

  • CRUSHアルゴリズムに基づき配置する
  • ストライピングしたオブジェクトをPGに割り当てる

f:id:FY0323:20200127110448p:plain
データの分散配置

■データの複製

  • レプリカは同一PG内のOSD間で作成される
  • 複製方式はprimary-copy replication方式
    • レプリカ間に優先順位があり、データ書き込みをprimary OSD, コピーをsecondary以降のOSDに行う
    • クライアントがオブジェクトを読む時はプライマリーレプリカから読む

f:id:FY0323:20200127131417p:plain
データの複製

f:id:FY0323:20200127135551p:plain
primary-copy replication方式

Ceph公式ドキュメントより抜粋

■データの呼び出し

  • RADOSがオブジェクトの検索をする場合、CRUSHアルゴリズムを使ってPG番号からOSDリストを計算する

その他

■RADOSのデータ指定方法

  • オブジェクトリソース名のハッシュ値をPGの決定に利用
    • オブジェクトがRADOSに格納される際にオブジェクト名をハッシュ関数にかけ、得られたハッシュ値をオブジェクトIDとする
    • オブジェクトIDをPG数で割り、剰余をとる。剰余値がPGの番号となり、そのPGのOSDリストがオブジェクトの配置位置になる
  • pool名+オブジェクト名でデータを指定

■CRUSHアルゴリズム追記

  • Bucket:入り口を1つ、出口を複数(item)持つ構造、itemによって別のbucketOSDにつなげる
    • itemの追加・削除のたびにオブジェクトの再配置が必要、それに伴いオブジェクトの移動が必要となる
    • 複数のbucketタイプがあり、straw bucketが現行では最も優れている

f:id:FY0323:20200127141636p:plain
Bucket

  • straw bucket: 各itemのハッシュ値を計算し、最も値の大きいitemをPGに割り当てる
    • PG番号・item番号・レプリカ数を用いた3引数のハッシュ関数で計算する
    • 新しいitem(OSD)が追加されると、新規itemに関するハッシュ値を計算する。計算の結果をもとに、最も値の大きいitemをPGに割り当てる。最大値のitemが変化したものは、オブジェクトの再配置を行う。
      • 既存のitemのハッシュ値は変化せず、オブジェクトの移動を最小限にできる
    • 欠点:bucket内の全てのitemに対してハッシュ値を計算する必要がある
      • 単一のstraw bucketに大量のitemがある状態では計算コストが増加する

f:id:FY0323:20200127150026p:plain
straw bucket

  • OSDの容量は考慮しない。
    • 考慮するにはbucket定義内のitemの重みづけを設定する

■CRUSHで利用するハッシュ関数

■PGを利用する理由

  • 分散ストレージではクラスターにストレージデバイスが追加された際にデータの再配置が発生し、場合によっては大規模なデータ移動が発生する
  • 再配置時に大量のOSDが存在すると、組み合わせを決定するのが大変
  • 複数のOSD間で格納するオブジェクトが分散されればよいので、あらかじめ分散対象のOSDを絞っておく

参考ドキュメント

Ceph Document

Ceph: A Scalable, High-Performance Distributed File System (PDF)

CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data (PDF)

RADOS: A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters (PDF)

SlideShare - 分散ストレージソフトウェアCeph・アーキテクチャー概要

SlideShare - 分散ストレージ技術Cephの最新情報

SlideShare - Ceph アーキテクチャ概説

NAKAMURA Minoru's Home Page - Ceph の覚え書きのインデックス

panda's tech note - ハッシュテーブル

Wikipedia - Jenkins hash function

SlideShare - Consistent hash

超ウィザード級ハッカーのたのしみ - Ceph, 特にCRUSHアルゴリズムについて

@IT - Ceph/RADOS入門(4):Cephがスケールできる理由、単一障害点を排除する仕組み、負荷を減らす実装

Qiita - 今度こそ絶対あなたに理解させるPaxos

SlideShare - 普通の人でもわかる Paxos