Estamos pensando em desenvolver uma ferramenta para capturar e analisar dados de fluxo de rede, dos quais coletamos enormes quantidades de. A cada dia, capturamos cerca de 1,4 bilhão de registros de fluxo, com a seguinte aparência no formato json:
{
"tcp_flags": "0",
"src_as": "54321",
"nexthop": "1.2.3.4",
"unix_secs": "1352234521",
"src_mask": "23",
"tos": "0",
"prot": "6",
"input": "105",
"doctets": "186",
"engine_type": "0",
"exaddr": "2.3.4.5",
"engine_id": "2",
"srcaddr": "9.8.7.6",
"dst_as": "12345",
"unix_nsecs": "752265174",
"sysuptime": "2943529544",
"dst_mask": "24",
"dstport": "80",
"last": "2943523241",
"srcport": "52672",
"dpkts": "4",
"output": "111",
"dstaddr": "6.5.4.3",
"first": "2943517993"
}
Gostaríamos de poder fazer pesquisas rápidas (menos de 10 segundos) no conjunto de dados, provavelmente em períodos de tempo mais estreitos (intervalos de 10 a 30 m). Também queremos indexar a maioria dos pontos de dados para que possamos fazer pesquisas rapidamente em cada um deles. Também gostaríamos de ter uma visualização atualizada dos dados quando as pesquisas são executadas. Seria ótimo permanecer no mundo do código aberto, mas não nos opomos a procurar soluções proprietárias para este projeto.
A idéia é manter aproximadamente um mês de dados, o que equivaleria a 43,2 bilhões de registros. Uma estimativa aproximada de que cada registro conteria cerca de 480 bytes de dados, equivaleria a ~ 18,7 terabytes de dados em um mês, e talvez três vezes isso com índices. Eventualmente, gostaríamos de aumentar a capacidade desse sistema para armazenar trilhões de registros.
Avaliamos (basicamente) o couchbase, cassandra e mongodb na medida do possível candidato a esse projeto, no entanto, cada um propõe seus próprios desafios. Com o couchbase, a indexação é feita em intervalos e não durante a inserção dos dados, para que as visualizações não estejam atualizadas, os índices secundários do cassandra não são muito eficientes no retorno de resultados, pois normalmente exigem a varredura de todo o cluster em busca de resultados, e o mongodb parece promissor, mas parece ser muito mais difícil de escalar, pois é mestre / escravo / fragmentado. Alguns outros candidatos que planejamos avaliar são elasticsearch, mysql (não tenho certeza se isso é aplicável) e alguns bancos de dados relacionais orientados a colunas. Qualquer sugestão ou experiência do mundo real seria apreciada.
Respostas:
Em uma empresa em que trabalho, estamos lidando com uma quantidade semelhante de dados (cerca de 10 TB de dados pesquisáveis em tempo real). Resolvemos isso com Cassandra e eu gostaria de mencionar algumas idéias que permitirão que você faça a pesquisa O (1) em um banco de dados com várias TBs. Porém, isso não é específico para o Cassandra db, você pode usá-lo com outros db também.
Teoria
Prática
Não trabalho para a Amazon e não tenho relações com as equipes HAProxy e Ubuntu. Esta é uma opinião pessoal e não qualquer tipo de promoção.
fonte
O(1) search <=> unbounded storage space <=> unlimited supply of cash
Se eu fosse colocar isso no SQL Server, sugeriria uma tabela como:
Isso resulta em um requisito de armazenamento total estimado para a tabela única, sem índices adicionais de 5,5 TB para 43,2 registros de abelha (o seu requisito especificado). Isso é calculado como 130 bytes para os próprios dados, mais 7 bytes por linha de sobrecarga, mais 96 bytes por página de sobrecarga. O SQL Server armazena dados em páginas de 8 KB, permitindo 59 linhas por página. Isso equivale a 732.203.390 páginas para um único mês de dados.
O SQL Server gosta de gravar no disco em blocos de 8 páginas (64 KB), o que equivale a 472 linhas por E / S física. Com 16.203 registros de fluxo sendo gerados a cada segundo, você precisará de uma taxa de E / S mínima de 34 IOps, garantida a cada segundo. Embora isso por si só não seja uma quantidade enorme, outras E / S no sistema (SQL Server e outras) precisam nunca infringir essa taxa necessária de IOps. Portanto, você precisaria projetar um sistema capaz de, pelo menos, mais IOps de ordem de magnitude ou 340 IOps sustentadas - eu tenderia a estimar que você precisa de 2 ordens de magnitude de IOps mais sustentáveis para garantir o rendimento.
Você notará que não estou armazenando os endereços IP em sua forma decimal pontilhada. Isso economiza uma quantidade enorme de armazenamento (7 bytes por endereço) e também torna a indexação, recuperação, classificação e comparação de endereços IP muito mais eficientes. A desvantagem aqui é que você precisa converter os IPs decimais pontilhados em números inteiros de 8 bytes antes de armazená-los e voltar para IPs decimais pontilhados para exibição. O código para fazer isso é trivial; no entanto, sua taxa de linhas adicionará uma quantidade substancial de sobrecarga de processamento a cada linha de fluxo sendo processada - convém fazer esse processo de conversão em uma máquina fisicamente diferente do SQL Server.
Discutir os índices necessários é um assunto totalmente separado, pois você não listou nenhum requisito específico. O design desta tabela armazenará as linhas de fluxo na ordem física em que são recebidas pelo SQL Server, o
tcp_traffic_id
campo é exclusivo para cada registro e permite classificar as linhas pela ordem em que foram gravadas (neste caso, provavelmente relacionando um a um) para a hora do evento de fluxo).fonte
binary(4)
oubinary(16)
, respectivamente. 4 bytes / linha adiciona muito armazenamento quando multiplicado por 1.000.000.000.000.000.SMALLINT
mas também deve haver uma rotina de conversão.Eu recomendaria HBase . Você pode armazenar todos os dados brutos em uma ou mais tabelas HBase, dependendo do que você precisa consultar. O HBase pode lidar com grandes conjuntos de dados e faz o compartilhamento automático através de divisões de região.
Além disso, se você projetar bem as chaves de linha, poderá obter consultas extremamente rápidas, inclusive O (1). Observe que, se você estiver recuperando um grande conjunto de dados, isso ainda será lento, pois a recuperação de dados é uma operação O (n).
Como você deseja consultar em cada campo, eu recomendaria a criação de uma tabela exclusiva para cada um deles. Exemplo para os dados src_address, tenha uma tabela parecida com esta:
Portanto, se você deseja consultar todos os dados no 1.2.3.4, iniciando de 27 de março às 00:00 e 27 de março às 12:01, pode fazer uma varredura de intervalo com as linhas de início e parada especificadas.
IMHO, o design da chave de linha é a parte mais crítica do uso do HBase - se você o projetar bem, poderá fazer consultas rápidas E armazenar grandes volumes de dados.
fonte
Disse isto :
Sugiro considerar o banco de dados IBM Informix + DataSeries TimeSeries . Ao contrário do que algumas pessoas dizem, o Informix está vivo e indo muito bem. A última versão foi lançada no mês passado (março / 2013, versão 12.10).
O TimeSeries é como um "plugin" (gratuito) capaz de lidar com situações como a sua.
E você pode usá-lo em produção com a versão gratuita do banco de dados Informix ( edição Innovator-C ). (claro, apenas para avaliar as partes técnicas, pois a versão gratuita possui muitos recursos limitados)
Aqui você pode verificar um PDF de referência que pode ser usado como referência. Aqui estão duas apresentações com exemplos mais técnicos: guia de manequins e outras dicas
Como não tenho experiência pessoal com o TimeSeries , não posso concordar que seja "a solução", apenas uma sugestão para avaliar.
fonte
Segundo a recomendação de examinar o Informix TimeSeries. A literatura da IBM afirma que o TimeSeries pode armazenar esse tipo de informação em 1/5 do espaço e executar 5 vezes mais rápido que as tabelas relacionais tradicionais.
Benefícios adicionais seriam a Interface da Tabela Virtual que pode fazer com que os dados do TimeSeries apareçam como tabelas relacionais tradicionais para o usuário final (simplificando o desenvolvimento de aplicativos enquanto ainda obtém os benefícios do TimeSeries), HA simples com nós HDR que agora suportam dados do TimeSeries na versão 12.1 e integração de dados do TimeSeries no Informix Warehouse Accelerator que pode ser usado para acelerar relatórios complicados de data warehouse e a capacidade de criar um protótipo de uma solução TimeSeries no Informix usando as edições gratuitas Informix Developer ou Innovator-C.
fonte