Статьи

SolrCloud: что происходит при сбое ZooKeeper?

Один из вопросов, которые я обычно задаю, — что происходит с кластером SolrCloud, когда происходит сбой ZooKeeper. Конечно, мы не говорим о сбое одного экземпляра ZooKeeper, но весь ансамбль недоступен и, следовательно, кворум отсутствует. Поскольку ответ на этот вопрос очень легко проверить, я решил сделать простую запись в блоге, чтобы показать, что происходит в случае сбоя ZooKeeper.

Тестовая среда

Тестовая среда была очень простой:

  • Одна виртуальная машина, работающая под операционной системой Linux
  • Единственный экземпляр ZooKeeper (который подойдет для нашего теста)
  • Два экземпляра Solr с одной развернутой коллекцией
  • Solr 4.6

Для создания нашей тестовой коллекции я загрузил конфигурацию в ZooKeeper и использовал следующую команду:

curl 'http://localhost:8983/solr/admin/collections?action=CREATE&name=collection1&numShards=2&replicationFactor=1'

Облачный вид примера кластера был следующим:

cloud_view

Индексирование тестовых данных

Следующим шагом в нашем тесте будет индексирование. Мы проиндексируем несколько примеров документов, которые предоставляются с Solr в каталоге exampledocs . Для индексации данных использовались следующие команды:

curl 'localhost:8983/solr/collection1/update?commit=true' --data-binary @mem.xml -H 'Content-type:application/xml'
curl 'localhost:8983/solr/collection1/update?commit=true' --data-binary @monitor.xml -H 'Content-type:application/xml'
curl 'localhost:8983/solr/collection1/update?commit=true' --data-binary @monitor2.xml -H 'Content-type:application/xml'

После выполнения вышеуказанных команд мы получаем следующее количество документов:

  • Вся коллекция содержит 5 документов
  • Осколок находится на Solr на порту 8983 хост 1 документ
  • Осколок, расположенный на Solr, работающем на порту 7983, имеет 4 документа

Запросы с ZooKeeper отсутствуют

Теперь мы переходим к следующему шагу — мы закрываем наш экземпляр ZooKeeper и пытаемся выполнить простой запрос, отправив следующую команду:

curl 'localhost:8983/solr/collection1/select?q=*:*&indent=true'

В результате мы получаем следующий ответ:

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">16</int>
  <lst name="params">
   <str name="indent">true</str>
   <str name="q">*:*</str>
  </lst>
 </lst>
<result name="response" numFound="5" start="0" maxScore="1.0">
<doc>
 <str name="id">TWINX2048-3200PRO</str> 
 <str name="name">CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail</str>
 <str name="manu">Corsair Microsystems Inc.</str>
 <str name="manu_id_s">corsair</str>
 <arr name="cat">
  <str>electronics</str>
  <str>memory</str>
 </arr>
 <arr name="features">
  <str>CAS latency 2,    2-3-3-6 timing, 2.75v, unbuffered, heat-spreader</str>
 </arr>
 <float name="price">185.0</float>
 <str name="price_c">185,USD</str>
 <int name="popularity">5</int>
 <bool name="inStock">true</bool>
 <str name="store">37.7752,-122.4232</str>
 <date name="manufacturedate_dt">2006-02-13T15:26:37Z</date>
 <str name="payloads">electronics|6.0 memory|3.0</str>
 <long name="_version_">1453219034197655552</long>
</doc>
<doc>
 <str name="id">VS1GB400C3</str>
 <str name="name">CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail</str>
 <str name="manu">Corsair Microsystems Inc.</str>
 <str name="manu_id_s">corsair</str>
 <arr name="cat">
  <str>electronics</str>
  <str>memory</str>
 </arr>
 <float name="price">74.99</float>
 <str name="price_c">74.99,USD</str>
 <int name="popularity">7</int>
 <bool name="inStock">true</bool>
 <str name="store">37.7752,-100.0232</str>
 <date name="manufacturedate_dt">2006-02-13T15:26:37Z</date>
 <str name="payloads">electronics|4.0 memory|2.0</str>
 <long name="_version_">1453219034252181504</long>
