ふう…。やっぱエンジニアには集中力を保つために精神と時の部屋みたいなものが必要だと思う。冷暖房完備で酒と美味いもんとふっかふかの布団も完備されているとなお良い。場所は沖縄とかがいいな。
Riakのバックアップとリストア試した。例によってマニュアルの意訳+実際の試した結果を記す。LevelDBについては試してはいない。やろうと思ったらメシの時間になっちゃって集中力が削がれた…(すまんね)。Bitcaskはちゃんと試してウマくいくことは確認した。少しハマったかな。率直にいうと、Bitcaskのオンラインバックアップ/リストアは可能。



雑多な感じになりそうなので目次をば。。。マニュアルどおりに実施するとちょっと期待動作と異なる箇所もあったので、今回は最後の「まとめ」に最終的な手順をまとめる。

  1. バックアップ手順(マニュアルの意訳+メモ)
  2. リストア手順(マニュアルの意訳+メモ)
  3. Bitcaskでバックアップ実践
  4. Bitcaskでリストア実践その1
  5. Bitcaskでリストア実践その2
  6. 死んだノードをのけるとき
  7. まとめ
1. バックアップ手順
バックアップするのはデータディレクトリ、リングデータディレクトリ、コンフィグ。バックエンドによって手順は若干異なる。
  • Bitcask data: /var/lib/riak/bitcask
  • LevelDB data: /var/lib/riak/leveldb
  • Ring data: /var/lib/riak/ring
  • Configuration: /etc/riak
1.1 Bitcask
cp, rsync, tarなどよく知られたコマンドでバックアップできる。オンラインバックアップ可能。

1
tar cfz riak_data_`date +%Y%m%d_%H%M`.tar.gz /var/lib/riak/bitcask /var/lib/riak/ring /etc/riak

1.2 LevelDB
オンラインバックアップ不可能。なので、次のステップを踏む。
  1. ノード停止する
  2. バックアップ取る
  3. ノード起動する
バックアップコマンドは次のとおり。Bitcaskとほぼ同じ。対象のデータディレクトリに/var/lib/riak/leveldbになるだけ。

1
tar czf riak_data_`date +%Y%m%d_%H%M`.tar.gz  /var/lib/riak/leveldb /var/lib/riak/ring /etc/riak

2. リストア手順

リストア手順はBitcask, LevelDBともに同じ。

2.1 ノードを置き換える場合

