Репликация Волдеморта и детали аварийного переключения - PullRequest
1 голос
/ 14 декабря 2011

Я оцениваю Волдеморта и столкнулся с некоторыми непонятными вещами, связанными с репликацией и отработкой отказа. Я попытался создать простую конфигурацию кластера с двумя узлами, где каждый узел является резервной копией для другого. Таким образом, данные, записанные в узел 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 после восстановления? И прав ли я, что репликация - это ответственность клиента, а не сервера? Если да, то как должны реплицироваться данные после восстановления узла?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 марта 2012

Я не знаю, если вы уже решили проблему, но посмотрите: http://code.google.com/p/project-voldemort/issues/detail?id=246

Помните, что хранилище памяти предназначено только для целей тестирования (junit), вам следует использоватьтолько для чтения или в магазинах bdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...