前置き
Aerospikeに限らずですが、冗長化(予備のようなもの)をしていない場合、サーバーAに問題が発生すると最悪システム全体が動作しなくなってしまいます。
そのため、今回はKVSであるAerospikeではどのように冗長化の仕組みがあるのかを説明したいと思います。
目次
- データの持ち方
- Aerospikeへのアクセス
- データ書き込み時
- マスターノード問題発生時
- マスターノード復旧時
1. データの持ち方
Aerospikeでは、ネームスペースというRDBでいうところのテーブルのようなものを持っており、そのネームスペース単位で4096のパーティションに分割し、それぞれのノード(サーバー)に均等に割り振ります。
このはじめに割り振られたそれぞれのパーティションが属するノードをマスターノードとします。
つまり、Node1はパーティション0,3,6のマスターノード、Node2はパーティション1,4,7のマスターノードになります。
そして、Aerospikeの冗長化としては、RF(レプリケーションファクター)が2の時、マスターとは別にレプリカを作成します。
※ RF(レプリケーションファクター) … データのコピーをいくつ保持するかの設定値(RF=2の時、マスターコピー1つとレプリカ1つになる)
2. Aerospikeへのアクセス
Aerospikeクライアントは1つ以上のIPアドレスとポート番号を指定して初期化されることで、指定したノードのどれかがダウンしていても別のノードに接続を試みます。
クライアントは指定されたIPアドレスのいずれかに接続し、クラスタ全体のパーティションマップを取得します。
次に、パーティションマップからアクセスしたいデータの情報を特定し、マスターノードに接続します。
※ パーティションマップ ‥ どのノードがどのパーティションを担当しているか、マスターノードとレプリカノードの情報が記載されています。また、パーティションマップは一度取得されるとローカルにキャッシュされます。
3. データ書き込み時
データの書き込み処理における応答のタイミングは、そのデータのマスターノードとすべてのレプリカノードへの書き込み処理が完了したタイミングになります。(応答タイミングは設定により変更できますが、今回はデフォルト設定の説明になります。)
同期レプリケーションの仕組み
- クライアントからの書き込みリクエスト
- マスターノードでの書き込み処理
- レプリカノードへの書き込み処理
- クライアントへ「書き込み完了」の応答
※ 書き込みはマスターにのみ行えます。レプリカに書き込むことはできません。
4. マスターノード問題発生時(RF=2, ノード=3)
マスターノードに問題が発生した場合、Aerospikeはハートビートによって障害を検知し、自動的にそのパーティションのレプリカを保持していたノードをマスターに昇格させます。
その後、現在の状態ではRFが1つしかないため、Aerospikeは自動的に残り2つのノードでパーティションの再分散を行います。(再分散で再度コピーの作成と偏ったマスターパーティションの分散を行います。)
※ ハートビート ‥ プロセスが正常に動作していることを定期的に知らせる信号やデータのことで、各ノードがお互いにハートビートを送りあうことで障害を検知します。
5. マスターノード復旧時
マスターノード復旧時、Aerospikeは自動的にクラスタに再参加し、3つのノードでパーティションが均等になるように再分散を行い、レプリカの作成も行います。
最後に
弊社ではエンジニアの求人を行っております。
少しでも興味を持たれた方は下記よりご応募ください。