複数の書き込みに対応する環境を作る。
「複数ノード立ち上げたApache Cassandraの環境にて
どのようにデータを分割するか?」
という問いに対しては
「基本的によしなにしてくれるのであまり意識しなくてもよい。」
との回答になります。
つまりはどのノードに繋いでも変わらないとということです。
Cassandraがリクエストを必要に応じてプロキシしてくれるので
「最終的に」しかるべき場所に格納してくれるという動きをしてくれます。
極端な話、接続先のノードを一つに絞ってすべてのリクエストを
そこに集中させると言う方法もありです。
もっとも、そのままそのアクセスポイントが
SPF(Single Point of Failure/シングルポイント障害)に
なってしまいます。
この点に関して、Apache Cassandraでは以下の四つの方法を提示してくれています。
- クライアントにおいて接続先を管理し適切な接続ノードに振り分ける。
- DNSラウンドロビンを使う。 接続先をFQDNで管理し同一名に複数のIPを割り当て特定のFQDNにアクセスさせる方法を使用する方法です。
- ThriftのAPI、client.get_string_propertyを使用してCassandraノードからノードリストを取得する。 このAPIを使うとこんなJSONが帰ってきます。
- ロードバランサやプロキシを使う。
要するにアプリケーションを作り込めと言うことですね。
Cassandraはこの方法を推奨しています。ただ、DNSラウンドロビンは負荷分散としては機能的に足りない所が多いので
自分はお勧めしません。(致命的なのが接続先ノードのステータスを管理しないこと。)
{
"72360816833403413813516172818645147903":"192.168.1.104",
"53716703941129153059732412441632990819":"192.168.1.6",
"4368941974377008489670679703283346037":"192.168.1.106",
"123621947362397555094783433836216926846":"192.168.1.108"
}
レンジとIPですね。これを使って振り分けるアプリケーションを作るとの事です。
やはりノードのステータスを見ていないので自分としてはお勧めしません。
LVSなどですね。Thriftのポート(デフォルト:9160)に対するセッションを捌けばよいのでわりと楽かなと。
という訳でLVSを使用した負荷分散環境を構築してみました。
イメージはこんな感じです。
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の検証を予定です。