Skip to content
Takehiro YOSHIHAMA edited this page Jul 4, 2016 · 5 revisions

このドキュメントは古くなっています。README.md または USAGE.mdを参考にしてください。

ノードの起動

インストールが完了したら、まずは1つのノードで起動させます。起動前に、Flareのデータディレクトリを決定しておきます。ここでは

  • /home/flare

をデータディレクトリとして利用します。

1. 設定ファイル(flarei)

Flareは1つのインデックスサーバ(flarei)と1つ以上のノードサーバ(flared)で動作します。ここではまずインデックスサーバの設定ファイルを作成します。

Debianパッケージを利用してインストールした場合には/etc/flarei.confが既に作成されていますが、ソースコードパッケージからインストールした場合には新規に作成する必要があります(ソースコードパッケージのetcディレクトリにサンプルがありますので、これを/home/flare等にcpして編集するのが楽かもしれません)。

ここでは下記のようにしておきます:

# データディレクトリ
data-dir = /home/flare
# syslogファシリティ名
log-facility = local0
# 最大接続数
max-connection = 512
# ノードダウン閾値
monitor-threshold = 3
# ノード監視間隔(秒)
monitor-interval = 1
# インデックスサーバ名
server-name = flare.example.com
# インデックスサーバポート
server-port = 12120
# スレッドプール最大数
thread-pool-size = 8

各設定値の詳細な説明についてはリファレンスをご覧ください。

2. 設定ファイル(flared)

次にノードサーバの設定ファイルを作成します。flarei.confと同様にDebianパッケージからインストールした場合には/etc/flared.confが既に存在していますのでこれを編集します。ソースコードパッケージからインストールした場合には、同じくパッケージに含まれるetc/flared.confを利用すると楽かと思います。

# データディレクトリ
data-dir = /home/flare
# インデックスサーバ名(flarei.confのserver-nameに揃えます)
index-server-name = flare.example.com
# インデックスサーバポート(flarei.confのserver-portに揃えます)
index-server-port = 12120
# syslogファシリティ
log-facility = local0
# 最大接続数
max-connection = 1024
# ストレージロックスロット数
mutex-slot = 64
# プロキシ並列数
proxy-concurrency = 2
# ノードサーバ名
server-name = flare.example.com
# ノードサーバポート
server-port = 12121
# スレッドスタックサイズ(KB)
stack-size = 128
# ストレージオプション
storage-ap = 4
storage-bucket-size = 16777216
# storage-compress =
# storage-large = true
# ストレージタイプ(1.0.0ではtchのみサポート)
storage-type = tch
# スレッドプール最大数
thread-pool-size = 16

3. /etc/default/flare (Debianパッケージのみ)

Debianパッケージからインストールした場合は/etc/default/flareを編集しておきます。

RUN_INDEX="yes"
RUN_NODE="yes"
CONF_INDEX="/etc/flarei.conf"
CONF_NODE="/etc/flared.conf"
DATA_INDEX="/home/flare"
DATA_NODE="/home/flare"

インストール直後はDATA_INDEXとDATA_NODEがそれぞれ"/tmp"になっていますので、flarei.conf、flared.confに設定したデータディレクトリにこれを変更します(ここでは上記の例に沿って/home/flareとしています)。

4. syslog設定(オプション)

ログを出力させたい場合は、flarei.conf、flared.confに設定したログファシリティに合わせてsyslog.confを設定します。通常のsyslogの場合は下記の行を/etc/syslog.confに追加して、syslogdをreloadします。

# Log for flare
local0.*                /var/log/flare.log

5. 起動

以上で設定は完了です。ソースコードパッケージからインストールした場合は

$ sudo /usr/local/flare/bin/flarei -f /home/flarei.conf --daemonize
$ sudo /usr/local/flare/bin/flared -f /home/flared.conf --daemonize

とします。このとき、まず最初にflarei(インデックスサーバ)を起動してください。ノードサーバは起動時にインデックスサーバへ接続を試みますので、インデックスサーバが起動していないとそのまま終了してしまいます。

