2013年5月10日金曜日

Cassandra の複数サーバを1ノードで動かす

普通この種のものは、ポートを設定ファイルで切り替えてやれば1ノードで複数サーバを動かすことができるのだけど、Cassandraではむずかしい。というのは、システムのポート番号が全てのサーバで同一であることが前提となっているらしいからだ。サーバのノード情報はゴシップでやり取りしているはずだから、一度接続出来ればポート番号を交換して共有できそうなものなのだが、その接続ができない。

yamlファイルのseedsを指定するフィールドが、IPアドレスのみを指定するようになっていて、ポート番号を指定できない。簡単に修正できれば修正してみようかと、ソースを追ってみたけど割に中の方までIpAddressだけしか持っていないので難しいと判断。

VMの中なので、ネットワークインターフェイスを増やすのは簡単なので、それで何とかしようかと思ったのだが、 ググったらもっと簡単な方法があった。 3年前の記事

ローカルホストのloインターフェイスにaliasで別のIPアドレスをふり、それを使うという方法。 本物のネットワーク・インターフェイスを増やすと色々面倒だけどこれなら、ずっと楽だしVMじゃなくてもできる。

以下ubuntuでの方法。

  • sudo ifconfig lo:1 127.0.0.2 up    
    
    とかやって、lo:1というインターフェイスを作る。必要な数だけつくる。
  • conf ディレクトリをサーバの数だけ複製する。
  • cassandra.yamlの data_file_directories, commit_log_directory, saved_caches_directory が重複しないように 別々のディレクトリを掘って指定する。
  • cassandra.yamlの listen_address と rpc_address を127.0.0.2などに変更する。
  • cassandra.yamlのseeds にアドレスを並べる
      - seeds: "127.0.0.1,127.0.0.2"
    
  • log4j-server.properties の /var/log/cassandra となっている部分を適宜重複しないように変更する。
  • cassandra-env.sh のJMX_PORTは別の値を指定する。このポートは常に0.0.0.0に対してバインドされるらしいので 複数のサーバ間が同じポートで共有することができないらしい。
  • 起動時には新しく作ったconfディレクトリを環境変数で指定して起動すれば良い。
    CASSANDRA_CONF=conf1 bin/cassandra