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

Rook/Ceph on ZFS

Rook/Ceph on ZFS

Japan Rook Meetup #4 でお話した内容です。

Takuya TAKAHASHI

October 02, 2020
Tweet

More Decks by Takuya TAKAHASHI

Other Decks in Programming

Transcript

  1. Rook/Ceph on ZFS
    Japan Rook Meetup #4
    @takutaka1220
    Takuya Takahashi

    View full-size slide

  2. アジェンダ
    - 自己紹介
    - 環境構築
    - 計測
    - 考察

    View full-size slide

  3. 自己紹介します

    View full-size slide

  4. 自己紹介
    - 高橋 拓也
    - GMO ペパボという会社でインフラエンジニアをしています
    - ストレージは趣味です
    - https://github.com/takutakahashi
    - https://twitter.com/takutaka1220
    - https://www.takutakahashi.dev

    View full-size slide

  5. 突然ですが

    View full-size slide

  6. ZFS はいいぞ

    View full-size slide

  7. ZFS (Zettabyte File System) とは?
    - CoW な多機能ファイルシステム
    - Block Device をまとめて Storage Pool を構成
    - RAID (シングルパリティの RAIDZ, ダブルパリティの RAIDZ2 など)
    - SnapShot, Clone
    - Export
    - 圧縮
    - 重複排除
    - Storage Pool から filesystem や Block Device (zvol) の切り出しができる
    - Solaris が源流、FreeBSD が主流、Linux にもあり (ZFS on Linux)
    - 最近 Ubuntu でデフォルトで利用できるようになった
    - macOS や Windows でも使えるらしい (OpenZFS)

    View full-size slide

  8. とある自鯖ユーザーの悩み

    View full-size slide

  9. おうち k8s を作ったぞ!
    Master * 3 + Node * 3 で冗長構成だ!

    View full-size slide

  10. Node をまたがった
    Persistent Volume が欲しいぞ

    View full-size slide

  11. Rook/Cephというものがあるらしい

    View full-size slide

  12. たくさんの Block Device を
    ひとつにまとめるらしいぞ

    View full-size slide

  13. ZFS なら
    無限に Block Device を生やせるぞ

    View full-size slide

  14. ZFS に乗せてみよう!

    View full-size slide

  15. 検証環境スペック
    - Node 1
    - Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
    - 32GB Memory (single channel)
    - SanDisk SSD Ultra 3D 1TB * 2
    - Node 2
    - Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz
    - 16GB Memory
    - SanDisk SSD Ultra 3D 1TB * 2
    - Node 3
    - 今回は使わない

    View full-size slide

  16. 検証環境スペック
    - Cluster
    - k3s Master * 3 (rpi) + Node * 3
    - version: v1.18.6+k3s1
    - Rook
    - version: v1.3.7
    - Ceph
    - version: v15.2.4

    View full-size slide

  17. 環境構築

    View full-size slide

  18. SSD1
    zvol
    ZFS でできたなにか
    OSD OSD
    OSD
    Ceph Cluster
    /dev/rbd0

    View full-size slide

  19. 環境構築
    - OSD のストレージプロビジョニング
    - Block Device? Directory?
    - Block Device を割り当てる方式が推奨らしい
    - zvol を使おう!

    View full-size slide

  20. SSD1
    zvol
    OSD
    zvol
    OSD
    zvol
    OSD
    Ceph Cluster
    /dev/rbd0
    zfs pool

    View full-size slide

  21. 環境構築
    - Block Storage を利用する
    - zvol をどうやってプロビジョニングする?
    - → pvc による dynamic provisioning を設定する
    - local provisioning してくれる provisioner が必要
    - openebs/zfs-localpv が便利

    View full-size slide

  22. 環境構築
    - openebs/zfs-localpv が便利
    - https://github.com/openebs/zfs-localpv
    - zfs pool から fs, zvol を dynamic provisioning してくれるやつ
    - local provision なので、ノードを跨いでマウントできる pvc は作成できない
    - openEBS
    - https://openebs.io/
    - rook 競合な Cloud Native SDS

    View full-size slide

  23. 環境構築
    zfs-localpv のデプロイは一発
    kubectl apply -f https://raw.githubusercontent.com/openebs/zfs-localpv/master/deploy/zfs-operator.yaml

    View full-size slide

  24. SSD1
    zvol
    pvc
    OSD
    zvol
    pvc
    OSD
    zvol
    pvc
    OSD
    Ceph Cluster
    /dev/rbd0
    zfs pool
    これを目指す

    View full-size slide

  25. SSD1
    zfs pool
    今はまだ、これ

    View full-size slide

  26. localpv StorageClass をつくる

    View full-size slide

  27. StorageClass

    View full-size slide

  28. ‘zfs’ だと filesystem
    ‘ext(2-4)|xfs|btrfs’ だと block device(zvol) になる
    block device でしか OSD on pvc は動作しない
    allowedTopologies を指定して
    pool のない node に
    スケジュールされないようにする

    View full-size slide

  29. 環境構築
    - Pool の空き容量は考慮してくれない
    - とにかく zvol 作りに行くし、作れなかったとしても zvol が作れたと嘘を付く
    - ハマった
    - デフォルトでは snapshot を持つ vol は削除できない
    - snapshot を自動生成するようにしていたら削除できずに容量使い果たした

    View full-size slide

  30. SSD1
    zvol
    pvc
    zvol
    pvc
    zvol
    pvc
    zfs pool
    pvc ができた

    View full-size slide

  31. 環境構築
    - cephcluster.yaml を書く
    - node が少ないので、以下の設定が必要となる
    - mon が同一ノードに起動することを許可する
    - osd を同一ノードに建てるために topologySpreadConstraints.maxSkew を増やす

    View full-size slide

  32. node が足りないので
    複数 node に立つことを
    許可する

    View full-size slide

  33. maxSkew: いくつまで
    障害ドメインの差を許容するか
    1node なのでたくさん設定する
    OSD を pvc に載せる設定

    View full-size slide

  34. SSD1
    zvol
    pvc
    OSD
    zvol
    pvc
    OSD
    zvol
    pvc
    OSD
    Ceph Cluster
    zfs pool
    クラスタができた

    View full-size slide

  35. クラスタができた

    View full-size slide

  36. 計測だ!

    View full-size slide

  37. 計測方法
    ● 以下の条件で fio を 10回測定し、中央値を計測
    ○ rw=read/write
    ○ size=1g
    ○ numjobs=1
    ● bandwidth, iops を抽出し記録
    ● pool の replicated size は 2とする

    View full-size slide

  38. 計測方法
    ● 以下の条件で fio を 10回測定し、中央値を計測
    ○ rw=read/write
    ○ size=1g
    ○ numjobs=1
    ● bandwidth, iops を抽出し記録
    ● pool の replicated size は 2とする
    「妥当な計測」がなんなのか手探りで計測したので
    これは違うぞ!という内容があったら twitter でメンションください

    View full-size slide

  39. まずは raw device と ZFS の実力

    View full-size slide

  40. まずは raw device と ZFS の実力
    1. raw device を ext4 でフォーマットした vol
    2. zfs プールから切り出した zvol
    a. single device
    b. 2 devices (striped)

    View full-size slide

  41. basic benchmark
    read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k

    View full-size slide

  42. basic benchmark
    read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    zfs にするだけで性能アップ

    View full-size slide

  43. ZFS はキャッシュが命
    ● ARC というインメモリキャッシュを持つ
    ● ARC のキャッシュヒット率が高くなると速い
    ● ZFS に載せるだけで速くなったのはそのため
    ● fio の read benchmark はめちゃめちゃキャッシュに乗る...

    View full-size slide

  44. ベンチ中の iostat の様子を
    見てみる

    View full-size slide

  45. 1 device read
    iostat の結果

    View full-size slide

  46. zd0 … zvol
    raw … raw device (sda とか)

    View full-size slide

  47. x軸は時系列

    View full-size slide

  48. raw は zd0 より書き込み開始が遅い
    (fio は tmpfile を書いてから計測する )

    View full-size slide

  49. zd0 で read が走るが、
    raw は IO が発生しない
    (すべてキャッシュから読んでいる )

    View full-size slide

  50. キャッシュヒット率を見たい?

    View full-size slide

  51. arcstat
    - ZFS のキャッシュの状況を確認できるスゴイヤツ
    - キャッシュミスの割合や、キャッシュサイズなどを確認できる
    - zfsonlinux に同梱されている
    - https://packages.ubuntu.com/ja/xenial-updates/amd64/zfsutils-linux/filelist

    View full-size slide

  52. 1 device read
    arcstat の結果

    View full-size slide

  53. 秒間 arc アクセス

    View full-size slide

  54. read のうち
    ミスしたアクセス

    View full-size slide

  55. キャッシュミス率

    View full-size slide

  56. arc の容量

    View full-size slide

  57. arc target size
    キャッシュに
    載せようとしているサイズ

    View full-size slide

  58. read IO が発生したのはここ

    View full-size slide

  59. キャッシュミスした
    アクセスはない

    View full-size slide

  60. striped pool の
    read iostat

    View full-size slide

  61. zvol, raw に書いて
    キャッシュから読む
    挙動は同じ

    View full-size slide

  62. raw1, 2 の IO は
    全く同じ量出ている
    (グラフが重なっている )

    View full-size slide

  63. シングルノード性能
    いよいよ Ceph

    View full-size slide

  64. シングルノード性能
    - OSD を全て node 1 に寄せて計測
    - 1 device pool, 2 devices pool でそれぞれ計測
    - 3台の OSD を起動させた

    View full-size slide

  65. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk 1504MiB/s 385k 2221MiB/s 569k
    1node-2disk 1517MiB/s 388k 2265MiB/s 580k
    シングルノード性能

    View full-size slide

  66. read の iostat
    (1 device)

    View full-size slide

  67. zvol に直接書くより
    書き込みが遅い
    (約半分)

    View full-size slide

  68. 1 device read
    iostat の結果

    View full-size slide

  69. osd へのアクセスは
    ひとつだけ少ない

    View full-size slide

  70. キャッシュの状態を
    arcstat で見る

    View full-size slide

  71. ここが read のスパイク

    View full-size slide

  72. 全てキャッシュから読んでいる
    (miss がゼロ)

    View full-size slide

  73. write の iostat
    (1 device)

    View full-size slide

  74. rbd0 よりも
    raw device のほうが
    転送量が多い

    View full-size slide

  75. zvol へのアクセスは
    ひとつだけ突出している
    read とは逆

    View full-size slide

  76. シングルノード性能
    - OSD を3 → 6 に増やすとどうなる?

    View full-size slide

  77. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk (3osd) 1504MiB/s 385k 2221MiB/s 569k
    1node-1disk (6osd) 1333MiB/s 341k 2124MiB/s 544k
    1node-2disk (3osd) 1517MiB/s 388k 2265MiB/s 580k
    1node-2disk (6osd) 1499MiB/s 384k 2111MiB/s 541k
    シングルノード性能

    View full-size slide

  78. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk (3osd) 1504MiB/s 385k 2221MiB/s 569k
    1node-1disk (6osd) 1333MiB/s 341k 2124MiB/s 544k
    1node-2disk (3osd) 1517MiB/s 388k 2265MiB/s 580k
    1node-2disk (6osd) 1499MiB/s 384k 2111MiB/s 541k
    シングルノード性能
    1disk, 2disk どちらにおいても若干の性能劣化が見られる

    View full-size slide

  79. read の iostat
    (1 device)

    View full-size slide

  80. osd の分散が大きくなった

    View full-size slide

  81. write にコブができている
    IO 待ちしている?

    View full-size slide

  82. マルチノード性能

    View full-size slide

  83. マルチノード性能
    - 2disk striped なノードを2つ利用して計測
    - ノード間は 1GbE で接続

    View full-size slide

  84. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk (3osd) 1504MiB/s 385k 2221MiB/s 569k
    1node-1disk (6osd) 1333MiB/s 341k 2124MiB/s 544k
    1node-2disk (3osd) 1517MiB/s 388k 2265MiB/s 580k
    1node-2disk (6osd) 1499MiB/s 384k 2111MiB/s 541k
    2node-2disk (3osd)
    計測ノードに 1osd 180MiB/s 46.1k 2188MiB/s 560k
    2node-2disk (5osd)
    計測ノードに 2osd 155MiB/s 39.6k 2231MiB/s 571k
    マルチノード性能

    View full-size slide

  85. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk (3osd) 1504MiB/s 385k 2221MiB/s 569k
    1node-1disk (6osd) 1333MiB/s 341k 2124MiB/s 544k
    1node-2disk (3osd) 1517MiB/s 388k 2265MiB/s 580k
    1node-2disk (6osd) 1499MiB/s 384k 2111MiB/s 541k
    2node-2disk (3osd)
    計測ノードに 2osd 180MiB/s 46.1k 2188MiB/s 560k
    2node-2disk (5osd)
    計測ノードに 2osd 155MiB/s 39.6k 2231MiB/s 571k
    マルチノード性能
    OSD が増えると
    性能が劣化する

    View full-size slide

  86. read の iostat
    (1 device)

    View full-size slide

  87. rbd0 よりも
    zd0, zd1 のほうが
    IO が出ている

    View full-size slide

  88. zd0 + zd1 < rbd0 なので
    キャッシュはある程度
    効いている

    View full-size slide

  89. 1node の read と
    スケールを合わせてみた

    View full-size slide

  90. write は誤差の範囲

    View full-size slide

  91. read は倍くらい違う

    View full-size slide

  92. OSD が増えると
    性能が劣化している

    View full-size slide

  93. OSD を極端に増やしてみる

    View full-size slide

  94. OSD を極端に増やしてみる
    - 1node 2disk な cluster に大量の OSD を設置する
    - なるべく object が乗る osd が分散するように tmpfile のサイズを 10g にした
    - 30, 50 osd で計測

    View full-size slide

  95. 一部の OSD が
    CrashLoopBackOff

    View full-size slide

  96. とりあえず増やしたら動いた

    View full-size slide

  97. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk (3osd) 1504MiB/s 385k 2221MiB/s 569k
    1node-1disk (6osd) 1333MiB/s 341k 2124MiB/s 544k
    1node-2disk (3osd) 1517MiB/s 388k 2265MiB/s 580k
    1node-2disk (6osd) 1499MiB/s 384k 2111MiB/s 541k
    1node-2disk (30osd) 181MiB/s 46.4k 207MiB/s 52.9k
    1node-2disk (50osd) 158MiB/s 40.4k 144MiB/s 36.9k
    OSD を極端に増やしてみる

    View full-size slide

  98. osd 30 read の iostat
    osd を抜粋しました

    View full-size slide

  99. 書き込みと IO 待ちを
    繰り返している

    View full-size slide

  100. OSD ごとの性能差が
    大きくなった

    View full-size slide

  101. rbd0 に常に write io が
    発生している

    View full-size slide

  102. トップラインが伸びた

    View full-size slide

  103. arcstat の結果

    View full-size slide

  104. read io はこのへん
    ひとけた増えている

    View full-size slide

  105. ほぼキャッシュヒット
    (miss がほぼない)

    View full-size slide

  106. read (bw) read (iops) write (bw) write (iops)
    raw device 415MiB/s 106k 2498MiB/s 639k
    zfs (single device) 1058MiB/s 271k 2498MiB/s 639k
    zfs (2 devices) 1100MiB/s 282k 2485MiB/s 636k
    1node-1disk (3osd) 1504MiB/s 385k 2221MiB/s 569k
    1node-1disk (6osd) 1333MiB/s 341k 2124MiB/s 544k
    1node-2disk (3osd) 1517MiB/s 388k 2265MiB/s 580k
    1node-2disk (6osd) 1499MiB/s 384k 2111MiB/s 541k
    1node-2disk (30osd) 181MiB/s 46.4k 207MiB/s 52.9k
    1node-2disk (50osd) 158MiB/s 40.4k 144MiB/s 36.9k
    ベンチマークの結果は悪い...

    View full-size slide

  107. このトップラインは
    すべてキャッシュ
    30 OSD と
    50 OSD の read グラフを
    重ねてみる

    View full-size slide

  108. このトップラインは
    すべてキャッシュ
    write io の
    帯域はだいたい同じ

    View full-size slide

  109. このトップラインは
    すべてキャッシュ
    IO 待ちが
    長くなっている

    View full-size slide

  110. このトップラインは
    すべてキャッシュ
    トップラインが
    非常に低速

    View full-size slide

  111. 50 OSD の arcstat

    View full-size slide

  112. 書き込み時は
    arc に乗っている

    View full-size slide

  113. read 開始前に
    キャッシュが
    破棄されている

    View full-size slide

  114. キャッシュミス率が
    40% を超えている

    View full-size slide

  115. 考察
    ● Read IO は伸びる
    ○ 特にキャッシュを効かせると非常に伸びる
    ○ zfs の特性を Rook/Ceph でも活かすことができる
    ■ 一度ファイルを置いたら read しかしないワークロード
    ■ メモリが余っていればだけど ...
    ● Write IO は変化なし
    ○ オーバーヘッド分少なくなる
    ○ 1 Pool あたりの OSD の数が増えるとオーバーヘッドが大きくなる

    View full-size slide

  116. 考察
    ● Rook/Ceph on ZFS 構築の難易度
    ○ めちゃめちゃ簡単
    ○ Multiple Devices 界で一番簡単なのでは?
    ○ ご家庭に余った k8s クラスタとディスクがあればぜひお試しを

    View full-size slide

  117. 考察
    ● 障害ドメイン
    ○ Storage Pool が障害ドメイン
    ■ OSD 分割しても Pool が死んだら全て死ぬ
    ■ ceph on zfs による障害リスクの上昇はない
    ● (うまく OSD 分散できれば)
    ● Pool の件があるからドメイン分割には少し気を使う必要がある

    View full-size slide

  118. 考察
    - zfs はいいぞ
    ○ ド安定
    ○ わかりやすい CLI
    ○ 機能が豊富
    ■ ストレージプールの大きさを動的に増やしたり
    ■ ライトホール問題のない RAID 組めたり
    ■ pool ごとバックアップ取ったり
    ● (OSD のバックアップいるか? )

    View full-size slide

  119. ZFS はいいぞ

    View full-size slide