Debianパッケージからインストールした場合は

$ sudo /etc/init.d/flare start

で起動します。

無事起動できていると(syslogを設定している場合)、下記のようなログが表示されると思います。

flarei[8603]: [3069409824][NTC][flarei.cc:105-startup] flarei version 1.0.0 - system logger started
flarei[8603]: [3069409824][NTC][flarei.cc:107-startup] application startup in progress...
flarei[8603]: [3069409824][NTC][flarei.cc:108-startup]   config_path:       /etc/flarei.conf
flarei[8603]: [3069409824][NTC][flarei.cc:109-startup]   daemonize:         true
flarei[8603]: [3069409824][NTC][flarei.cc:110-startup]   data_dir:          /home/flare
flarei[8603]: [3069409824][NTC][flarei.cc:111-startup]   max_connection:    512
flarei[8603]: [3069409824][NTC][flarei.cc:112-startup]   monitor_threshold: 3
flarei[8603]: [3069409824][NTC][flarei.cc:113-startup]   monitor_interval:  1
flarei[8603]: [3069409824][NTC][flarei.cc:114-startup]   server_name:       flare.example.com
flarei[8603]: [3069409824][NTC][flarei.cc:115-startup]   server_port:       12120
flarei[8603]: [3069409824][NTC][flarei.cc:116-startup]   stack_size:        128
flarei[8603]: [3069409824][NTC][flarei.cc:117-startup]   thread_pool_size:  8
flarei[8604]: [3069409824][NTC][app.cc:90-_daemonize] daemon process created -> now i have new pid [8604]
flarei[8604]: [3069409824][NTC][cluster.cc:1210-_reconstruct_node_partition] reconstructing node partition map... (from 0 entries in node map)
flarei[8604]: [3069409824][NTC][cluster.cc:1309-_reconstruct_node_partition] node partition map:
flarei[8604]: [3069409824][NTC][cluster.cc:1328-_reconstruct_node_partition] node partition map (prepare):
flarei[8604]: [3069409824][NTC][flarei.cc:164-run] entering running loop
...
flared[8607]: [3069975072][NTC][flared.cc:109-startup] flared version 1.0.0 - system logger started
flared[8607]: [3069975072][NTC][flared.cc:111-startup] application startup in progress...
flared[8607]: [3069975072][NTC][flared.cc:112-startup]   config_path:         /etc/flared.conf
flared[8607]: [3069975072][NTC][flared.cc:113-startup]   daemonize:           true
flared[8607]: [3069975072][NTC][flared.cc:114-startup]   data_dir:            /home/flare
flared[8607]: [3069975072][NTC][flared.cc:115-startup]   index_server_name:   flare.example.com
flared[8607]: [3069975072][NTC][flared.cc:116-startup]   index_server_port:   12120
flared[8607]: [3069975072][NTC][flared.cc:117-startup]   max_connection:      1024
flared[8607]: [3069975072][NTC][flared.cc:118-startup]   mutex_slot:          64
flared[8607]: [3069975072][NTC][flared.cc:119-startup]   proxy_concurrency:   2
flared[8607]: [3069975072][NTC][flared.cc:120-startup]   server_name:         flare.example.com
flared[8607]: [3069975072][NTC][flared.cc:121-startup]   server_port:         12121
flared[8607]: [3069975072][NTC][flared.cc:122-startup]   stack_size:          128
flared[8607]: [3069975072][NTC][flared.cc:123-startup]   storage_ap:          4
flared[8607]: [3069975072][NTC][flared.cc:124-startup]   storage_bucket_size: 16777216
flared[8607]: [3069975072][NTC][flared.cc:125-startup]   storage_compress:    
flared[8607]: [3069975072][NTC][flared.cc:126-startup]   storage_large:       false
flared[8607]: [3069975072][NTC][flared.cc:127-startup]   storage_type:        tch
flared[8607]: [3069975072][NTC][flared.cc:128-startup]   thread_pool_size:    16
flared[8608]: [3069975072][NTC][app.cc:90-_daemonize] daemon process created -> now i have new pid [8608]

