Voldemort复制和故障转移详细信息

时间:2011-12-14 11:56:28

标签: replication failover voldemort

我正在评估Voldemort,并遇到了一些与复制和故障转移相关的令人困惑的事情。我尝试制作一个简单的2节点集群配置,其中每个节点都是另一个节点的备份。因此,写入节点1的数据应该复制到节点2,反之亦然。在节点1故障转移的情况下,第二节点应该为客户端请求提供服务。在节点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';
  • 通过shell连接群集
  • 将键值“1”设为“a”;
  • 执行'preflist“1”'返回'节点1''节点0'所以我假设'get'请求将首先发送到节点1;
  • 崩溃节点1;
  • 获取密钥“1”。我看到一些与连接丢失有关的错误,但最终它返回了正确的值;
  • 启动节点1;
  • 获取密钥“1”。它说节点1可用,但返回'null'而不是值。所以我假设节点1没有从节点0获取数据,因为我的required-reads = 1它不会要求节点0并返回null。
  • 崩溃节点0;
  • 密钥“1”永远丢失,因为它未复制到节点1。

我更确信我误解了配置或群集复制细节方面的内容。您能否澄清为什么恢复后数据不会从节点0复制回节点1?我是对的,复制是客户的责任,而不是服务器?如果是这样,节点恢复后如何复制数据?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不知道你是否已经解决了这个问题,但请看一下:http://code.google.com/p/project-voldemort/issues/detail?id=246

请记住,内存存储仅用于测试(junit)目的,您应该使用readonly或bdb存储。