りんけーじ - blog

ℹ️本記事は古いコンテンツを変換して表示しています。

表示が崩れたり、リンクが正しくない可能性があります。ご了承ください。

2016/06/20 15:06 : GlusterFSの構成ディスクを交換する

図らずも一台のデータを壊してしまったので嬉々として復旧実験。ノード自体は生きているが、brickの中身を壊しちゃったという場合の話。

参考にするのはGlusterFSの公式資料。

http://www.gluster.org/community/documentation/index.php/Gluster_3.4:_Brick_Restoration_-_Replace_Crashed_Server

  1. とりあえずglusterfsを止める。現状、FreeBSD版のservice stopだと子プロセスが残るのでkillallしてくださいな。(そのうち直します。あとglusterfsdじゃなくてglusterdが正しいという話もね……。)

# service glusterfsd stop
# killall glusterfsd

  • ディスクを入れ替えたりいろいろする。newfsとかmountまで済ませる。
  • brickのディレクトリを手動で作る。
  • setextattrbinを持ってきてビルドしておく。(→おまけ)
  • brickのディレクトリにvolume-idを設定する。ちょっと長いone-linerだけどこんな感じ。

  • # cat /var/db/glusterd/vols/<ボリューム名>/info |
        perl -ne 'm/volume-id=/ and s/^.*=// and s/-//g and print' |
        setextattrbin user trusted.glusterfs.volume-id -stdin 

  • glusterfsを起動して、healを開始させる。replicatedなら、

  • # service glusterfsd start
    # gluster vol heal <ボリューム名> full

    disperseならNFSでマウントしてから、

    # find <マウント先> -exec stat {}\;

    などで復旧を開始。

    おわり。

    おまけのバイナリ値なxattrの話

    標準のsetextattrだと文字列しか設定できない。一応バイナリ(表示不可文字)も引き数に設定できるものの、万が一"00"が入ったらダメ。たとえば、こんな風に消えてしまう。(これだけだとperlの責任が否定できないけどね)

    # echo -n "110022" | perl -e 'print pack("H*", );' > a
    # hexdump -C a
    00000000  11 00 22                                          |.."|
    00000003
    # perl -e 'print $ARGV[0]' `cat a` | hexdump -C
    00000000  11                                                |.|
    00000001
    

    そんなわけでsetextattrbinを作ったのです。