Тайм-аут чтения в solrcloud
Мы используем Solrcloud 6.3. У нас есть коллекция сказать "MyCore". Он разделен на две части и две копии. Каждый шард находится на одном сервере.
Технические характеристики: размер индекса 4 ГБ, размер кучи 2 ГБ, общий объем памяти на компьютере: 40 ГБ, количество процессоров: 32.
Наша работа по индексированию выполняется раз в минуту, и мы используем Zookeeper для добавления документов в solr. Вот конфигурация фиксации из solrconfig.xml
<updateHandler class="solr.DirectUpdateHandler2">
<maxPendingDeletes>100000</maxPendingDeletes>
<updateLog>
<int name="numRecordsToKeep">200</int>
<int name="maxNumLogsToKeep">5</int>
</updateLog>
<autoCommit>
<maxDocs>500</maxDocs>
<maxTime>120000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
<autoSoftCommit>
<maxDocs>300</maxDocs>
<maxTime>60000</maxTime>
</autoSoftCommit>
Мы видим исключения тайм-аута чтения в журналах solr, и в это время solr перестает отвечать на запросы, например, на 30 секунд, а через 30 секунд он запускается автоматически без перезапуска. Просто хочу упомянуть здесь, что мы проанализировали журналы GC и ничего необычного не найдено. GC активность здорова. Прикрепление логов.
2017-11-06 07:05:00.121 ERROR (updateExecutor-2-thread-624-processing-n:192.168.0.1:8983_solr x:MyCore_shard2_replica1 s:shard2 c:MyCore r:core_node3) [c:MyCore s:shard2 r:core_node3 x:MyCore_shard2_replica1] o.a.s.u.SolrCmdDistributor org.apache.solr.client.solrj.SolrServerException: Timeout occured while waiting response from server at: http://192.168.0.4:8983/solr/MyCore_shard1_replica3
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:604)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:262)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:251)
at org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient.request(ConcurrentUpdateSolrClient.java:420)
at org.apache.solr.client.solrj.SolrClient.request(SolrClient.java:1219)
at org.apache.solr.update.SolrCmdDistributor.doRequest(SolrCmdDistributor.java:293)
at org.apache.solr.update.SolrCmdDistributor.lambda$submit$0(SolrCmdDistributor.java:282)
at org.apache.solr.update.SolrCmdDistributor$$Lambda$119/389184320.call(Unknown Source)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:229)
at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor$$Lambda$8/534303375.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:273)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:197)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:685)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:487)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:498)
... 15 more
1 ответ
Как часто происходят эти тайм-ауты? И когда они это делают, это точно 30 секунд, что истекло время?
Это может иметь какое-то отношение к тому, что ваши мягкие / жесткие коммиты так долго. Solr не должен ждать полной фиксации, но иногда это происходит, даже когда он не загружен.
В зависимости от того, как быстро вы индексируете данные в Zk, я бы попробовал что-то более мягкое, 30-е и 60-е. Если ваша индексная нагрузка очень высока, возможно, увеличьте вашу до более высоких времен.
Вот интересный документ, который я посмотрел, когда впервые установил время мягкого / жесткого коммита, и у меня не было проблем. Раздел Рекомендации ссылается на несколько нагрузок / настроек.
Удачи!