Pergunta

Nós um Have A GDBM banco de dados de valor-chave como o backend para uma aplicação de teia virada para balanceamento de carga que é em implementado em C ++. Os dados serviram pela aplicação tem crescido muito grande, para que nossos administradores mudaram os arquivos GDBM de armazenamento "local" (sobre os servidores web, ou muito perto) para um grande, compartilhada, remoto, NFS-montado sistema de arquivos.

Isto tem desempenho afetada. Nossos testes de desempenho (em um ambiente de teste) mostram os tempos de carregamento de página saltando de centenas de milissegundos (para disco local) para vários segundos (mais de NFS, rede local) e, às vezes ficando tão alto quanto 30 segundos. Eu acredito que uma grande parte do problema é que o aplicativo faz muitas leituras aleatórias a partir dos arquivos GDBM, e que estes são lentos sobre NFS, e isso vai ser ainda pior na produção (onde o front-end e back-end têm ainda mais hardware de rede entre eles) e como nosso banco de dados fica ainda maior.

Enquanto isso não é uma aplicação crítica, eu gostaria de melhorar o desempenho, e ter alguns recursos disponíveis, incluindo o tempo de desenvolvedor de aplicativos e administradores Unix. A minha principal restrição é o tempo só tem os recursos para algumas semanas.

A meu ver, minhas opções são:

  1. Melhorar o desempenho do NFS por parâmetros de ajuste. Meu instinto é que não vai ficar muito fora disso, mas eu tenho sido errado antes, e eu realmente não sei muito sobre o ajuste de NFS.

  2. Mover para um banco de dados de valor-chave diferente, como memcachedb ou Tokyo Cabinet

  3. Substitua NFS com algum outro protocolo (iSCSI foi mencionado, mas eu não estou familiarizado com ele).

Como devo abordar este problema?

Foi útil?

Solução

Não fique muito preso na comparação “relacional versus não-relacional”. Parece ser irrelevante para este problema.

A linha de sua aplicação tem atravessado é diferente: a partir de um pequeno banco de dados no arquivo de armazenamento rápido local, a um grande banco de dados acessado através da rede . Cruzando os meios de linha que você está agora melhor servido por uma manutenção de rede, sistema dedicado, gerenciamento de banco de dados. Se o servidor de gerenciamento gerencia bancos de dados relacionais não é relevante para esse aspecto.

Para começá-lo a funcionar rapidamente, MariaDB (o sucessor do MySQL) é provavelmente a sua melhor aposta. Se você prevê-lo a crescer muito além de onde está agora, assim como você pode colocá-lo em PostgreSQL já que é onde ele terá de ir, eventualmente, de qualquer maneira: -)

Outras dicas

Este parece não ser o que você quer ouvir, mas honestamente, se eu fosse você eu jogá-lo em uma tabela mysql. Não é como se fosse significativamente mais difícil de trabalhar, e você terá um monte de benefícios com isso, não menos importante, um protocolo de acesso remoto que está realmente destinado para a sua situação, ao contrário GDBM-over-NFS.

Se você quiser manter bancos de dados não relacionais você poderia tentar BDB ou de DJB CDB . Eu tenho usado tanto até agora e eu acho que quando se trata de desempenho que superam GDBM.

Mas tenha de Bignose resposta em mente como eu, também, pensar que o gargalo pode não ser a estrutura de dados (GDBM) que você está usando, mas a sua infra-estrutura.

sistema

/ S de arquivos com arquivos planos através de uma rede não é uma boa idéia, mas você deve considerar escrever um servidor TCP multi-threaded que faz i / o, consulta, etc. nessa máquina, em seguida, retorna os resultados de volta. Transferir pequenos blocos de dados não toda arquivos db ..

Eu estou projetando um mecanismo de cache-persistência para superar uma alta disponibilidade problem.I irá codificá-lo, em python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top