Skip to content

ノンストップでノードを追加する場面の検証手順

YUKI "Piro" Hiroshi edited this page Apr 1, 2015 · 45 revisions

セットアップ

  • Droonga Clusterを2ノード以上の構成でセットアップしておく。 仮に、2ノード構成で各ノードの名前がnode0, node1とする。
  • log-searchリポジトリの説明を参照して、Droongaノードの1台(仮に、node0とする)をスタンドアロンのログ検索サーバとしてセットアップしておく。

サービスの起動

$ sudo service droonga-engine start
$ sudo service droonga-http-server start
$ sudo service td-agent restart

ログ流し込みのテスト

$ logger test1
$ logger test2
$ logger test3
$ curl "http://localhost:10041/d/select?table=Logs&limit=5&sortby=-timestamp&_=$(date +%s)"

これで、検索結果にtest1, test2, test3のログが出ていれば準備はOK。

コンスタントなログ流し込み

node0上で以下のコマンドを実行しておき、1秒ごとにログが追記されるようにしておく。

$ while true; do logger "Periodically log at $(date)"; sleep 1; done

モニタリング

別のコンソールで以下のコマンドを実行しておき、ログの件数が増えていくことを監視できるようにしておく。

DBを直接参照してレコード数を監視

$ while true; do echo "$(date) / Groonga@$(uname -n) / $(sudo -u droonga-engine -H groonga ~droonga-engine/droonga/databases/000/db select --table Logs --limit 0 | jq ".[1][0][0][0]")"; sleep 1; done

Droonga HTTP Server経由でレコード数を監視

$ while true; do echo "$(date) / HTTP@$(uname -n) / $(curl -s "http://localhost:10041/d/select?table=Logs&limit=0&_=$(date +%s)" | jq ".[1][0][0][0]")"; sleep 1; done

system.statusの結果を監視

$ while true; do echo '{"dataset":"Default","type":"system.status"}' | droonga-request --host node0 --receiver-host $(uname -n) | tail -n +2 | jq ".body"; sleep 1; done

Droonga HTTP Serverが認識しているdroonga-engineノードの一覧を監視

$ while true; do curl -s "http://localhost:10041/engines?_=$(date +%s)" | jq .; sleep 1; done

転送バッファの内容を監視

