Confirma e Pesquisa NRT no SolrCloud
1. Visão geral
O Solr é uma das soluções de pesquisa baseadas no Lucene mais populares. É rápido, distribuído, robusto, flexível e tem uma comunidade de desenvolvedores ativa por trás dele. SolrCloud is the new, distributed version of Solr.
One of its key features here is the near real-time (NRT) search, ou seja, documentos disponíveis para pesquisa comosoon conforme são indexados.
2. Indexando em SolrCloud
Uma coleção no Solr é composta de vários shards, e cada shard possui várias réplicas. Uma das réplicas de um shard é selecionada como líder desse shard quando uma coleção é criada:
-
Quando um cliente tenta indexar um documento, primeiro é atribuído ao documento um fragmento com base no hash deid do documento
-
O cliente obtém a URL do líder desse fragmento do tratador e, finalmente, a solicitação de índice é feita para essa URL
-
O líder do shard indexa o documento localmente antes de enviá-lo para réplicas
-
Depois que o líder recebe uma confirmação de todas as réplicas ativas e em recuperação, ele retorna a confirmação para o aplicativo cliente de indexação
When we index a document in Solr, it doesn’t go to the index directly. It’s written in what is called a tlog (transaction log). Solr usa o log de transações para garantir que os documentos não sejam perdidos antes de serem confirmados, no caso de uma falha do sistema.
Se o sistema travar antes que os documentos no log de transações sejam confirmados, ou seja, persistidos no disco, o log de transações será repetido quando o sistema voltar a funcionar, levando à perda zero de documentos.
Cada solicitação de índice / atualização é registrada no log de transações, que continua a crescer até emitir um commit.
3. Commits em SolrCloud
Uma operaçãocommit significa finalizar uma mudança e persistir essa mudança no disco. O SolrCloud fornece dois tipos de operações de confirmação viz. uma confirmação e uma confirmação suave.
3.1. Commit (Hard Commit)
Uma confirmação ou confirmação definitiva é aquela em que o Solr libera todos os documentos não confirmados em um log de transações para o disco. The active transaction log is processed, and then a new transaction log file is opened.
Ele também atualiza um componente chamado pesquisador, para que os documentos recém-confirmados fiquem disponíveis para pesquisa. Um pesquisador pode ser considerado como uma exibição somente leitura de todos os documentos confirmados no índice.
A operação de confirmação pode ser feita exclusivamente pelo cliente chamando a APIcommit:
String zkHostString = "zkServer1:2181,zkServer2:2181,zkServer3:2181/solr";
SolrClient solr = new CloudSolrClient.Builder()
.withZkHost(zkHostString)
.build();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "123abc");
doc1.addField("date", "14/10/2017");
doc1.addField("book", "To kill a mockingbird");
doc1.addField("author", "Harper Lee");
solr.add(doc1);
solr.commit();
Da mesma forma, pode ser automatizado comoautoCommit especificando-o no arquivosolrconfig.xml, consulte a seção 3.4.
3.2. SoftCommit
O Softcommit foi adicionado a partir do Solr 4 em diante, principalmente para oferecer suporte ao recurso NRT do SolrCloud. É um mecanismo para tornar os documentos pesquisáveis quase em tempo real, ignorando os aspectos dispendiosos dos hard commits.
During a softcommit, the transaction log is not truncated, it continues to grow. However, a new searcher is opened, o que torna os documentos desde o último softcommit visíveis para pesquisa. Além disso, alguns dos caches de nível superior no Solr são invalidados, portanto, não é uma operação totalmente gratuita.
Quando especificamosmaxTime para softcommit como 1000, isso significa que o documento estará disponível nas consultas em no máximo 1 segundo a partir do momento em que foi indexado.
Esse recurso concede ao SolrCloud o poder da pesquisa quase em tempo real, pois novos documentos podem ser pesquisados mesmo sem serem confirmados. Softcommit pode ser disparado apenas comoautoSoftCommit especificando-o no arquivo solrconfig.xml, consulte a seção 3.4.
3.3. Autocommit e Autosoftcommit
O arquivosolrconfig.xml é um dos arquivos de configuração mais importantes no SolrCloud. É gerado no momento da criação da coleção. Para habilitarautoCommit ouautoSoftCommit, precisamos atualizar as seguintes seções no arquivo:
10000
30000
true
6000
1000
maxTime: O número de milissegundos desde a primeira atualização não confirmada após a qual o próximo commit / softcommit deve acontecer.
maxDocs: O número de atualizações que ocorreram desde o último commit e após o qual o próximo commit / softcommit deve acontecer.
openSearcher: Esta propriedade diz ao Solr se deve abrir um novo buscador após uma operação de confirmação ou não. If it’s true, after a commit, the old searcher is closed, and a new searcher is opened, making the committed document visible for searching, se forfalse, o documento não estará disponível para pesquisa após a confirmação.
4. Pesquisa quase em tempo real
A pesquisa quase em tempo real é alcançada no Solr usando uma combinação de confirmação e confirmação automática. Como mencionado anteriormente, quando um documento é adicionado ao Solr, ele não fica visível nos resultados de pesquisa até que seja confirmado no índice.
As confirmações normais são caras, e é por isso que as confirmações são úteis. Mas, como o softcommit não persiste os documentos, precisamos definir o intervalo de autocommitmaxTime (oumaxDocs) para um valor razoável, dependendo da carga que estamos esperando.
4.1. Gets em tempo real
Há outro recurso fornecido pelo Solr que é de fato em tempo real - a APIget. The get API can return us a document that is not even soft committed yet.
Ele pesquisa diretamente nos logs de transações se o documento não for encontrado no índice. Portanto, podemos disparar uma chamada de APIget, imediatamente após o retorno da chamada de índice e ainda seremos capazes de recuperar o documento.
No entanto, como todas as coisas boas demais, há um problema aqui. We need to pass the id of the document in the get API call. Claro, podemos fornecer outras consultas de filtro junto comid, mas semid, a chamada não funciona:
http://localhost:8985/solr/myCollection/get?id=1234&fq=name:example
5. Conclusão
O Solr nos oferece um pouco de flexibilidade em relação ao ajuste da capacidade da NRT. Para obter o melhor desempenho do servidor, precisamos experimentar os valores de confirmações e confirmações simples, com base em nosso caso de uso e carga esperada.
We shouldn’t keep our commit interval too long, or else our transaction log will grow to a considerable size. Porém, não devemos executar nossos softcommits com muita frequência.
Também é recomendável fazer um teste de desempenho adequado do nosso sistema antes de iniciarmos a produção. Devemos verificar se os documentos estão se tornando pesquisáveis dentro do intervalo de tempo desejado.