Consul-architecture
領事-建築
1つのデータセンターで動作する領事のアーキテクチャ図は、以下に示すように最もよく説明することができます-
ご覧のとおり、3つの異なるサーバーがあり、それらはConsulによって管理されています。 動作するアーキテクチャは、raftアルゴリズムを使用して機能します。これにより、3つの異なるサーバーからリーダーを選出することができます。 これらのサーバーには、 Follower や Leader などのタグに従ってラベルが付けられます。 名前が示すように、フォロワーはリーダーの決定に従う責任があります。 これら3つのサーバーはすべて、通信のためにさらに相互に接続されています。
各サーバーは、RPCの概念を使用して、独自のクライアントと対話します。 クライアント間の通信は、以下で説明する*ゴシッププロトコル*により可能です。 インターネット機能との通信は、TCPまたはゴシップ方式の通信を使用して利用可能にできます。 この通信は、3つのサーバーのいずれかと直接接触しています。
いかだアルゴリズム
Raftは、複製されたログを管理するためのコンセンサスアルゴリズムです。 これは、ネットワークパーティションが存在する場合、一貫性と可用性のどちらかを選択する必要があると述べている* CAP定理*の原則に依存しています。 CAP定理の3つの基本がすべての時点で達成できるわけではありません。 せいぜいそれらのうちの2つとトレードオフする必要があります。
*Raft Cluster* には複数のサーバーが含まれており、通常は奇数です。 たとえば、5つのサーバーがある場合、システムは2つの障害に耐えることができます。 常に、各サーバーは、*リーダー、フォロワー*、または*候補*の3つの状態のいずれかになります。 通常の運用では、リーダーは1つだけであり、他のサーバーはすべてフォロワーです。 これらのフォロワーは受動的な状態にあります。 彼らは自分でリクエストを発行するのではなく、単にリーダーと候補者からのリクエストに応答します。
次の図では、いかだアルゴリズムが機能するワークフローモデルについて説明します-
キー値データ
Consulのバージョン0.7.1以降、個別のキー値データが導入されています。 KVコマンドは、コマンドラインを介してConsulのキーと値のストアと対話するために使用されます。 ストアからの Inserting、Updateing、Reading および Deleting のトップレベルコマンドを公開します。 キー/値オブジェクトストアを取得するには、consulクライアントで使用可能なKVメソッドを呼び出します-
kv := consul.KV()
- KVPair構造*は、単一のキー/値エントリを表すために使用されます。 Consul KVペアの構造は、次のプログラムで確認できます。
type KVPair struct {
Key string
CreateIndex uint64
ModifyIndex uint64
LockIndex uint64
Flags uint64
Value []byte
Session string
}
ここで、上記のコードで言及されているさまざまな構造は、次のように定義できます-
- キー-スラッシュURL名です。 たとえば、sites/1/domain。
- CreateIndex -キーが最初に作成されたときに割り当てられたインデックス番号。
- ModifyIndex -キーが最後に更新されたときに割り当てられたインデックス番号。
- LockIndex -キー/値エントリで新しいロックが取得されたときに作成されたインデックス番号
- フラグ-カスタム値を設定するためにアプリで使用できます。
- 値-最大512kbのバイト配列です。
- Session -セッションオブジェクトの作成後に設定できます。
プロトコルの種類
Consulには、2種類のプロトコルがあります。
- コンセンサスプロトコルと
- ゴシッププロトコル
それらを詳細に理解しましょう。
コンセンサスプロトコル
コンセンサスプロトコルは、CAP定理で説明されている整合性を提供するためにConsulによって使用されます。 このプロトコルは、ラフトアルゴリズムに基づいています。 コンセンサスプロトコルを実装する場合、ラフトノードが常にフォロワー、候補者、またはリーダーの3つの状態のいずれかである場合、ラフトアルゴリズムが使用されます。
ゴシッププロトコル
ゴシッププロトコルを使用して、メンバーシップを管理し、クラスター全体でメッセージを送受信できます。 領事では、ゴシッププロトコルの使用は、 WAN (ワイヤレスエリアネットワーク)と LAN (ローカルエリアネットワーク)の2つの方法で行われます。 ピアツーピアネットワーク内のノードを検出するためのゴシップアルゴリズムを実装できる3つの既知のライブラリがあります-
- teknek-gossip -UDPで動作し、Javaで書かれています。
- gossip-python -TCPスタックを利用し、構築されたネットワークを介してデータを共有することもできます。
- Smudge -Goで記述され、UDPを使用してステータス情報を交換します。
ゴシッププロトコルは、分散データベースの整合性または整合性のある状態の他のタイプのデータの実現と維持、未知のサイズのネットワーク内のノード数のカウント、ニュースの堅牢な拡散、ノードの編成などにも使用されています。
リモートプロシージャコール
RPCは、リモートプロシージャコールの省略形として表すことができます。 これは、あるプログラムが別のプログラムからサービスを要求するために使用するプロトコルです。 このプロトコルは、ネットワークの詳細を確認する必要なく、ネットワーク上の別のコンピューターに配置できます。
ConsulでRPCを使用することの本当の美しさは、以前のほとんどのディスカバリーサービスツールにあった遅延の問題を回避するのに役立ちます。 RPC以前は、Consulは TCP および UDP ベースの接続のみを持っていました。これはほとんどのシステムで良好でしたが、分散システムの場合はそうではありませんでした。 RPCは、ある場所から別の場所へのパケット情報の転送時間を短縮することにより、このような問題を解決します。 この分野では、Googleのhttp://www.grpc.io/[GRPC]は、ベンチマークを観察してパフォーマンスを比較したい場合に期待できる素晴らしいツールです。