Apache Cassandraを複数ノードで(その三)

| コメント(0) | トラックバック(0)


複数の書き込みに対応する環境を作る。


「複数ノード立ち上げたApache Cassandraの環境にて
どのようにデータを分割するか?」
という問いに対しては

「基本的によしなにしてくれるのであまり意識しなくてもよい。」
との回答になります。

つまりはどのノードに繋いでも変わらないとということです。

Cassandraがリクエストを必要に応じてプロキシしてくれるので
「最終的に」しかるべき場所に格納してくれるという動きをしてくれます。

極端な話、接続先のノードを一つに絞ってすべてのリクエストを
そこに集中させると言う方法もありです。

もっとも、そのままそのアクセスポイントが
SPF(Single Point of Failure/シングルポイント障害)に
なってしまいます。

この点に関して、Apache Cassandraでは以下の四つの方法を提示してくれています。

  1. クライアントにおいて接続先を管理し適切な接続ノードに振り分ける。
  2. 要するにアプリケーションを作り込めと言うことですね。

  3. DNSラウンドロビンを使う。
  4. 接続先をFQDNで管理し同一名に複数のIPを割り当て特定のFQDNにアクセスさせる方法を使用する方法です。
    Cassandraはこの方法を推奨しています。ただ、DNSラウンドロビンは負荷分散としては機能的に足りない所が多いので
    自分はお勧めしません。(致命的なのが接続先ノードのステータスを管理しないこと。)

  5. ThriftのAPI、client.get_string_propertyを使用してCassandraノードからノードリストを取得する。
  6. このAPIを使うとこんなJSONが帰ってきます。

    {
    "72360816833403413813516172818645147903":"192.168.1.104",
    "53716703941129153059732412441632990819":"192.168.1.6",
    "4368941974377008489670679703283346037":"192.168.1.106",
    "123621947362397555094783433836216926846":"192.168.1.108"
    }
    レンジとIPですね。これを使って振り分けるアプリケーションを作るとの事です。
    やはりノードのステータスを見ていないので自分としてはお勧めしません。

  7. ロードバランサやプロキシを使う。
  8. LVSなどですね。Thriftのポート(デフォルト:9160)に対するセッションを捌けばよいのでわりと楽かなと。



という訳でLVSを使用した負荷分散環境を構築してみました。
イメージはこんな感じです。

lvs.png

4台ノード構成の真ん中にLVSサーバを挟んでいます。
LVSはわざわざNATにする必要もないのでDR(Direct Routing)を使用。
設定はkeepalivedを使用しています。

とりあえずはaptでkeepalivedとlvsadminをインストールします。
/etc/keepalived/keepalived.confの設定は以下の通り

 

virtual_server_group csdr9160 {
  192.168.1.105  9160
}

virtual_server group csdr9160 {

  delay_loop  3
  lvs_sched   lc
  lvs_method  DR
  protocol TCP

  real_server  192.168.1.6  9160 {

    weight 1
    inhibit_on_failure

    TCP_CHECK {
      connect_port 9160
      connect_timeout 30
    }
  }


  real_server  192.168.1.104  9160 {

    weight 1
    inhibit_on_failure

    TCP_CHECK {
      connect_port 9160
      connect_timeout 30
    }
  }

  real_server  192.168.1.106  9160 {

    weight 1
    inhibit_on_failure

    TCP_CHECK {
      connect_port 9160
      connect_timeout 30
    }
  }

  real_server  192.168.1.108  9160 {

    weight 1
    inhibit_on_failure

    TCP_CHECK {
      connect_port 9160
      connect_timeout 30
    }
  }
}

本来であればVRRPを使用して複数台立てるのが正しいのですが、単純に箱がなかったので単体構成です。

各ノードで

#iptables -t nat -A PREROUTING -d 192.168.1.105 -j REDIRECT

を実行しLVSのDRが稼働するようにします。
これで負荷分散環境は整いました。192.168.1.105:9160をた叩けば任意の
cassandraノードに書き込んでくれるようになりました。


ようやく準備が整いました。次回以降検証を行っていきたいと思います。
次はConsistencyLevelの検証を予定です。

 

トラックバック(0)

トラックバックURL: http://www.intheforest.jp/mtadmin/mt-tb.cgi/27

コメントする

ウェブページ