Smart Client

高機能クライアント

Aerospikeの高機能クライアントは、データとトラフィックを自動的にクラスタ内のノードに分散させます。このクライアントによる自動的なロード・バランス機能により、パフォーマンスと正確性の向上が図られています。


クラスタに接続するクライアントは、そのクラスタ内の全てのノードとその役割について知っている必要があります。Aerospikeでは、各ノードはその他のノードのリストを保持しています。このリストは、クラスタ内の必要なノードを見つけ出す際に利用されます。クライアントが初めて起動する際には、クラスタ内のいずれかのノードに接続するのですが、その時点で、スラスタ構成ノードのリストを入手します。さらに、クライアントは、各ノードの役割も知ることになります。各ノードは、パーティションに分割されたデータ全体の一部を、マスタとレプリカとして保持しています。各ノードが保持しているマスタとレプリカのパーティションのマップ(Partition Map)をクライアントは入手し、クライアント内に保持します。このPartition Mapをクライアントで共有することは、クライアント・サーバ間の効率的な交信にとり、非常に重要です。この方法により、Aerospikeでは、クライアントからデータにアクセスする際、1ホップで到達することが可能です。通常状態では、このAerospikeの方式は、単にサーバ、あるいは、クライアントの数のみに依存します。即ち、リニアなスケーラビリティが、ネットワーク等の他の部分が十分な速度を出してくれれば、保証されることになります。

各クライアントは、このPartition Mapをメモリ上に保持しています。情報を最新のものにするため、クライアントは、更新が必要かどうかを定期的にサーバ・ノードに問い合わせします。これは、クライアントが持っているPartition Mapのバージョンをサーバ上のものと比較します。もし、更新が必要な場合は、Partition Map全体を読み込み、更新します。

その起動時には、クラスタ・ノードの各々のために、クライアントは、メモリ上の構造を作成し、Partition Mapを保存します。そのノードのためのコネクション・プールを準備します。これらは、ノードがダウンした場合には、解除されます。これらの設定・解除は、思い処理であることは言うまでもありません。不具合発生時には、クライアントは同じノードや他のノードににリトライする等の対応プランが必要になります。ネットワークが不安定な場合、このような状態は頻発し、その結果、システム全体のパフォーマンスの劣化を引き起こします。従って、クラスタ・ノードの健全性を認識する際には、バランスのとれたアプローチが必要となります。Aerospikeでは、以下の方法により、バランスのとれたアプローチを行っています。

Aerospikeのクライアントは、次善の策として、データベースの状態を表す指標としてのトランザクション・レスポンス状態コードを使用しています。通信したノードが、トランザクション・リクエストを受けることに一時的に失敗するかもしれません。あるいは、ノードは正常に動作しているものの、一時的なネットワークの問題に起因しているかもしません。このような状況の影響を少なくするために、クライアントは、ノードにおけるデータベース操作の失敗回数を記録し、ある設定値を超えた場合のみ、そのノードとの接続を解除します。操作が成功した場合は、その回数を0にリセットします。

不安定なネットワークに対応することは困難な問題です。ネットワークが単一方向(AからBは見えるものの、BからAが見えない等)になるような不具合の場合はさらに困難です。例えば、クタスタのノード間はお互いが認識できるものの、クライアントからは一部のノードしか見えないような状況です。この場合、クライアントは、見えている全てのノードに対して、クライアントから見えていないノードが認識できているかを確認します。もし、クライアントからのみ見えていないノードが存在していることが分かると、クライアントは何も処理をしなくなります。もし、クライアントから見えていないノードがあるのであれば、そのクライアントはある一定時間、待機し、その後、内部情報から、そのノードを削除します。この数年の実運用の経験から、この方法は、システム全体の安定性向上に大きく寄与していると考えています。

X