Eu tenho cerca de 4 milhões de registros por dia e preciso manter 7 anos online, por isso estamos analisando 10,2 bilhões de registros que eu preciso pesquisar. Os usuários esperam que a pesquisa seja rápida o suficiente para uma interface do usuário, resultando em 3-5s
Devido à política fora do meu controle, não posso usar uma solução de banco de dados pronta para uso, pois significa que terei que fornecer o banco de dados a outra equipe para gerenciar (não pergunte), o que significa que perco a capacidade de otimizar hardware e software, pois eles têm um serviço único para bancos de dados e cobram (internamente) pelo GB. Tenho certeza de que vou receber comentários sugerindo que eu entendo o ponto, eu já tenho e a gerência entende que o que eles estão me pedindo para fazer é ridículo.
Eu tenho olhado para usar o Lucene como o cerne da minha solução. Armazenando os dados reais particionados por tipo e por dia em arquivos simples. Em seguida, use um documento Lucene para indexar alguns dos campos pesquisados, sendo o único campo "Armazenado" o ID do registro (para que eu possa lê-lo no arquivo simples)
Não sou exatamente informado sobre o Lucene ou os discos rígidos, mas, de acordo com o meu entendimento, haverá IO inicial / tempo de busca para pesquisar o índice; quando tiver todos os IDs de documento do Lucene, leio os documentos que terão mais IO / procurando tempo, então leio o registro real do flat flat ... Não consigo imaginar, dado o tamanho do conjunto de dados, que isso será muito rápido, com o qual estou um pouco preocupado?
O Lucene tem um tamanho máximo de documento de 2,1 bilhões por índice, por isso vou exigir várias indicações aqui.
Essa abordagem, aparentemente, parece que poderia funcionar?
Os dados que estou armazenando são dados de ação de evento. A maioria das consultas agrupa por ID do evento e obtém os últimos detalhes da ação do evento para um evento específico. Algumas das consultas analisarão eventos de conjuntos grandes e suas ações de eventos individuais.
fonte
Respostas:
Você não disse o tamanho dos dados, o tamanho dos campos individuais ou o orçamento que possui.
Independentemente do sistema de indexação que você escolher, considere jogar o hardware no problema. Você não precisa procurar nada nos discos. Indexe todos os dados, usando um esquema que é muito rápido de percorrer (talvez uma lista ou árvore classificada). Armazene o índice no disco, mas depois armazene em cache todo o índice na RAM. Você pode precisar de dezenas ou mesmo centenas de gigabytes de RAM para fazer isso.
Se os campos individuais forem grandes ou de tamanho variável, considere indexar hashes deles.
O preço para o servidor fazer isso pode ser assustador.
fonte
Ignorando todos os detalhes técnicos, esse é um problema organizacional / de gerenciamento e precisa ser resolvido pelo gerenciamento da sua organização.
Seu gerente deve estar disposto a lançar o problema no andar de cima e / ou fazer com que seus usuários aumentem o problema em um nível alto.
No seu nível, monte ou solicite uma estimativa para fazer isso com o Oracle e o hardware Oracle. Em seguida, monte uma estimativa realista para um cluster do Hadoop.
Apesar do hype, esses clusters não são baratos (você provavelmente precisa de algo como 18 nós de processador com 64 GB de memória e discos de 4 x 2 TB espalhados por três racks, depois outros 4 nós para o catálogo etc.). Não subestime ; se você vencer, terá que implementá-lo.
fonte
Então, primeiro vamos reexpor claramente o problema em termos de seus requisitos:
2.1. A capacidade de pesquisa deve retornar resultados em no máximo 3s
4.1. O sistema deve ter hardware e software otimizados para o banco de dados a ser desenvolvido.
Provavelmente, existem requisitos não funcionais adicionais, além de detalhes sobre o tamanho dos registros individuais, que são provavelmente relevantes para a sua situação.
A resposta curta é que você tem um problema de requisitos. Se você observar esses requisitos, três deles (os três primeiros) se aplicam corretamente ao sistema para definir sua função e comportamento. O último requisito não é um requisito válido de uma perspectiva purista, mas vi esses tipos de requisitos serem colocados em declarações de trabalho.
Portanto, a maneira como esse problema é resolvido é estimar o custo do quarto requisito, considerando os outros três. Depois de fazer isso, apresente isso como seu custo de solução. A gerência entrará em pânico e imediatamente perguntará por que o problema não pode ser resolvido por um preço razoável. Esse é o ponto de entrada para a sua discussão sobre o que precisa acontecer. Tenha uma alternativa acessível disponível e pronta para apresentar.
Isso contrasta com o que você está fazendo agora, que assume que os outros três não podem ser cumpridos, dado o último. A gerência não entende, porque tudo o que vêem são cifrões.
fonte
Se eu estivesse no seu lugar, começaria com uma implementação bastante razoável, usando apenas um RDBMS regular, incorporado ao aplicativo, para que eles não sintam que precisam dar suporte a alguma coisa. O SQLite, H2 ou qualquer banco de dados incorporado alternativo deve fazer: Sem arquivos simples, sem índices exóticos, sem nada: apenas uma aplicação direta de práticas padrão para resolver o problema em questão, desconsiderando a imensidão dos dados. (Obviamente, eu escolheria um número inteiro grande o suficiente como chave, e isso é tudo, basicamente.)
Enquanto trabalhava nisso, provavelmente me ocorreria mais algumas idéias, sobre como fazê-lo funcionar mais rápido sem recorrer a nada exótico.
Então, eu testaria isso para ver como ele funciona e demonstraria os resultados, juntamente com a solução de trabalho, para os "poderes do ser" em sua organização.
Há uma chance de que sua implementação direta seja executada dentro das restrições necessárias; portanto, você estará bem, sem necessidade de fazer mais nada, sem desperdício de recursos.
Se o desempenho da implementação direta estiver fora, mas não muito longe, das restrições necessárias, os "poderes do ser" podem dizer "bem, isso é próximo o suficiente, não queremos fazer mais nada sobre isso, então é assim que será. " Novamente, nenhum recurso foi desperdiçado.
Se o desempenho da implementação direta estiver fora, mas dentro da mesma ordem de magnitude, das restrições necessárias, eu diria a eles para comprarem hardware melhor, maior e mais rápido. O mais provável é que eles façam isso e o caso seja encerrado.
Se eles não quiserem comprar hardware melhor, maior e mais rápido, recomendo que eles repensem seu requisito de não usar um RDBMS grande e escalável. Se eles são razoáveis, e você demonstrou que também é razoável, é provável que eles repensem isso.
Se os poderes do ser não querem seguir nenhuma das vias razoáveis e, em vez disso, querem que você faça o papel de mágico, então, e só então, eu começaria a me preocupar com soluções exóticas. Muitas chances são de que as coisas não chegarão a esse ponto. Mas, mesmo se o fizerem, a quantidade de trabalho que você terá realizado em vão até esse momento será relativamente pequena e valerá a pena a aposta de que seja suficiente.
fonte
Pensando no front end ...
Se você separar seus tipos de pesquisa na interface do usuário, poderá ter restrições mais razoáveis.
Parece que um tipo de pesquisa são dados recentes de ação de evento em um evento, o que permite isolar o tempo na pesquisa de dados. Talvez isso ofereça um conjunto de dados muito menor, com a provável expectativa de que um usuário seja recuperado em breve.
Outros tipos de pesquisa, nos quais é necessário realizar grandes pesquisas em conjuntos de dados ou em períodos antigos, podem receber uma interface do usuário diferente (ou várias UIs), com um bom botão para indicar ... pensando agora. Como isso pode ser entendido pelo usuário como um conjunto de requisitos mais trabalhoso, pode-se esperar razoavelmente paciência. E, claro, realisticamente necessário.
Não sei se você tem alguma capacidade de impactar o design de tendência, mas se você pode transmitir as restrições com as quais está trabalhando, espero que aqueles que lidam com a interação do usuário respondam com compreensão (pelo menos alguns).
fonte