Save 37% off PRO during our Black Friday Sale! »

無限ストレージ

 無限ストレージ

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

842515eaf8fbb2dfcc75197e7797dc15?s=128

Satoru Takeuchi

July 10, 2021
Tweet

Transcript

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

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

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

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

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

    ◦ オブジェクトストレージ (RGW) 5
  6. Cephのアーキテクチャ 6 ストレージプール RBD CephFS RGW node node node node

    disk OSD disk OSD disk OSD disk OSD データはOSD間に均等に分散配置される データはOSD間に均等に分散配置される データはOSD間に均等に分散配置される データは全OSDに均等に分散配置される
  7. RBDに注目! 7 ストレージプール RBD node node node node disk OSD

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

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

    OSD rbd OSD
  10. 無限ストレージができるのでは? 10 ストレージプール rbd OSD rbd OSD rbd OSD rbd

    OSD 超自然的パワー 無限のデータ やったね!
  11. つくりかた 1. 物理ディスク上のOSD(以下OSD on diskと記載)からCephクラスタを作る 2. クラスタからRBDを切り出す 3. RBD上にOSD(以下OSD on

    RBDと記載)を作ってクラスタに組み込む 4. OSD on diskをクラスタから切り離す 11
  12. 環境 • Ubuntu: 18.04.4 • Linuxカーネル: 4.15.0-99 • Ceph: v15.2.12

    • Rook(Cephのオーケストレータ): v1.6.7 12
  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
  14. RBDを作る 14 ストレージプール disk OSD RBD

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

  16. 成功 16 ストレージプール disk OSD RBD OSD # ceph -s

    ... osd: 2 osds: 2 up
  17. 容量も倍になった! 17 ストレージプール disk OSD RBD OSD # ceph -s

    ... osd: 2 osds: 2 up ... usage: 2.0 GiB used, 18 GiB / 20 GiB avail
  18. 次: OSD on diskをクラスタから切り離す 18 ストレージプール disk OSD RBD OSD

  19. 成功! 19 ストレージプール disk OSD RBD OSD # ceph -s

    ... osd: 1 osds: 1 up ... usage: 1.0 GiB used, 9.0 GiB / 10 GiB avail
  20. …と思ったら死んだ! 20 ストレージプール disk OSD RBD OSD osd: 1 osds:

    0 up
  21. 原因 21 ストレージプール disk OSD RBD OSD 1. OSD on

    RBDのメタデータはOSD on diskに保存されている 2. OSD on diskを削除するとそこにあったデータはロスト 3. OSD on RBDが機能しなくなりDOWN 新OSDのメタデータ
  22. 対策: データを冗長化させて徐々に移動させる 22 1. 最初にOSD on diskを二つ作る 2. OSD on

    RBDを2つ作る 3. OSD on diskを1つ削除。このOSDにあったデータは他の OSDに移動 4. OSD on diskをもう1つ削除。その後は同上
  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
  24. 次: OSD on RBDを2つ作る 24 ストレージプール disk OSD disk OSD

    RBD OSD RBD OSD
  25. 問題発生: データのリバランスが終わらない 25 ストレージプール disk OSD RBD OSD RBD OSD

    disk OSD • 期待値: OSD on disk上のデータの半分が OSD on RBDに移動 • 実際: 全然進まない
  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
  27. 解決方法: 同期writeしないようにCephを改造 27 • open()に付与されたO_SYNC,O_DSYNC,O_DIRECTを削除 • sync系システムコールの呼び出しをすべて削除 ◦ sync(), fsync(),

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

    OSD
  29. やっぱり循環I/O発生! 29 ストレージプール disk OSD RBD OSD RBD OSD disk

    OSD • 原因不明 • カーネルのrbdドライバの変更が必要 ? • ここで時間切れ
  30. (推測) 仮に次のステップに行けたとして… 30 ストレージプール RBD OSD RBD OSD

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

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

  33. (推測) たぶん死ぬ 33 ストレージプール RBD OSD RBD OSD 君にはがっかりだ RBD

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

    4. ノード上のデータはすべて消える 34
  35. 結論 • 超自然的パワーは無かった • 無限ストレージも無かった • ハードウェアコストは高い 35

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