私は Voldemort を評価していて、レプリケーションとフェイルオーバーに関連するいくつかの紛らわしいものに遭遇しました。各ノードが別のノードのバックアップである単純な 2 ノード クラスター構成を作成しようとしました。そのため、ノード 1 に書き込まれたデータはノード 2 にレプリケートする必要があり、その逆も同様です。ノード 1 のフェイルオーバーの場合、2 番目のノードがクライアントの要求を処理する必要があります。ノード 1 の復元後、データはノード 1 に転送されます。これは非常に一般的で明確なケースだと思います。というわけで以下の構成にしました。
<cluster>
<name>perf_cluster</name>
<server>
<id>0</id>
<host>10.50.3.156</host>
<http-port>8081</http-port>
<socket-port>6666</socket-port>
<admin-port>6667</admin-port>
<partitions>0, 1, 2, 3</partitions>
<zone-id>0</zone-id>
</server>
<server>
<id>1</id>
<host>10.50.3.157</host>
<http-port>8081</http-port>
<socket-port>6666</socket-port>
<admin-port>6667</admin-port>
<partitions>4, 5, 6, 7</partitions>
<zone-id>0</zone-id>
</server>
</cluster>
<stores>
<store>
<name>perftest</name>
<persistence>memory</persistence>
<description>Performance Test store</description>
<owners>owner</owners>
<routing>client</routing>
<replication-factor>2</replication-factor>
<required-reads>1</required-reads>
<required-writes>1</required-writes>
<key-serializer>
<type>string</type>
</key-serializer>
<value-serializer>
<type>java-serialization</type>
</value-serializer>
</store>
</stores>
次のテストを実行します。
- 両方のノードを開始します。
- 「bin/voldemort-shell.sh perftest tcp://10.50.3.156:6666」を使用して、シェル経由でクラスターに接続します。
- Key-Value「1」「a」を入力します。
- 「ノード 1」「ノード 0」を返す「preflist "1"」を実行するので、「get」リクエストが最初にノード 1 に送信されると想定します。
- ノード 1 をクラッシュさせます。
- キー「1」を取得します。接続の切断に関連するエラーがいくつか表示されますが、最終的には正しい値が返されます。
- ノード 1 を開始します。
- キー「1」を取得します。ノード 1 が使用可能であると表示されますが、値の代わりに「null」が返されます。したがって、ノード 1 はノード 0 からデータを取得していないと仮定します。required-reads = 1 であるため、ノード 0 を要求せず、null を返します。
- ノード 0 をクラッシュさせます。
- キー「1」は、ノード1に複製されなかったため、永久に失われます。
構成またはクラスター複製の詳細で何かを誤解していると確信しています。復旧後にデータがノード 0 からノード 1 に複製されない理由を明確にしていただけますか? そして、レプリケーションはサーバーではなくクライアントの責任であるというのは正しいですか? その場合、ノードの復旧後にデータをどのようにレプリケートする必要がありますか?
前もって感謝します。