$ while true; do ls ~droonga-engine/droonga/state/buffer/intentional/*/; echo "-----"; sleep 1; done

join前の状態への復帰

restore-nodes.sh:

#!/bin/bash

NODE0_SUDO="vagrant ssh node0 -- sudo"
NODE1_SUDO="vagrant ssh node1 -- sudo"
NODE2_SUDO="vagrant ssh node2 -- sudo"

echo "stopping services..."
$NODE0_SUDO service droonga-http-server stop

$NODE0_SUDO service droonga-engine stop
$NODE1_SUDO service droonga-engine stop
$NODE2_SUDO service droonga-engine stop

echo "regenerating cluster informations..."
$NODE0_SUDO droonga-engine-catalog-generate --hosts=node0,node1
$NODE1_SUDO droonga-engine-catalog-generate --hosts=node0,node1
$NODE2_SUDO droonga-engine-catalog-generate --hosts=node2

echo "deleting old data..."
$NODE0_SUDO rm -rf ~droonga-engine/droonga/state ~droonga-engine/droonga/*.log
$NODE1_SUDO rm -rf ~droonga-engine/droonga/state ~droonga-engine/droonga/*.log
$NODE2_SUDO rm -rf ~droonga-engine/droonga/databases ~droonga-engine/droonga/state ~droonga-engine/droonga/*.log

if [ "$1" = "update" ]
then
  SCRIPT_URL="https://raw.githubusercontent.com/droonga/droonga-engine/master/install.sh"
  $NODE0_SUDO curl -o /tmp/install.sh $SCRIPT_URL
  $NODE0_SUDO env VERSION=master /tmp/install.sh
  $NODE1_SUDO curl -o /tmp/install.sh $SCRIPT_URL
  $NODE1_SUDO env VERSION=master /tmp/install.sh
  $NODE2_SUDO curl -o /tmp/install.sh $SCRIPT_URL
  $NODE2_SUDO env VERSION=master /tmp/install.sh
fi

./copy-db.sh node0 node1

echo "restarting services..."
$NODE0_SUDO service droonga-engine start
$NODE1_SUDO service droonga-engine start
$NODE2_SUDO service droonga-engine start

$NODE0_SUDO service droonga-http-server start

echo "done."

ノード間のデータベースのコピー(簡易)

コピー時は、ログの流入を止めてから行う。 vagrantのホストOS側で操作する。

copy-db.sh:

#!/bin/bash

SOURCE=$1
DESTINATION=$2

if [ "$SOURCE" = "" ]
then
  echo "you must specify the source host"
  exit 1
fi

if [ "$DESTINATION" = "" ]
then
  echo "you must specify the destination host"
  exit 1
fi

echo "copying database from $SOURCE to $DESTINATION"
SOURCE_SUDO="vagrant ssh $SOURCE -- sudo"
DESTINATION_SUDO="vagrant ssh $DESTINATION -- sudo"
$SOURCE_SUDO service td-agent stop
$SOURCE_SUDO service droonga-http-server stop
$SOURCE_SUDO service droonga-engine stop
$SOURCE_SUDO rm -f /vagrant/databases.tar
$SOURCE_SUDO tar -cvz -f /vagrant/databases.tar -C ~droonga-engine/droonga/ databases
$DESTINATION_SUDO rm -rf ~droonga-engine/droonga/databases
$DESTINATION_SUDO tar -xv -f /vagrant/databases.tar -C ~droonga-engine/droonga/
echo "done."

ログ流入の復活

$SOURCE_SUDO service droonga-engine start
$SOURCE_SUDO service droonga-http-server start
$SOURCE_SUDO service td-agent start

joinのステップ実行

serf="sudo -u droonga-engine -H /home/droonga-engine/droonga/serf"

roleを変更

$serf query -rpc-addr node1:7373 change_role '{"node":"node1:10031/droonga","role":"absorb-source"}'
$serf query -rpc-addr node2:7373 change_role '{"node":"node2:10031/droonga","role":"absorb-destination"}'
$serf members -rpc-addr node1:7373
$serf members -rpc-addr node2:7373

この時点で、droonga-engine@node2のみがクラスタから切り離されている状態である。 droonga-http-server@node2は、接続先engineが存在しない(認識できていない)。 ※よって、全てが完了した後でdroonga-http-serverからserfクラスタへの再joinが必要となるが、現在はその仕組みがないので、手動でのdroonga-http-serverver再起動などの作業が必要である。何か対策を考えないといけない。

$serf query -rpc-addr node1:7373 add_replicas '{"cluster_id":"8951f1b01583c1ffeb12ed5f4093210d28955988","dataset":"Default","hosts":["node2"]}'

echo '{"dataset":"Default","type":"system.status"}' | droonga-request --host node1 --receiver-host node
2
Elapsed time: 0.019290464
{
  "inReplyTo": "1427442288.9436483",
  "statusCode": 200,
  "type": "system.status.result",
  "body": {
    "nodes": {
      "node0:10031/droonga": {
        "status": "inactive"
      },
      "node1:10031/droonga": {
        "status": "active"
      },
      "node2:10031/droonga": {
        "status": "dead"
      }
    },
    "reporter": "node1:47716/droonga @ node1:10031/droonga"
  }
}

これで、node0/1からはnode2が見えるようになる。


$serf query -rpc-addr node2:7373 join '{"node":"node2:10031/droonga","type":"replica","source":"node1:10031/droonga","dataset":"Default"}'

$serf query -rpc-addr node2:7373 absorb_data '{"node":"node2:10031/droonga","source":"node1:10031/droonga","port":10031,"tag":"droonga","dataset":"Default","messages_per_second":100}'
$serf query -rpc-addr node2:7373 report_metadata '{"node":"node2:10031/droonga","key":"absorbing"}'

$serf query -rpc-addr node1:7373 report_metadata '{"node":"node1:10031/droonga","key":"last_processed_message_timestamp"}'

$serf query -rpc-addr node2:7373 set_metadata '{"node":"node2:10031/droonga","key":"last_processed_message_timestamp","value":"2015-03-24T04:36:09.423Z"}'

$serf query -rpc-addr node1:7373 change_role '{"node":"node1:10031/droonga","role":null}'
$serf query -rpc-addr node2:7373 change_role '{"node":"node2:10031/droonga","role":null}'