У меня была аналогичная проблема, когда мне пришлось сделать копию из производства в нашу среду контроля качества. Мы столкнулись с двумя проблемами:
- Брандмауэр, блокирующий весь http(s) трафик между QA и производством
- Снимки невозможны из-за интенсивной записи и тайм-аута установки Zookeeper.
Поэтому я создал решение, просто извлекая все документы на производственном сервере с помощью обработчика select и выгружая их в файл xml, копируя файлы на сервер QA, а затем помещая их в место, где их можно было бы забрать при импорте. Чтобы заставить это работать, у меня ушло слишком много времени, что было связано как с моим недостатком знаний о SOLR, так и с тем, что большинство примеров в Интернете неверны, и все просто копируют друг друга. Поэтому я делюсь своим решением здесь.
Мой скрипт для сброса документов:
#!/bin/bash
SOURCE_SOLR_HOST='your.source.host'
SOLR_CHUNK_SIZE=10000
DUMP_DIR='/tmp/'
indexesfile='solr-indexes.txt'
for index in `cat $indexesfile`; do
solrurl="http://${SOURCE_SOLR_HOST}:8983/solr/$index/select?indent=on&q=*:*&wt=xml"
curl "${solrurl}&rows=10" -o /tmp/$index.xml
numfound=`grep -i numfound /tmp/$index.xml | sed -e 's/.*numFound=\"\([0-9]*\)\".*/\1/'`
chunks=$(expr $numfound / $SOLR_CHUNK_SIZE )
for chunk in $( eval echo {0..$chunks}); do
start_at=$(expr $chunk \* $SOLR_CHUNK_SIZE )
curl "${solrurl}&rows=${SOLR_CHUNK_SIZE}&start=${start_at}" -o ${DUMP_DIR}solr/${index}_${chunk}.xml
done
rm /tmp/$index.xml
done
Он читает индексы для дампа из файла solr-indexes.txt, поэтому вы можете определить там все индексы.
Во время одного из моих поисков я остановился на этом вопросе, и ответы здесь немного помогли мне с импортом, но не полностью. Видите ли, примеры Duvo и Segfaulter не работают, если вы скопируете их в SOLR. Например, тег requestHandler игнорируется SOLR, если вы не используете правильный регистр.
Это правильный формат того, что я добавил в solrconfig:
<lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-7.5.0.jar" />
<lib dir="${solr.install.dir:../../../..}/dist" regex="solr-dataimporthandler-extras-7.5.0.jar" />
<requestHandler class="org.apache.solr.handler.dataimport.DataImportHandler" name="/dataimport">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
Для data-config.xml я использовал что-то похожее на это:
<dataConfig>
<dataSource type="FileDataSource" />
<document>
<entity
name="yourindexhere"
processor="FileListEntityProcessor"
baseDir="/solr-import/"
fileName="yourindexhere_.*"
preImportDeleteQuery="*:*"
recursive="false"
rootEntity="false"
dataSource="null">
<entity
name="file"
processor="XPathEntityProcessor"
url="${yourindexhere.fileAbsolutePath}"
xsl="xslt/updateXml.xsl"
useSolrAddSchema="true"
stream="true">
</entity>
</entity>
</document>
</dataConfig>
Я скопировал все дампы в каталог /solr-import/ и применил приведенные выше настройки ко всем без исключения конфигурациям индексов. Через пользовательский интерфейс я инициировал полный импорт, но вы также можете запустить его с помощью запроса на импорт данных.
Преобразование xsl выполняется файлом updateXml.xsl по умолчанию, поэтому он распознает вывод дампа, созданный SOLR, и автоматически преобразует его в схему индекса. По крайней мере, если схема между производством и контролем качества одинакова. ;)
Также FileListEntityProcessor использует регулярное выражение, чтобы иметь возможность принимать несколько файлов. Это было необходимо, так как некоторые из наших индексов содержат миллионы элементов, и если вы попытаетесь преобразовать их все сразу, процесс Java быстро исчерпает память. Поэтому я разделил их на 10000 строк в файле, что, как я обнаружил, обеспечивает наилучшую производительность.
person
Art van Scheppingen
schedule
05.03.2019
solr start -s CORELOC
, которое должно это сделать. Это для версии 5.+. Ниже никогда не использовал. Так что не в курсе. - person darthsidious   schedule 12.05.2016