</doc>
<doc>
 <str name="id">VDBDB1A16</str>
 <str name="name">A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM</str>
 <str name="manu">A-DATA Technology Inc.</str>
 <str name="manu_id_s">corsair</str>
 <arr name="cat">
  <str>electronics</str>
  <str>memory</str>
 </arr>
 <arr name="features">
  <str>CAS latency 3,     2.7v</str>
 </arr>
 <int name="popularity">0</int>
 <bool name="inStock">true</bool>
 <str name="store">45.18414,-93.88141</str>
 <date name="manufacturedate_dt">2006-02-13T15:26:37Z</date>
 <str name="payloads">electronics|0.9 memory|0.1</str>
 <long name="_version_">1453219034255327232</long>
</doc>
<doc>
 <str name="id">3007WFP</str>
 <str name="name">Dell Widescreen UltraSharp 3007WFP</str>
 <str name="manu">Dell, Inc.</str>
 <str name="manu_id_s">dell</str>
 <arr name="cat">
  <str>electronics</str>
  <str>monitor</str>
 </arr>
 <arr name="features">
  <str>30" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast</str>
 </arr>
 <str name="includes">USB cable</str>
 <float name="weight">401.6</float>
 <float name="price">2199.0</float>
 <str name="price_c">2199,USD</str>
 <int name="popularity">6</int>
 <bool name="inStock">true</bool>
 <str name="store">43.17614,-90.57341</str>
 <long name="_version_">1453219041357332480</long>
</doc>
<doc>
 <str name="id">VA902B</str>
 <str name="name">ViewSonic VA902B - flat panel display - TFT - 19"</str>
 <str name="manu">ViewSonic Corp.</str>
 <str name="manu_id_s">viewsonic</str>
 <arr name="cat">
  <str>electronics</str>
  <str>monitor</str>
 </arr>
 <arr name="features">
  <str>19" TFT active matrix LCD, 8ms response time, 1280 x 1024 native resolution</str>
 </arr>
 <float name="weight">190.4</float>
 <float name="price">279.95</float>
 <str name="price_c">279.95,USD</str>
 <int name="popularity">6</int>
 <bool name="inStock">true</bool>
 <str name="store">45.18814,-93.88541</str>
 <long name="_version_">1453219045997281280</long></doc>
</result>
</response>

Как мы видим, Солр ответил правильно. Это связано с тем, что Solr уже кэшировал файл clusterstate.json. Для поиска Solr не нужно обновлять этот файл, поэтому поиск должен и работает, как мы могли видеть.

Индексирование с помощью Failed ZooKeeper

Не включая наш экземпляр ZooKeeper, мы пытаемся выполнить следующую команду:

curl 'localhost:8983/solr/collection1/update?commit=true' --data-binary @hd.xml -H 'Content-type:application/xml'

Приведенная выше команда должна привести к индексации содержимого файла hd.xml . После более длительного периода времени Solr отвечает следующей информацией :

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">503</int><int name="QTime">15096</int></lst><lst name="error"><str name="msg">Cannot talk to ZooKeeper - Updates are disabled.</str><int name="code">503</int></lst>
</response>

Итак, как вы можете видеть, мы не можем индексировать данные без работы ансамбля ZooKeeper .

Запуск ZooKeeper снова

Итак, давайте посмотрим, что произойдет, когда мы снова запустим наш экземпляр ZooKeeper без перезапуска узлов Solr. После запуска ZooKeeper мы пытаемся запустить ту же команду индексирования, которую мы только что сделали, еще раз:

curl 'localhost:8983/solr/collection1/update?commit=true' --data-binary @hd.xml -H 'Content-type:application/xml'

И на этот раз ответ другой:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">118</int></lst>
</response>

Как мы видим, запрос на индексирование в этот раз был успешным. Это позволяет предположить, что Solr восстановил соединение с ZooKeeper. Мы можем видеть это в логах Solr и ZooKeeper.

Краткое содержание

Как вы можете видеть, наш короткий тест позволил увидеть, что происходит в случае сбоя нашего ансамбля ZooKeeper и что мы можем ожидать от Solr в таких редких случаях. Я надеюсь, что эта запись в блоге поможет вам с некоторыми сомнениями относительно SolrCloud и его полезности.

Также помните, что во время теста состояние кластера не изменилось — все сегменты были доступны и работали. В следующей записи блога о SolrCloud мы увидим, что произойдет, если произойдет сбой осколков или реплик, когда ZooKeeeper не работает.