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

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

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

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

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

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

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

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

Это мой первый опыт работы с Solr (я обычно работаю на webapps с помощью 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

ИЗМЕНИТЬ: После ответа Маурисио библиотеки solr были обновлены до 1.4.1, но эта ошибка все еще была поднята. Я увеличил commitReserveDuration и даже если ошибка "SnapPull Failed", похоже, исчезла, другой начал подниматься, не уверен, почему, поскольку я не могу найти много ответа в Интернете:

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

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