Индексирование Solr - репликация Master / Slave, как справиться с огромным индексом и большим трафиком? - PullRequest
15 голосов
/ 13 ноября 2010

В настоящее время я сталкиваюсь с проблемой с SOLR (точнее, с репликацией ведомых), и после того, как я потратил немало времени на чтение в Интернете, я чувствую, что мне нужно немного просветления.

- Имеет ли Solr некоторое ограничение по размеру для своего индекса?

Когда имеет дело с одним мастером, когда это подходящий момент, чтобы принять решение об использовании многоядерных или многоиндексных? Есть ли признаки того, что при достижении индекса определенного размера рекомендуется разбиение на разделы?

- Есть ли максимальный размер при репликации сегментов от ведущего к подчиненному?

При репликации существует ли ограничение размера сегмента, когда ведомое устройство не сможет загрузить контент и проиндексировать его? Каков порог, до которого ведомое устройство не сможет реплицироваться, когда много трафика для получения информации и много новых документов для репликации.

Чтобы быть более фактическим, вот контекст, который привел меня к этим вопросам: Мы хотим проиндексировать достаточное количество документов, но когда сумма достигает более десятка миллионов, ведомые не могут справиться с этим и начинают отказывать в репликации с ошибкой SnapPull. Документы состоят из нескольких текстовых полей (имя, тип, описание, ... около 10 других полей, скажем, не более 20 символов).

У нас есть один ведущий и 2 ведомых, которые реплицируют данные от ведущего.

Я впервые работаю с Solr (обычно я работаю над веб-приложениями с использованием Spring, Hibernate ... но не использую Solr), поэтому я не знаю, как решить эту проблему.

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

Если это так, как мы можем определить количество необходимых ядер? Прямо сейчас мы просто попытаемся посмотреть, как оно ведет себя, и откорректировать его, если это необходимо, но мне было интересно, есть ли какие-либо передовые практики или какие-либо контрольные показатели, которые были сделаны по этой конкретной теме.

Для этого количества документов с таким средним размером требуется x ядер или индексов ...

Спасибо за любую помощь, как я мог справиться с огромным количеством документов среднего размера!

Вот копия ошибки, возникающей при попытке репликации ведомого:

ERROR [org.apache.solr.handler.ReplicationHandler] - <SnapPull failed >
org.apache.solr.common.SolrException: Index fetch failed :
        at org.apache.solr.handler.SnapPuller.fetchLatestIndex(SnapPuller.java:329)
        at org.apache.solr.handler.ReplicationHandler.doFetch(ReplicationHandler.java:264)
        at org.apache.solr.handler.SnapPuller$1.run(SnapPuller.java:159)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
        at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:280)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:135)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:65)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:142)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:166)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.RuntimeException: java.io.IOException: read past EOF
        at org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1068)
        at org.apache.solr.update.DirectUpdateHandler2.commit(DirectUpdateHandler2.java:418)
        at org.apache.solr.handler.SnapPuller.doCommit(SnapPuller.java:467)
        at org.apache.solr.handler.SnapPuller.fetchLatestIndex(SnapPuller.java:319)
        ... 11 more
Caused by: java.io.IOException: read past EOF
        at org.apache.lucene.store.BufferedIndexInput.refill(BufferedIndexInput.java:151)
        at org.apache.lucene.store.BufferedIndexInput.readByte(BufferedIndexInput.java:38)
        at org.apache.lucene.store.IndexInput.readInt(IndexInput.java:70)
        at org.apache.lucene.index.SegmentInfos$2.doBody(SegmentInfos.java:410)
        at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:704)
        at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:538)
        at org.apache.lucene.index.SegmentInfos.readCurrentVersion(SegmentInfos.java:402)
        at org.apache.lucene.index.DirectoryReader.isCurrent(DirectoryReader.java:791)
        at org.apache.lucene.index.DirectoryReader.doReopen(DirectoryReader.java:404)
        at org.apache.lucene.index.DirectoryReader.reopen(DirectoryReader.java:352)
        at org.apache.solr.search.SolrIndexReader.reopen(SolrIndexReader.java:413)
        at org.apache.solr.search.SolrIndexReader.reopen(SolrIndexReader.java:424)
        at org.apache.solr.search.SolrIndexReader.reopen(SolrIndexReader.java:35)
        at org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1049)
        ... 14 more