6. ノード設定

プロセスが起動したらインデックスサーバにtelnet(か何か)で接続して"stats nodes"としてみます(インデックスサーバが把握しているノードの一覧を表示します)。

$ telnet flare.example.com 12120
...
Escape character is '^]'.
stats nodes

すると

STAT flare.example.com:12121:role proxy
STAT flare.example.com:12121:state active
STAT flare.example.com:12121:partition 0
STAT flare.example.com:12121:balance -1
STAT flare.example.com:12121:thread_type 16
END

といった内容が表示されるかと思います。とりあえず1行目をみてみると、roleがproxyだと言っています。この状態(つまりmasterがいない状態)ではデータのI/Oができませんので、まずはこのサーバをmasterにしてみます。

同じくインデックスサーバにつないで

node role flare.example.com 12121 master 1 0

とすると

OK

と返ってくるはずです。ちなみに上記はインデックスサーバの"node role"コマンドで、引数には

[ノードサーバ名] [ノードサーバポート] [role=(master|slave|proxy)] [balance] ([partition])

を指定します。上記はflare.example.com:12121をbalance=1(1台しかないのでなんでもよいです)、partition=0(1個目のmasterなので0になります)、でroleをmasterにしています。

この後もう一度

stats nodes

としてみると

STAT flare.example.com:12121:role master
STAT flare.example.com:12121:state active
STAT flare.example.com:12121:partition 0
STAT flare.example.com:12121:balance 1
STAT flare.example.com:12121:thread_type 16
END

となっているかと思います。これでmaster1台構成で起動中、ということになります(disk baseのmemcachedが1台あるのと同じ状況です)。

試しに少しデータのI/Oをしてみます。今度はインデックスサーバではなくノードサーバのポートにtelnet(か何か)で接続してsetやgetをしたのが下記の例です。

$ telnet flare.example.com 12121
...
set key1 0 0 4
test
STORED
get key1
VALUE key1 0 4
test
END

また、memcachedのクライアントライブラリでも(サーバ名、ポート番号を指定すれば)まるでmemcachedのようにアクセスできると思います。

slaveノードの追加

1台での運用では負荷が厳しい、あるいはサーバがダウンしたときに困るというときはslaveノードを追加します。

1. サーバ準備

まずどこかにサーバを用意して(node1.example.comとでもしてみます)、Flareをインストールします。以降のサーバではインデックスサーバ(flarei)は動作させない点にご注意ください。

2. 設定ファイル(flared)

この場合の設定ファイルは下記のようになります:

# データディレクトリ
data-dir = /home/flare
# インデックスサーバ名(flarei.confのserver-nameに揃えます)
index-server-name = flare.example.com
# インデックスサーバポート(flarei.confのserver-portに揃えます)
index-server-port = 12120
# syslogファシリティ
log-facility = local0
# 最大接続数
max-connection = 1024
# ストレージロックスロット数
mutex-slot = 64
# プロキシ並列数
proxy-concurrency = 2
# ノードサーバ名
server-name = node1.example.com
# ノードサーバポート
server-port = 12121
# スレッドスタックサイズ(KB)
stack-size = 128
# ストレージオプション
storage-ap = 4
storage-bucket-size = 16777216
# storage-compress =
# storage-large = true
# ストレージタイプ(1.0.0ではtchのみサポート)
storage-type = tch
# スレッドプール最大数
thread-pool-size = 16

同一サーバで試したい場合はserver-portを(12122などに)変更すれば動作検証を行うことができます(flareは"サーバ名:ポート"でノードを識別します)。

また、Debianパッケージからインストールした場合は、同様に/etc/default/flareを編集します。

RUN_INDEX="no"
RUN_NODE="yes"
CONF_INDEX="/etc/flarei.conf"
CONF_NODE="/etc/flared.conf"
DATA_INDEX="/home/flare"
DATA_NODE="/home/flare"