HW障害か何かでノードがぶっ壊れて、置き換え用の新しいノードを故障したノードと同じIP/同じname(vm.argsの-name)で構築するようなケース。
  1. 新しいノードにRiakインストール
  2. 新しいノードに、バックアップからデータ、リング、コンフィグ(/var/lib/riak/bitcask(lebeldb), /etc/riak/*, /var/lib/riak/ring)を戻す。
  3. 新しいノードのRiak起動。
で、おk。

2.2 別のノードにデータを移す場合

別に用意したサーバにデータを移したいケース。もしくはぶっこわれたノードを置き換えるときに、事情があって同じIPにすることができないようなケース(DHCPでIP振ってるときとか)。
  1. 新しいノードにRiakインストール
  2. 新しいノードに、バックアップからデータ、リング、コンフィグ(/var/lib/riak/bitcask(lebeldb), /etc/riak/*, /var/lib/riak/ring)を戻す。
    • ★ 実際に試してみたらこれだとダメだった。詳しくは後述。
  3. 新しいノードのRiak起動。
  4. 新しいノードをriak-admin cluster join
  5. riak-admin down 古いノード
  6. riak-admin cluster force-replace 古いノード 新しいノード
  7. riak-admin cluster plan
  8. riak-admin cluster commit
となる。

ここから先は実際に試したときの作業ログ。

3. Bitcaskでバックアップ実践

1.1の手順の検証。5ノードでクラスタを構築して、buckets/test/keys/1, buckets/test/keys/2…..buckets/keys/10000000みたいな適当なデータをPUTしつつ、オンラインバックアップを実施してみた。tarで固めるだけ。が、tarのwarningメッセージが出た。なのでちゃんとリストアも試す。

4. Bitcaskでリストア実践その1

2.1の手順の検証。「3. Bitcaskでバックアップ実践」でバックアップしたデータを使う。

新しいノードを用意してRiakをインストール

とりあえずインストール。

で、ここで新しいノード以外のRiakを落としておく。クラスタに組み込まれてhinted-handoffが走ったりしないように(それ単体でデータがちゃんと戻せるかを見てみたかったのでついでにその確認もここで行う)。

新しいノードに、バックアップからデータ、リング、コンフィグ(/var/lib/riak/bitcask(lebeldb), /etc/riak/*, /var/lib/riak/ring)を戻す

バックアップで固めたtarを展開して、/etc/riak/*, /var/lib/riak/ring, /var/lib/riak/bitcaskを上書きする。

新しいノードを起動

起動OK。正常に起動できることが確認できた。

で、ここでこのリストアを行った新しいノードに、buckets/test/keys/1, buckets/test/keys/2…..buckets/keys/10000000のデータをgetしてみる。その結果は次の通り。
  • データがとびとびになる(当然だがこのノードが担当するキーのみをもっているので)
  • バックアップをとった瞬間以降はnot foundになる
実際にgetできたキーは次の通り。

——————
437573
437586
437590
437600
437634
437640 ← これ以降のデータは取れなかった。ここがバックアップを取った瞬間。
——————-

以上より、上記手順である時点までのバックアップがとれてリストアできることは確認できた。

ハンドオフの確認もしてみる

で、ここで落としていた4台を起動する。しばらくしたら他の4台をダウンしてまたリストアしたノード1台のみの状態にする。そして再びkey 1〜key 10000…みたいなgetを行う。すると、先ほど最後に取得されたキー437640以降のキーも取れるようになった(当然とびとびだが)。これはクラスタに組み込んだときにハンドオフが実施されて、他のノードから本来持つべきデータが収集されたと考える。

ノード全台稼働してまた確認

で、クラスタ全台を稼働してまた同じようにkey 1〜key 100000…をgetすると、全部のデータにアクセスできるようになった。

5. Bitcaskでリストア実戦その2

2.2の手順の検証。もちろん「3. Bitcaskでバックアップ実践」でバックアップしたデータを使う。

新しいノードにRiakをインストール

はいはい、yum install riak。でおk。

新しいノードに バックアップからデータ、コンフィグを戻す

2.2の★マークについてですが次のようにする必要がある。
  • ringは戻さない。
  • コンフィグのvm.argsの-nameは新しいノードのものにしておく。
おれがマニュアルを読み違えたのかもしれないけど、新しいノードのIPが変わるときは上述のようにしないとダメっぽい。ringを戻したらRiak自体が起動しなくなった。

新しいノードを起動

ここで新しいノードで例のごとくgetしてみたら437640までデータがちゃんと入ってることが確認できた。

新しいノードをriak-admin cluster join

いつもの手順だね。

新しいノードでriak-admin down 古いノード

ここでriak-admin member-statusで見ると、古いノードが「down」に、新しいノードが「joining」になってることがわかる。さらにriak-admin ring-statusで見ると「The following nodes are unreachable: [‘古いノード’]」の表示が消えてることが確認できる。どうやら、riak-admin down xxxxによって、古いノードはクラスタ上に存在しないよ、っていうマーキングが行われた模様。

新しいノードでriak-admin cluster force-replace 古いノード 新しいノード

successになることが確認できる。

新しいノードでriak-admin cluster plan

おなじみの手順だね。↓が結果

[root@xxx xxx]# riak-admin cluster plan
Attempting to restart script through sudo -H -u riak
=============================== Staged Changes ================================
Action Nodes(s)
——————————————————————————-
join ‘riak@xxx.xxx.xxx.xxx’ ★ 新しいノード
force-replace ‘riak@xxx.xxx.xxx.xxx’ with ‘riak@xxx.xxx.xxx.xxx’
★古いノード with 新しいノード
——————————————————————————-

WARNING: All of ‘古いノード’ replicas will be lost

NOTE: Applying these changes will result in 1 cluster transition

###############################################################################
After cluster transition 1/1
###############################################################################

================================= Membership ==================================
Status Ring Pending Node
——————————————————————————-
valid 19.9% — ‘riak@xxx.xxx.xxx.xxx’
valid 19.9% — ‘riak@xxx.xxx.xxx.xxx’
valid 19.9% — ‘riak@xxx.xxx.xxx.xxx’
valid 19.9% — ‘riak@xxx.xxx.xxx.xxx’
valid 20.3% — ‘riak@xxx.xxx.xxx.xxx’
——————————————————————————-
Valid:5 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

Partitions reassigned from cluster changes: 51
51 reassigned from ‘riak@xxx.xxx.xxx.xxx’ to ‘riak@xxx.xxx.xxx.xxx’ ★ 古いノード to 新しいノード

riak-admin cluster commit

これもおなじみのコマンド。ドーン。

で、全ノード稼働状態で問題なくデータがgetできることが確認できる。

6. 死んだノードをのけるとき

こんな感じかなーと思ってやってみた。死んだとみなすノードをOSシャットダウンしておく。んで、↓のような手順でOKだった。
  1. 生きてるノードでriak-admin down 死んだノード
  2. 生きてるノードでriak-admin cluster force-remove 死んだノード
  3. 生きてるノードでriak-admin cluster plan
  4. 生きてるノードでriak-admin cluster commit
7. まとめ

今回はマニュアルとちょっと違う手順になった箇所もあるので最後にまとめとく。ただし上の方にも書いたけど、検証したのはBitcaskのみ。

バックアップ手順

下記のファイル群をtarなどで固めればOK。Riak稼働中に実施可能。
  • Bitcask data: /var/lib/riak/bitcask
  • LevelDB data: /var/lib/riak/leveldb
  • Ring data: /var/lib/riak/ring
  • Configuration: /etc/riak
死んだノードと同じIPで立ち上げたノードにリストアする手順
  1. 新しいノードにRiakインストール
  2. 新しいノードに、バックアップからデータ、リング、コンフィグ(/var/lib/riak/bitcask, /etc/riak/*, /var/lib/riak/ring)を戻す。
  3. 新しいノードのRiak起動。
異なるIPをもつノードにリストアする手順
  1. 新しいノードにRiakインストール
  2. 新しいノードに、バックアップからデータ、コンフィグ(/var/lib/riak/bitcask, /etc/riak/*)を戻す。
    • ここで、vm.argsの-nameは新しいノードのものとする。
  3. 新しいノードのRiak起動。
  4. 新しいノードをriak-admin cluster join
  5. riak-admin down 古いノード
  6. riak-admin cluster force-replace 古いノード 新しいノード
  7. riak-admin cluster plan
  8. riak-admin cluster commit
死んだノードを除けるとき
  1. 生きてるノードでriak-admin down 死んだノード
  2. 生きてるノードでriak-admin cluster force-remove 死んだノード
  3. 生きてるノードでriak-admin cluster plan
  4. 生きてるノードでriak-admin cluster commit
 

ふう…次回は監視とかモニタリングとかそのへんについて。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

Set your Twitter account name in your settings to use the TwitterBar Section.