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

分散ストレージはすごいぞ

 分散ストレージはすごいぞ

分散ストレージCephでレプリカ数が2以上のときにデータが1つおかしくても、もう一つの正しいデータを読んで、おかしいデータも復旧することを示しました。

kernel/vm探検隊北陸part6のLT資料です。
https://kernelvm.connpass.com/event/297033/

Satoru Takeuchi

December 03, 2023
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. 分散ストレージはすごいぞ
    Kernel/VM探検隊@北陸 Part 6
    Dec, 2nd, 2023
    Satoru Takeuchi
    X: satoru_takeuchi

    View full-size slide

  2. あらすじ
    ● 2023年12月2日、人類はdevice mapperを使えばLinux上でディスク障害をエミュ
    レーションできることを知った
    ○ https://speakerdeck.com/sat/ozhang-hai-noemiyuresiyon

    View full-size slide

  3. 実験してみよう!
    ● オープンソースの分散ストレージCephのクラスタを対象とする
    ○ データをレプリケーションできる
    ○ レプリカが2個以上ある状態で1つのレプリカが壊れても、正しいデータから修復できる

    View full-size slide

  4. 実験してみよう!
    ● オープンソースの分散ストレージCephのクラスタを対象とする
    ○ データをレプリケーションできる
    ○ レプリカが2個以上ある状態で1つのレプリカが壊れても、正しいデータから修復できる
    ● 本当だろうか…試してみるまで俺は信用せんぞ

    View full-size slide

  5. Cephのアーキテクチャ
    node node node
    disk
    OSD
    disk
    OSD
    disk
    OSD
    RADOS(独自インタフェースのオブジェクトストレージ )
    ファイルシステム ブロックデバイス
    S3互換
    オブジェクトストレージ

    View full-size slide

  6. 実験に使ったCephクラスタ
    node
    disk
    RADOS
    ファイル ファイル
    loop loop
    dm-dust dm-dust
    OSD OSD

    View full-size slide

  7. 問題: そもそもdm-dustデバイス上にOSDが作られねえ!
    node
    disk
    ファイル ファイル
    loop loop
    dm-dust dm-dust
    OSD OSD

    View full-size slide

  8. 問題: そもそもdm-dustデバイス上にOSDが作られねえ!
    ● Cephはlsblkコマンドによってデバイスのタイプを判断して、特定のタイプ上にのみ
    OSDを作る
    ○ disk, part, lvm, crypt, loop…
    node
    disk
    ファイル ファイル
    loop loop
    dm-dust dm-dust
    OSD OSD
    $ sudo lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
    loop0 7:0 0 6G 0 loop
    └─dust0 253:0 0 6G 0 dm
    loop1 7:1 0 6G 0 loop
    └─dust1 253:1 0 6G 0 dm

    View full-size slide

  9. ソリューション: インチキしよう!
    ● lsblkのソースを読んでtypeフィールドの決め方を知る

    View full-size slide

  10. ソリューション: インチキしよう!
    ● lsblkのソースを読んでtypeフィールドの決め方を知る
    ● dmデバイスなら、デバイスに設定されたUUIDが”foo-bar”なら”foo”を小文字にした
    ものがtypeとみなされる
    ○ もともとはcryptデバイスのUUIDがCRYPT-foobarのようになっているものを想定

    View full-size slide

  11. ソリューション: インチキしよう!
    ● lsblkのソースを読んでtypeフィールドの決め方を知る
    ● dmデバイスなら、デバイスに設定されたUUIDが”foo-bar”なら”foo”を小文字にした
    ものがtypeとみなされる
    ○ もともとはcryptデバイスのUUIDがCRYPT-foobarのようになっているものを想定
    ● sudo dmsetup create -u loop-foo test-dust test-dust.table

    View full-size slide

  12. ソリューション: インチキしよう!
    ● lsblkのソースを読んでtypeフィールドの決め方を知る
    ● dmデバイスなら、デバイスに設定されたUUIDが”foo-bar”なら”foo”を小文字にした
    ものがtypeとみなされる
    ○ もともとはcryptデバイスのUUIDがCRYPT-foobarのようになっているものを想定
    ○ sudo dmsetup create -u loop-foo test-dust test-dust.table

    $ sudo dmsetup create -u loop-foo test-dust
    test-dust.table
    $ sudo lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
    loop0 7:0 0 6G 0 loop
    └─dust0 253:0 0 6G 0 loop
    loop1 7:1 0 6G 0 loop
    └─dust1 253:1 0 6G 0 loop

    View full-size slide

  13. オブジェクトを作成
    $ cat /tmp/test.data
    Hello Ceph world!
    $ rados -p replicapool put test-object test.data

    View full-size slide

  14. GETする場合に読むOSDを得る
    $ ceph pg ls-by-pool replicapool
    PG OBJECTS … UP ACTING …
    1.a 1 … [1,0]p1 [1,0]p1 …
    データはdust0上のOSD1から読む

    View full-size slide

  15. オブジェクトの位置を知る
    ● stringsコマンドを使ってそれっぽいデータがあるセクタを疑似不良セクタとする
    ○ 本当はOSDの中にあるRocksDBを走査してセクタ番号を求めます
    $ sudo strings -t d /dev/mapper/dust1 | grep "Hello Ceph world!"
    4616192 Hello Ceph world!
    ^C
    $ echo $((4616192/512))
    9016

    View full-size slide

  16. 疑似不良セクタを設定
    $ sudo dmsetup message dust1 0 addbadblock 9016 0
    $ sudo dmsetup message dust1 0 enable

    View full-size slide

  17. オブジェクトをGET
    $ rados -p replicapool get test-object /tmp/out.data

    View full-size slide

  18. 中身は正しい!
    $ rados -p replicapool get test-object /tmp/out.data
    $ cat /tmp/out.data
    Hello Ceph world!

    View full-size slide

  19. OSDのログにデータを修復した痕跡が!
    bdev(0x565452c64000 /var/lib/ceph/osd/ceph-1/block) _aio_thread got r=-5 ((5)
    Input/output error)
    7ff464ab4700 -1 bdev(0x565452c64000 /var/lib/ceph/osd/ceph-1/block)
    _aio_thread translating the error to EIO for upper layer
    7ff453291700 -1 log_channel(cluster) log [ERR] : 1.a missing primary copy of
    1:5756f1fd:::test-object:head, will try copies on 0

    View full-size slide

  20. おわり
    ● Cephは信用できるやつ
    ● 俺が悪かった

    View full-size slide