先の例と異なり、RUN_INDEX="no"となっていることにご注意ください。

3. ノード状況確認

で、node1.example.comでflaredが無事起動したら、インデックスサーバでstats nodesしてみます。

STAT flare.example.com:12121:role master
STAT flare.example.com:12121:state active
STAT flare.example.com:12121:partition 0
STAT flare.example.com:12121:balance 1
STAT flare.example.com:12121:thread_type 16
STAT node1.example.com:12121:role proxy
STAT node1.example.com:12121:state active
STAT node1.example.com:12121:partition -1
STAT node1.example.com:12121:balance 0
STAT node1.example.com:12121:thread_type 17
END

新しいノード(node1.example.com:12121)のroleがproxyとなっていることが分かります。このとき、node1.example.com:12121はデータI/Oのリクエストを全てflare.example.com:12121へproxyします。試しにnode1.example.com:12121につないで

get key1

としてみると、先の例でsetしたデータが自分のノードにあるかのようにレスポンスを返します。

VALUE key1 0 4
test
END

(これはこれである意味大事なのですが)このままではslaveもへったくれもないので、node1.example.com:12121をslaveノードに設定してみます。

4. ノード設定

相変わらずクライアントインターフェースが(まだ)ありませんので、インデックスサーバへtelnetをしてnode roleコマンドを実行します。

$ telnet flare.example.com 12120
Escape character is '^]'.
node role node1.example.com 12121 slave 1 0
OK

これで"node1.example.com:12121"をbalance=1、partition=0でslaveに、という指定になります。この後の動作は下記のようになります。

ということでしばらく待ってから"stats nodes"をすると

STAT flare.example.com:12121:role master
STAT flare.example.com:12121:state active
STAT flare.example.com:12121:partition 0
STAT flare.example.com:12121:balance 1
STAT flare.example.com:12121:thread_type 16
STAT node1.example.com:12121:role slave
STAT node1.example.com:12121:state active
STAT node1.example.com:12121:partition 0
STAT node1.example.com:12121:balance 0
STAT node1.example.com:12121:thread_type 17
END

というようにroleとpartitionが変更されていることが分かります。

5. balance設定

上記の状態はbalanceが0のままでただ単にレプリケーションし続けているだけなので(運用状況によってはこれはこれで意味がありますが...)、実際にアクセスを振り向けたい場合には

node role node1.example.com 12121 slave 2

のように、balanceを設定する必要があります(構築完了と同時にアクセスにさらされないいための仕様です)

上記はbalanceを2に設定していますので、masterサーバのbalanceが1の場合は1:2でreadのアクセスが振り向けられることになります。

masterノードの追加

read(というかget)がひたすら多い場合はslaveを増やすことで負荷面での問題を解決することができますが、write(というかset/add/replace/append/prepend/cas/incr/decr)がどうしようもなく増えてきた場合、あるいはデータサイズが増えてきた場合にはmasterノードを分割(パーティショニング)していくことでスケーラビリティを確保することができます。

1. サーバ準備

サーバの準備や設定は、slaveノードの追加と同様です。ここではnode2.example.com:12121で設定したことにします。

2. ノード設定

masterを追加する場合にも"node role"コマンドを利用します。

node role node2.example.com 12121 master 1 1

flare.example.comのmasterを設定した場合との違いは最後のpartition引数が1になっていることです)。ここでstats nodesしてみると

STAT node2.example.com:12121:role master
STAT node2.example.com:12121:state prepare
STAT node2.example.com:12121:partition 1
STAT node2.example.com:12121:balance 1
STAT node2.example.com:12121:thread_type 18

というように、roleがmaster、stateがprepareになっていることが分かります。このときの動作は

  • stateがactiveなmaster(ここではflare.exampe.com:12121)は、新しいmaster(ここではnode2.example.com:12121)に書かれるべきkeyで更新があった場合は(通常のレプリケーションい加えて)そのデータを新しいmasterへレプリケーション
  • 新しいmasterは現在activeな各masterから自分が保持するべきデータをdump

