1

私は 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 に複製されない理由を明確にしていただけますか? そして、レプリケーションはサーバーではなくクライアントの責任であるというのは正しいですか? その場合、ノードの復旧後にデータをどのようにレプリケートする必要がありますか?

前もって感謝します。

4

1 に答える 1

0

あなたがすでに問題を解決しているかどうかはわかりませんが、次をご覧ください: http://code.google.com/p/project-voldemort/issues/detail?id=246

メモリ ストアはテスト (junit) のみを目的としているため、readonly または bdb ストアを使用する必要があります。

于 2012-03-08T20:42:28.507 に答える