Я оцениваю Волдеморта и столкнулся с некоторыми непонятными вещами, связанными с репликацией и отработкой отказа. Я попытался создать простую конфигурацию кластера с двумя узлами, где каждый узел является резервной копией для другого. Таким образом, данные, записанные в узел 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';
- Введите значение ключа "1", "a";
- Выполнить preflist «1», который возвращает мне «Node 1», «Node 0», поэтому я предполагаю, что запрос «get» будет сначала отправлен на Node 1;
- Crash Node 1;
- Получить ключ "1". Я вижу некоторые ошибки, связанные с потерей соединения, но в итоге он возвращает мне правильное значение;
- Начальный узел 1;
- Получить ключ "1". Он говорит, что узел 1 доступен, но возвращает значение «ноль» вместо значения. Поэтому я предполагаю, что Узел 1 не получил данные от Узла 0, и так как мой required-reads = 1, он не запрашивает Узел 0 и возвращает меня ноль.
- Crash Node 0;
- Ключ "1" потерян навсегда, потому что он не был реплицирован на Узел 1.
Я более чем уверен, что что-то неправильно понял в деталях конфигурации или репликации кластера. Не могли бы вы уточнить, почему данные не реплицируются обратно с узла 0 на узел 1 после восстановления? И прав ли я, что репликация - это ответственность клиента, а не сервера? Если да, то как должны реплицироваться данные после восстановления узла?
Заранее спасибо.