となります。

3. slaveノードの追加(オプション)

新しいmasterを追加する場合、masterノードのstateがprepareであってもそのslaveを追加することができます。node2.example.com:12121のslaveとしてnode3.example.com:12121を追加しておきたい場合は

node role node3.example.com 12121 slave 1 1

とすれば、node2.example.com:12121のslaveとして動作を開始します。

4. stateの設定

masterを追加する場合、dumpが完了してもstateはprepareのままです(勝手にmasterが増えると困る場合も多いかと思うので)。したがって、新しいmasterの投入は手動でstateを変更することになります。

具体的には

node state node2.example.com active

とします。これでnode2.example.com:12121はpartition=1のmasterとして動作し始め、既存のmaster(ここの例ではflare.example:12121)への書込みは1/2になるはずです。

なお、dumpが完了したかどうかは、statsコマンドのcurr_itemsの数をみるかstats threadsコマンドでopの項目がdumpとなっているスレッドがないかどうかでチェックしてください(追々改善します...)。

proxyノードの追加

proxyノードは、その名の通りデータを持たずあらゆるリクエストを適切なノードへ投げつけるだけのノードです。というと全く意味がないように思えてしまうのですが、これはアプリケーションサーバのローカルプロセスとして起動することを想定しています。

例えば、masterノードが2台(node1, node2とします)あり、アプリケーションサーバ(ws1とします)がまた別にある状態を想定してみます。このとき、ws1がkey1というキーでデータを取得しようとする場合、ws1はkey1がどのノードに保存されているか、良く言えば気にする必要がない、悪く言えば分からないため適当なサーバにリクエストを投げます。ここではnode2にアクセスするとします。

このとき、node2にデータがあればよいのですが、ない場合にはnode2がnode1にリクエストをproxyすることになりコストがかかります。

+-----+ get key1 +-------+ (proxy) get key1 +-------+
| ws1 |    ->    | node2 |         ->       | node1 |
+-----+          +-------+                  +-------+

ここでローカルにproxyノードがあるとproxyノードへアクセスがあった時点で適切なproxy先を選択することができるので

+------------------------+
|     get key1 +--------+| (proxy) get key1 +-------+
| ws1    ->    | flared |->        ->       | node1 |
|              +--------+|                  +-------+
+------------------------+

という形でネットワークコスト等を削減することができます。その他、アプリケーションサーバが1,000台くらいある場合に各nodeへpersistentな接続を行うと数万コネクションが常時張られてしまいなんだか大いに無駄なので、これをローカルのproxyノードにすることで無駄なコネクションを節約することができたりもします。

ノードの削除

あるノードサーバを再起動したい、あるいはサービスアウトさせたい場合は"node state"コマンドと"node remove"コマンドを利用します。

ここでは上記の例でflare.example.com:12121のslaveとして動作しているnode1.example.com:12121を外すケースを例にとります。

まずインデックスサーバに接続して

node state node1.example.com 12121 down

とします。これにより、node1.example.com:12121はサービスアウトされます(このノードへのリクエストは全てproxyされます)。具体的には

  • state = down
  • role = proxy

という状態になります。単純に再起動するだけでしたらこのまま再起動すれば問題ありません。

ただ、一旦downとなってもインデックスサーバからの監視アクセス(PING)に応答すると再度stateがactiveになってしまうので、再起動する場合にはnode stateコマンド後素早くプロセスを終了させてください...。

なお、一旦stateがactiveになった状態でプロセスを起動させようとすると「同名のノードが既にactiveである」という理由で起プロセスの起動に失敗します。この場合はしばらく待つか、再度node stateコマンドでstateをdownに設定してから起動させてください。

そして、ノードを完全に削除したい場合はstateがdownである状態でさらに

node remove node1.example.com 12121

としてください。