Upgrade to Pro — share decks privately, control downloads, hide ads and more …

無限ストレージ

 無限ストレージ

以下イベントの発表資料です
https://kernelvm.connpass.com/event/209105/

Satoru Takeuchi
PRO

July 10, 2021
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. 無限ストレージ
    Jul. 10th, 2021
    Satoru Takeuchi
    twitter: satoru_takeuchi, EnSatoru
    1

    View Slide

  2. ストレージのコストは高い
    1. ハードウェアコストは高い
    2. ストレージシステムを組むコストも高い
    3. 運用コストも高い
    2

    View Slide

  3. 今日のテーマ
    1. ハードウェアコストは高い
    2. ストレージシステムを組むコストも高い
    3. 運用コストも高い
    3

    View Slide

  4. 容量が無限のストレージさえあれば…
    1. 構築
    2. 容量を無限に増やす
    3. バイト単価が実質ゼロに
    4. うれしい
    4

    View Slide

  5. 実現方法: Cephを使う
    ● CephはOSSの分散ストレージ
    ● 提供するストレージ
    ○ ブロックデバイス(RBD)
    ○ ファイルシステム(CephFS)
    ○ オブジェクトストレージ (RGW)
    5

    View Slide

  6. Cephのアーキテクチャ
    6
    ストレージプール
    RBD CephFS RGW
    node node node node
    disk
    OSD
    disk
    OSD
    disk
    OSD
    disk
    OSD
    データはOSD間に均等に分散配置される
    データはOSD間に均等に分散配置される
    データはOSD間に均等に分散配置される
    データは全OSDに均等に分散配置される

    View Slide

  7. RBDに注目!
    7
    ストレージプール
    RBD
    node node node node
    disk
    OSD
    disk
    OSD
    disk
    OSD
    disk
    OSD

    View Slide

  8. もしRBDの上にOSDを作れれば…
    8
    ストレージプール
    RBD
    node node node node
    disk
    OSD
    disk
    OSD
    disk
    OSD
    disk
    OSD
    OSD

    View Slide

  9. もしOSD on RBDのみからクラスタを作れれば…
    9
    ストレージプール
    rbd
    OSD
    rbd
    OSD
    rbd
    OSD
    rbd
    OSD

    View Slide

  10. 無限ストレージができるのでは?
    10
    ストレージプール
    rbd
    OSD
    rbd
    OSD
    rbd
    OSD
    rbd
    OSD
    超自然的パワー
    無限のデータ
    やったね!

    View Slide

  11. つくりかた
    1. 物理ディスク上のOSD(以下OSD on diskと記載)からCephクラスタを作る
    2. クラスタからRBDを切り出す
    3. RBD上にOSD(以下OSD on RBDと記載)を作ってクラスタに組み込む
    4. OSD on diskをクラスタから切り離す
    11

    View Slide

  12. 環境
    ● Ubuntu: 18.04.4
    ● Linuxカーネル: 4.15.0-99
    ● Ceph: v15.2.12
    ● Rook(Cephのオーケストレータ): v1.6.7
    12

    View Slide

  13. 初期状態
    13
    ストレージプール
    disk
    OSD
    1node, 1OSD on disk(10GiB)のシンプルな構造
    # ceph -s
    ...
    osd: 1 osds: 1 up (since 9m)
    …usage: 1.0 GiB used, 9.0 GiB / 10 GiB avail

    View Slide

  14. RBDを作る
    14
    ストレージプール
    disk
    OSD
    RBD

    View Slide

  15. 次: RBDの上にOSDを作る
    15
    ストレージプール
    disk
    OSD
    RBD
    OSD

    View Slide

  16. 成功
    16
    ストレージプール
    disk
    OSD
    RBD
    OSD
    # ceph -s
    ...
    osd: 2 osds: 2 up

    View Slide

  17. 容量も倍になった!
    17
    ストレージプール
    disk
    OSD
    RBD
    OSD
    # ceph -s
    ...
    osd: 2 osds: 2 up
    ...
    usage: 2.0 GiB used, 18 GiB / 20 GiB avail

    View Slide

  18. 次: OSD on diskをクラスタから切り離す
    18
    ストレージプール
    disk
    OSD
    RBD
    OSD

    View Slide

  19. 成功!
    19
    ストレージプール
    disk
    OSD
    RBD
    OSD
    # ceph -s
    ...
    osd: 1 osds: 1 up
    ...
    usage: 1.0 GiB used, 9.0 GiB / 10 GiB avail

    View Slide

  20. …と思ったら死んだ!
    20
    ストレージプール
    disk
    OSD
    RBD
    OSD
    osd: 1 osds:
    0 up

    View Slide

  21. 原因
    21
    ストレージプール
    disk
    OSD
    RBD
    OSD
    1. OSD on RBDのメタデータはOSD on diskに保存されている
    2. OSD on diskを削除するとそこにあったデータはロスト
    3. OSD on RBDが機能しなくなりDOWN
    新OSDのメタデータ

    View Slide

  22. 対策: データを冗長化させて徐々に移動させる
    22
    1. 最初にOSD on diskを二つ作る
    2. OSD on RBDを2つ作る
    3. OSD on diskを1つ削除。このOSDにあったデータは他の OSDに移動
    4. OSD on diskをもう1つ削除。その後は同上

    View Slide

  23. 初期状態その2
    23
    ストレージプール
    disk
    OSD
    ● 1node, 2OSD on disk(それぞれ10GiB)
    # ceph -s
    ...
    osd: 2 osds: 2 up

    usage: 2.0 GiB used,18.0 GiB / 20 GiB avail
    disk
    OSD

    View Slide

  24. 次: OSD on RBDを2つ作る
    24
    ストレージプール
    disk
    OSD
    disk
    OSD
    RBD
    OSD
    RBD
    OSD

    View Slide

  25. 問題発生: データのリバランスが終わらない
    25
    ストレージプール
    disk
    OSD
    RBD
    OSD
    RBD
    OSD
    disk
    OSD
    ● 期待値: OSD on disk上のデータの半分が OSD on RBDに移動
    ● 実際: 全然進まない

    View Slide

  26. 原因: 循環I/O
    26
    ストレージプール
    disk
    OSD
    RBD
    OSD
    RBD
    OSD
    disk
    OSD
    1. OSD on disk上のデータをOSD on RBDに移動
    2. 移動時のwriteは同期write
    3. OSD on RBDへの同期write->OSD on diskへの同期write->OSD on RBDへの(ry

    View Slide

  27. 解決方法: 同期writeしないようにCephを改造
    27
    ● open()に付与されたO_SYNC,O_DSYNC,O_DIRECTを削除
    ● sync系システムコールの呼び出しをすべて削除
    ○ sync(), fsync(), fdatasync(), sync_file_range()...

    View Slide

  28. 改造したCephを使ってもう一回やってみると…
    28
    ストレージプール
    disk
    OSD
    disk
    OSD
    RBD
    OSD
    RBD
    OSD

    View Slide

  29. やっぱり循環I/O発生!
    29
    ストレージプール
    disk
    OSD
    RBD
    OSD
    RBD
    OSD
    disk
    OSD
    ● 原因不明
    ● カーネルのrbdドライバの変更が必要 ?
    ● ここで時間切れ

    View Slide

  30. (推測) 仮に次のステップに行けたとして…
    30
    ストレージプール
    RBD
    OSD
    RBD
    OSD

    View Slide

  31. (推測) こうなるか?
    31
    ストレージプール
    RBD
    OSD
    RBD
    OSD
    やったね!
    無限I/O
    超自然的パワー

    View Slide

  32. (推測) 無限に書き込むと…
    32
    ストレージプール
    RBD
    OSD
    RBD
    OSD
    できるよね?
    無限write

    View Slide

  33. (推測) たぶん死ぬ
    33
    ストレージプール
    RBD
    OSD
    RBD
    OSD
    君にはがっかりだ
    RBD
    無限write
    カーネルパニック!

    View Slide

  34. (推測) 原因
    1. OSD on RBDのデータはアタッチされたノードのメモリ上にのみ存在
    2. メモリが足りないとOOM発動
    3. プロセスを皆殺しにした後にカーネルパニック
    4. ノード上のデータはすべて消える
    34

    View Slide

  35. 結論
    ● 超自然的パワーは無かった
    ● 無限ストレージも無かった
    ● ハードウェアコストは高い
    35

    View Slide

  36. おわり
    36
    残念だったな

    View Slide