図らずも一台のデータを壊してしまったので嬉々として復旧実験。
ノード自体は生きているが、brickの中身を壊しちゃったという場合の話。
参考にするのはGlusterFSの公式資料。
- とりあえず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を作ったのです。