Estamos procurando desenvolver uma ferramenta para capturar e analisar dados de fluxo de rede, dos quais coletamos uma quantidade enorme. A cada dia, capturamos cerca de 1,4 bilhão de registros de fluxo que ficariam assim 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 fatias estreitas de tempo (intervalos de 10 a 30 minutos). Também queremos indexar a maioria dos pontos de dados para que possamos fazer pesquisas em cada um deles rapidamente. Também gostaríamos de ter uma visã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 buscar soluções proprietárias para este projeto.
A ideia é manter aproximadamente um mês de dados, o que seria ~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 de armazenar trilhões de registros.
Nós avaliamos (basicamente) o couchbase, o cassandra e o mongodb como possíveis candidatos para este projeto, porém 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, portanto as visualizações não estão atualizadas, os índices secundários do cassandra não são muito eficientes em retornar resultados, pois normalmente exigem a varredura de todo o cluster para obter resultados, e o mongodb parece promissor, mas parece ser muito mais difícil de dimensionar, pois é master/slave/sharded. 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.
In a company I work for we are dealing with similar amount of data (around 10 TBs of realtime searchable data). We solve this with Cassandra and I would like to mention couple of ideas that will allow you to do O(1) search on a multi TBs database. This is not specific to Cassandra db though, you can use it with other db as well.
Theory
Practice
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.
Se eu fosse colocar isso no SQL Server, sugeriria uma tabela algo como:
This results in a total estimated storage requirement for the single table, with no further indexes of 5.5 TB for 43.2 beeellion records (your specified requirement). This is calculated as 130 bytes for the data itself, plus 7 bytes per row of overhead, plus 96 bytes per page of overhead. SQL Server stores data in 8KB pages, allowing for 59 rows per page. This equates to 732,203,390 pages for a single month of data.
SQL Server likes writing to disk in 8-page chunks (64KB), which equates to 472 rows per physical I/O. With 16,203 flow records being generated every second, you will need a minimum I/O rate of 34 IOps, guaranteed each and every second. Although this by itself is not a huge amount, other I/O in the system (SQL Server and otherwise) needs to never infringe on this necessary rate of IOps. Therefore you'd need to design a system capable of at least an order-of-magnitude more IOps, or 340 sustained IOps - I would tend to estimate that you need 2 orders of magnitude more sustainable IOps to guarantee throughput.
You will notice I am not storing the IP addresses in their dotted-decimal form. This saves a huge amount on storage (7 bytes per address), and also makes indexing, retrieval, sorting, and comparing IP addresses far, far more efficient. The downside here is you need to convert the dotted-decimal IPs into 8-byte integers before storing them, and back to dotted-decimal IPs for display. The code to do so is trivial, however your row-rate this will add a substantial amount of processing overhead to each flow row being processed - you may want to do this conversion process on a physically different machine from SQL Server.
Discussing the indexes you require is a totally separate matter since you have not listed any specific requirements. The design of this table will store flow rows in the physical order they are received by SQL Server, the
tcp_traffic_id
field is unique for each record, and allows sorting rows by the order they were recorded (in this case most likely relating one-to-one to the time of the flow event).Eu recomendaria o 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 a fragmentação automática por meio de divisões de região.
Além disso, se você projetar bem as chaves de linha, poderá obter consultas extremamente rápidas, até mesmo 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, recomendo criar uma tabela exclusiva para cada um deles. Exemplo para os dados src_address, tenha uma tabela assim:
Portanto, se você deseja consultar todos os dados em 1.2.3.4, começando de 27 de março às 00h00 até 27 de março às 00h01, você pode fazer uma varredura de intervalo com as linhas inicial e final 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.
Disse isto :
Sugiro considerar o banco de dados IBM Informix + datablade TimeSeries . Ao contrário do que alguns 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).
TimeSeries é como um "plugin" (sem custo) 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 já que a versão gratuita tem muitos recursos limitados)
Aqui você pode conferir um PDF de benchmark que pode ser usado como referência. Aqui duas apresentações com exemplos mais técnicos: guia de manequins e outras dicas
Não tenho experiência pessoal com TimeSeries , então não posso concordar que será "a solução" , apenas uma sugestão para avaliar.
Eu apoio a recomendação de olhar para 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.
Os benefícios adicionais seriam a Interface de Tabela Virtual que pode fazer os dados do TimeSeries parecerem 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 o integração de dados TimeSeries no Informix Warehouse Accelerator que pode ser usado para acelerar relatórios complicados de data warehouse e a capacidade de prototipar uma solução TimeSeries no Informix usando as edições gratuitas Informix Developer ou Innovator-C.