EDIT : После ответа Маурисио библиотеки solr были обновлены до версии 1.4.1, но эта ошибка все еще возникала. Я увеличил commitReserveDuration, и даже если ошибка «Сбой SnapPull», похоже, исчезла, появилась другая, не уверенная в том, почему, так как я не могу найти много ответов в Интернете:

ERROR [org.apache.solr.servlet.SolrDispatchFilter] - <ClientAbortException:  java.io.IOException
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:370)
        at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:323)
        at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:396)
        at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:385)
        at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
        at org.apache.solr.common.util.FastOutputStream.flushBuffer(FastOutputStream.java:183)
        at org.apache.solr.common.util.JavaBinCodec.marshal(JavaBinCodec.java:89)
        at org.apache.solr.request.BinaryResponseWriter.write(BinaryResponseWriter.java:48)
        at org.apache.solr.servlet.SolrDispatchFilter.writeResponse(SolrDispatchFilter.java:322)
        at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:254)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.jstripe.tomcat.probe.Tomcat55AgentValve.invoke(Tomcat55AgentValve.java:20)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.io.IOException
        at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:703)
        at org.apache.coyote.http11.InternalAprOutputBuffer$SocketOutputBuffer.doWrite(InternalAprOutputBuffer.java:733)
        at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:124)
        at org.apache.coyote.http11.InternalAprOutputBuffer.doWrite(InternalAprOutputBuffer.java:539)
        at org.apache.coyote.Response.doWrite(Response.java:560)
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:365)
        ... 22 more
>
ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/].[SolrServer]] - <Servlet.service() for servlet SolrServer threw exception>
java.lang.IllegalStateException
        at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:405)
        at org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:362)
        at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:272)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.jstripe.tomcat.probe.Tomcat55AgentValve.invoke(Tomcat55AgentValve.java:20)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
        at java.lang.Thread.run(Thread.java:595)

Мне все еще интересно, как лучше всего обрабатывать большой индекс (более 20G), содержащий множество документов с solr. Я где-то пропускаю очевидные ссылки? Учебники, документация?

1 Ответ

15 голосов
/ 13 ноября 2010
  • Ядра - это инструмент, который в основном используется для создания разных схем в одном экземпляре Solr. Также используется в качестве указателей на палубе. Шардинг и репликация являются ортогональными вопросами.
  • Вы упомянули "много трафика". Это очень субъективная мера. Вместо этого попытайтесь определить, сколько QPS (запросов в секунду) вам нужно от Solr. Кроме того, достаточно ли одного экземпляра Solr отвечает на ваши запросы достаточно быстро? Только тогда вы сможете определить , если вам нужно масштабировать. Один экземпляр Solr может обрабатывать большой трафик, возможно, вам даже не нужно масштабировать.
  • Убедитесь, что вы запускаете Solr на сервере с большим объемом памяти (и убедитесь, что Java имеет к нему доступ). Solr очень требователен к памяти, если вы поместите его на сервер с ограниченным объемом памяти, производительность снизится.
  • Как объясняет вики Solr, используйте шардинг, если один запрос выполняется слишком долго, и репликацию, если один экземпляр Solr не может обработать трафик. «Слишком длинный» и «трафик» зависят от вашего конкретного приложения. Измерьте их.
  • Solr имеет множество настроек, влияющих на производительность: автоподогрев кэша, сохраненные поля, коэффициент слияния и т. Д. Проверьте SolrPerformanceFactors .
  • Здесь нет жестких правил. Каждое приложение имеет разные поисковые запросы. Моделируйте и измеряйте для своего конкретного сценария.
  • Об ошибке репликации, убедитесь, что вы используете 1.4.1, поскольку в 1.4.0 была ошибка с репликацией.
...