我正在评估 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"' 返回我的 'Node 1' 'Node 0' 所以我假设 'get' 请求将首先发送到节点 1;
- 崩溃节点 1;
- 获取密钥“1”。我看到一些与连接丢失有关的错误,但最终它返回了正确的值;
- 启动节点 1;
- 获取密钥“1”。它说节点 1 可用,但返回“null”而不是值。所以我假设节点 1 没有从节点 0 获取数据,并且由于我的 required-reads = 1 它不要求节点 0 并返回 null。
- 崩溃节点 0;
- 密钥“1”永远丢失,因为它没有复制到节点 1。
我非常确定我误解了配置或集群复制详细信息中的某些内容。您能否解释一下为什么恢复后数据不会从节点 0 复制回节点 1?复制是客户的责任,而不是服务器的责任,我说得对吗?如果是这样,节点恢复后应该如何复制数据?
提前致谢。