Banco de dados rápido para armazenar 1 bilhão de registros [fechados]

2

Estou escrevendo um código para armazenar dados e quero armazenar de 1 bilhão a 10 bilhões de registros ou até mais. O mais importante para isso é a velocidade (quase 10000 - 20000 / registros por segundo), o uso do SPACE e a prova do CRASH. Agora eu tenho jogado com MySQLs MyISAM e funciona muito rápido e corresponde à velocidade necessária para nós. O MyISAM também tem o uso ideal do SPACE e o arquivo de banco de dados na pasta de dados do MySQL era quase igual à quantidade de dados que eu inseri, por exemplo. para 100000 registros de 30 personagens cada, levou apenas 3 MB. Mas o único problema é que não é ACID e pode causar perda de dados em falhas.

Então, eu queria saber de quaisquer alternativas (não me importo em mudar o software do banco de dados para qualquer outra coisa), o que pode nos ajudar a armazenar tantos dados e armazená-los RÁPIDO.

Eu já experimentei o MySQL INNODB e suas inserções são muito lentas. Eu consegui apenas 800-1000 / registros por segundo. Além disso, a quantidade de espaço para armazenar dados no INNODB é bastante alta. São necessários quase 8 MB para armazenar os mesmos 100.000 registros de 30 caracteres cada.

Eu também tentei o MongoDB como uma alternativa, mas novamente requer muito espaço para armazenar os mesmos dados.

Mesmo o SQLITE3 DB é MUITO MUITO LENTO para gravar 100000 registros. Eu tentei isso com o PHP em um loop for. Também perdeu 20 registros e deu erros de banco de dados indisponíveis.

Por isso, gostaria de saber de qualquer software de banco de dados de código aberto que possa atender aos meus requisitos. Ouvi dizer que o ARIA do MariaDB é compatível com ACID. É verdade ? Ou o PostgreSQL também é uma boa opção rápida, com ótima utilização do espaço.

Estou aberto a qualquer solução que seja FAST, utilize espaço ideal e também seja à prova de CRASH. Ansioso para respostas.

=== UPDATE no MariaDB Aria === É até ruim do que o InnoDB quando se trata de inserir velocidade e espaço. Foram necessários 1,5 vezes a quantidade de tempo que o InnoDB para inserir os mesmos dados e quase 2,5 vezes o espaço usado pelo MyISAM.

    
por Raheel 31.07.2012 / 10:21

5 respostas

7

Este não é o tipo de coisa que qualquer pessoa consegue 100% pregar em 5 minutos, mas se você quiser atingir esse nível de desempenho e funcionalidade consistentemente , eu suspeito que você terá para gastar dinheiro.

Se você tiver orçamento para isso, eu procurarei combinar o mecanismo 'TimesTen' da Oracle, possivelmente com SSD empresarial ou Flash PCIe (como o FusionIO) e se você for tão longe, recomendo ir com o Xeon da Intel Série E7-xxxx, pois eles têm recursos RRAS fantásticos para manter seu servidor funcionando o máximo possível em caso de falhas.

    
por 31.07.2012 / 10:33
3

Se obter mais recursos e melhorar o desempenho era simplesmente uma questão de usar um software diferente, todos estariam fazendo isso (pelo menos as poucas pessoas ainda trabalhando em TI);

Se você precisar de suporte a ACID - então por que tentar o mongoDB?

É bem possível obter a taxa de transferência desejada com o innodb (mas o myisam é mais rápido), desde que você gaste o suficiente em hardware e ajuste o sistema corretamente. Mas a primeira restrição é minimizar o uso do espaço, o que implica que você não tem orçamento para comprar um conjunto de RAID SSD.

can cause data loss on crashes

Eu já vi perdas de dados em falhas no Oracle e Sybase - mas sim, em teoria, elas devem ser mais resilientes. Eu costumava gastar algum tempo, esforço e dinheiro evitando o acidente em primeiro lugar (servidor dedicado, usando hardware de qualidade razoável, UPS, software estável).

Even SQLITE3 DB is VERY VERY SLOW

O SQLite é particularmente sensível ao sistema de arquivos subjacente (mas isso afetará todos os bancos de dados). O fato de você não mencionar o sistema de arquivos (ou até mesmo em qual sistema operacional está rodando) me faz pensar que você não gastou muito tempo tentando ajustar a instalação.

Se fosse eu, eu daria uma olhada no MariaDB - é uma bifurcação do mysql e inclui um mecanismo ISAM aprimorado ( Aria ) que possui alguns benefícios de desempenho e suporta transações. (rodando no linux, usando o xfs com nobarriers e o scheduler de prazo).

Mas você precisa olhar para o seu hardware para realmente voar.

    
por 31.07.2012 / 10:53
2

Da minha experiência, o InnoDB (se configurado e usado corretamente) é apenas um pouco mais lento que o MyISAM (certamente não é uma ordem de grandeza). Algumas sugestões vêm à minha mente para melhorar o desempenho:

  • Você deve estar usando as versões mais recentes do mecanismo de armazenamento MySQL InnoDB.
  • Você deve usar um tamanho de buffer pool grande (~ 80% de RAM disponível) e um tamanho de arquivo de log grande.
  • Você deve usar transações e inserções em lote para obter um alto rendimento. O tamanho do lote é um fator de desempenho importante (não muito pequeno, mas também não muito grande).
  • Você deve usar o ID AUTOINCREMENT como PRIMARY KEY. Quaisquer índices diminuirão sua velocidade de inserção, especialmente UNIQUE.
  • Você deve usar o nível de isolamento de transação mais baixo que funciona para você.
  • Ajuste o innodb_flush_method para o seu sistema.
  • Se você não precisar de garantias ACID completas, procure alterar o valor de innodb_flush_logs_at_trx_commit
  • Use hardware adequado, ajuste seu sistema operacional / armazenamento /

Você encontrará bons indicadores aqui:

por 31.07.2012 / 12:12
0

existem muitos parâmetros que você pode usar para ajustar o innodb. myisam para essa quantidade de dados é inadequado - por exemplo, requer reparo após uma falha.

dê uma olhada no mysqltuner ou assistente de configuração sql do percona ; lance muito ram e rápido io-subsystem nele e innodb pode dar a você um desempenho muito decente.

O innodb permite a compactação imediata dos dados . não vai tornar as coisas mais rápidas, mas pode poupar algum espaço de armazenamento.

independentemente do mecanismo de db selecionado:

  • tente colocar em lote suas inserções, se possível, ter um sistema de enfileiramento entre o produtor de dados e o banco de dados
  • pense em dividir seus dados
  • pense em paralelizar seu processo de inserção. isso não vai te ajudar com myisam mas pode te dar um melhor desempenho com innodb no mysql e outros servidores de banco de dados
por 31.07.2012 / 10:40
0

um muito muito muito rápido DB: MemSQL

    
por 31.07.2012 / 10:28