以下イベントの発表資料です https://kernelvm.connpass.com/event/209105/
無限ストレージJul. 10th, 2021Satoru Takeuchitwitter: satoru_takeuchi, EnSatoru1
View Slide
ストレージのコストは高い1. ハードウェアコストは高い2. ストレージシステムを組むコストも高い3. 運用コストも高い2
今日のテーマ1. ハードウェアコストは高い2. ストレージシステムを組むコストも高い3. 運用コストも高い3
容量が無限のストレージさえあれば…1. 構築2. 容量を無限に増やす3. バイト単価が実質ゼロに4. うれしい4
実現方法: Cephを使う● CephはOSSの分散ストレージ● 提供するストレージ○ ブロックデバイス(RBD)○ ファイルシステム(CephFS)○ オブジェクトストレージ (RGW)5
Cephのアーキテクチャ6ストレージプールRBD CephFS RGWnode node node nodediskOSDdiskOSDdiskOSDdiskOSDデータはOSD間に均等に分散配置されるデータはOSD間に均等に分散配置されるデータはOSD間に均等に分散配置されるデータは全OSDに均等に分散配置される
RBDに注目!7ストレージプールRBDnode node node nodediskOSDdiskOSDdiskOSDdiskOSD
もしRBDの上にOSDを作れれば…8ストレージプールRBDnode node node nodediskOSDdiskOSDdiskOSDdiskOSDOSD
もしOSD on RBDのみからクラスタを作れれば…9ストレージプールrbdOSDrbdOSDrbdOSDrbdOSD
無限ストレージができるのでは?10ストレージプールrbdOSDrbdOSDrbdOSDrbdOSD超自然的パワー無限のデータやったね!
つくりかた1. 物理ディスク上のOSD(以下OSD on diskと記載)からCephクラスタを作る2. クラスタからRBDを切り出す3. RBD上にOSD(以下OSD on RBDと記載)を作ってクラスタに組み込む4. OSD on diskをクラスタから切り離す11
環境● Ubuntu: 18.04.4● Linuxカーネル: 4.15.0-99● Ceph: v15.2.12● Rook(Cephのオーケストレータ): v1.6.712
初期状態13ストレージプールdiskOSD1node, 1OSD on disk(10GiB)のシンプルな構造# ceph -s...osd: 1 osds: 1 up (since 9m)…usage: 1.0 GiB used, 9.0 GiB / 10 GiB avail
RBDを作る14ストレージプールdiskOSDRBD
次: RBDの上にOSDを作る15ストレージプールdiskOSDRBDOSD
成功16ストレージプールdiskOSDRBDOSD# ceph -s...osd: 2 osds: 2 up
容量も倍になった!17ストレージプールdiskOSDRBDOSD# ceph -s...osd: 2 osds: 2 up...usage: 2.0 GiB used, 18 GiB / 20 GiB avail
次: OSD on diskをクラスタから切り離す18ストレージプールdiskOSDRBDOSD
成功!19ストレージプールdiskOSDRBDOSD# ceph -s...osd: 1 osds: 1 up...usage: 1.0 GiB used, 9.0 GiB / 10 GiB avail
…と思ったら死んだ!20ストレージプールdiskOSDRBDOSDosd: 1 osds:0 up
原因21ストレージプールdiskOSDRBDOSD1. OSD on RBDのメタデータはOSD on diskに保存されている2. OSD on diskを削除するとそこにあったデータはロスト3. OSD on RBDが機能しなくなりDOWN新OSDのメタデータ
対策: データを冗長化させて徐々に移動させる221. 最初にOSD on diskを二つ作る2. OSD on RBDを2つ作る3. OSD on diskを1つ削除。このOSDにあったデータは他の OSDに移動4. OSD on diskをもう1つ削除。その後は同上
初期状態その223ストレージプールdiskOSD● 1node, 2OSD on disk(それぞれ10GiB)# ceph -s...osd: 2 osds: 2 up…usage: 2.0 GiB used,18.0 GiB / 20 GiB availdiskOSD
次: OSD on RBDを2つ作る24ストレージプールdiskOSDdiskOSDRBDOSDRBDOSD
問題発生: データのリバランスが終わらない25ストレージプールdiskOSDRBDOSDRBDOSDdiskOSD● 期待値: OSD on disk上のデータの半分が OSD on RBDに移動● 実際: 全然進まない
原因: 循環I/O26ストレージプールdiskOSDRBDOSDRBDOSDdiskOSD1. OSD on disk上のデータをOSD on RBDに移動2. 移動時のwriteは同期write3. OSD on RBDへの同期write->OSD on diskへの同期write->OSD on RBDへの(ry
解決方法: 同期writeしないようにCephを改造27● open()に付与されたO_SYNC,O_DSYNC,O_DIRECTを削除● sync系システムコールの呼び出しをすべて削除○ sync(), fsync(), fdatasync(), sync_file_range()...
改造したCephを使ってもう一回やってみると…28ストレージプールdiskOSDdiskOSDRBDOSDRBDOSD
やっぱり循環I/O発生!29ストレージプールdiskOSDRBDOSDRBDOSDdiskOSD● 原因不明● カーネルのrbdドライバの変更が必要 ?● ここで時間切れ
(推測) 仮に次のステップに行けたとして…30ストレージプールRBDOSDRBDOSD
(推測) こうなるか?31ストレージプールRBDOSDRBDOSDやったね!無限I/O超自然的パワー
(推測) 無限に書き込むと…32ストレージプールRBDOSDRBDOSDできるよね?無限write
(推測) たぶん死ぬ33ストレージプールRBDOSDRBDOSD君にはがっかりだRBD無限writeカーネルパニック!
(推測) 原因1. OSD on RBDのデータはアタッチされたノードのメモリ上にのみ存在2. メモリが足りないとOOM発動3. プロセスを皆殺しにした後にカーネルパニック4. ノード上のデータはすべて消える34
結論● 超自然的パワーは無かった● 無限ストレージも無かった● ハードウェアコストは高い35
おわり36残念だったな