AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 1043
Accepted
Rik Heywood
Rik Heywood
Asked: 2011-02-04 02:54:10 +0800 CST2011-02-04 02:54:10 +0800 CST 2011-02-04 02:54:10 +0800 CST

Que problemas terei ao criar um banco de dados por cliente?

  • 772

Lembro-me dos podcasts do stackoverflow que o Fog Creek usa um banco de dados por cliente para o Fogbugz . Presumo que isso signifique que os servidores Fogbugz On Demand tenham dezenas de milhares de bancos de dados.

Estamos apenas começando a desenvolver um aplicativo web e temos um problema semelhante para resolver (muitos clientes com seus próprios dados isolados).

Que problemas devo esperar ao usar um banco de dados por cliente? Como posso resolvê-los?

Meus pensamentos iniciais

Vantagens de um banco de dados por cliente

  • Esquema de banco de dados mais simples
  • Backups mais simples - você pode fazer backup de cada cliente sem que isso realmente afete outros clientes.
  • Facilita a exportação de dados de determinados clientes.
  • Melhor desempenho de cache - uma gravação em uma das tabelas mais ativas afeta apenas aquele único cliente que executou a gravação.
  • Mais fácil de dimensionar em hardware. Por exemplo, quando precisamos passar de 1 para 2 servidores, apenas movemos metade de nossos clientes para o novo servidor.

Desvantagens

  • O MySQL pode lidar com 5.000 bancos de dados? O desempenho seria péssimo?
  • As alterações no esquema podem ser difíceis de replicar em todos os bancos de dados. Realmente teríamos que ter um plano automatizado para isso, como versionar o esquema e um script que entendesse como levar um banco de dados de uma versão para outra.
  • Fazer qualquer coisa que seja comum a todos os nossos clientes pode ser estranho ou impossível
  • Semelhante ao acima, mas qualquer análise que desejemos realizar em todos os nossos clientes pode ser impossível. Como devemos rastrear o uso em todos os clientes, por exemplo?
mysql database-design
  • 6 6 respostas
  • 39534 Views

6 respostas

  • Voted
  1. Best Answer
    Thomas
    2011-02-04T19:51:18+08:002011-02-04T19:51:18+08:00

    Essa solução é chamada de design multilocatário, onde cada locatário (cliente) possui seu próprio banco de dados. Dado isso, existem algumas outras considerações para a abordagem alternativa que é um único banco de dados:

    1. Com um único banco de dados, todos devem estar na mesma versão, não importa o que aconteça. Não é possível atualizar alguns clientes e outros não. Isso pode ser problemático se um cliente quiser um hotfix de um aplicativo que não está pronto para lançamento amplo.
    2. Com um único banco de dados, quando você faz uma atualização, todos os clientes ficam inativos. Se algo der errado, todo cliente está ferrado.
    3. Com um único banco de dados, é muito mais difícil limitar os recursos. Ou seja, se um cliente está martelando o banco de dados, é mais difícil fornecer a ele mais recursos separados de todos os outros.
    4. É muito mais difícil permitir que os usuários hospedem suas próprias versões do seu aplicativo. Se você estiver criando uma solução que será usada por grandes empresas, isso geralmente não é inicial. Seu departamento de TI quer controle total sobre o acesso ao sistema.
    5. Provavelmente é mais barato escalar bancos de dados em vez de escaloná-los. Ou seja, ter que investir em hardware mais rápido para hospedar um banco de dados para governá-los é provavelmente mais caro do que poder escalar os clientes para servidores de banco de dados menores e mais baratos. Não posso dizer isso definitivamente porque depende muito do software do servidor. Se você ficar com o MySQL, isso provavelmente é verdade porque os custos de licenciamento são insignificantes. No entanto, se você migrar para o SQL Server, por exemplo, a expansão se tornará muito mais cara, a menos que você use um ambiente VPS e o custo-benefício das alterações de expansão versus expansão. Posso dizer, no entanto, que uma vez que seu banco de dados fica muito grande, o gerenciamento exige níveis cada vez maiores de especialização. Bancos de dados muito grandes exigem brincar com vários grupos de arquivos e enviar determinados índices para diferentes eixos para obter melhor desempenho. Em suma, eles se complicam muito rapidamente.

    Ter bancos de dados separados significa que você precisa criar um mecanismo de atualização que corresponda à versão do banco de dados com a versão do aplicativo/site. No entanto, bancos de dados separados fornecem isolamento superior de dados e o IMO tem um custo menor de hospedagem. Não é uma solução para todos os cenários. Se o seu sistema nunca fosse hospedado fora de sua hospedagem e precisasse aumentar rapidamente os clientes e ter todos os usuários na mesma versão do aplicativo e do esquema de banco de dados era desejável, certamente ter um único banco de dados é uma abordagem melhor.

    • 45
  2. eiefai
    2011-02-04T09:12:34+08:002011-02-04T09:12:34+08:00

    Na minha experiência, você não deve criar um banco de dados por cliente. Deixe-me lhe dar um exemplo:

    No ano passado trabalhei com 70 bancos de dados (muito menos de 5000), cada um com o mesmo esquema e tudo. Em teoria, as coisas correriam como planejado (como você mencionou na seção de vantagens), mas na realidade nem tanto. Tivemos muitos problemas com a atualização de esquemas, suporte ao usuário, atualização de software, o que você quiser. Foi terrível.

    Usamos Firebird e fui contratado logo após o lançamento do produto, mas isso me deu o conhecimento para nunca trabalhar com bancos de dados separados.

    Não estou dizendo que você não pode fazer isso, estou dizendo que as coisas podem dar muito errado e, para ser honesto, sua lista de vantagens não parecia atraente o suficiente para correr o risco. A maioria deles pode ser realizada com um único banco de dados.

    • 15
  3. Joe
    2011-02-04T04:25:08+08:002011-02-04T04:25:08+08:00

    Você provavelmente gostaria de manter outro banco de dados para rastrear a versão em que cada cliente está, para poder acompanhar quais deles passaram ou não passaram pela última rodada de modificações.

    Fazer o script das atualizações não seria tão difícil... você poderia escrever algo que olhasse para o catálogo de bancos de dados e aplicasse as alterações necessárias para obter cada banco de dados para a versão mais recente, possivelmente ignorando aqueles que não deveriam ser atualizados por algum motivo.

    Como os 'bancos de dados' do mysql são apenas esquemas, como Caio apontou, se tudo estiver sendo executado na mesma instância do servidor, você pode apenas qualificar o nome das tabelas que está tentando modificar ou obter informações:

    alter schema.table ...
    select ... from schema.table
    

    ...

    Se você começar a dividir as coisas em vários servidores, ainda poderá criar um script que faça conexões com vários servidores para que possa aplicar todas as alterações; para a análise, novamente, você pode definir vários links de banco de dados usando tabelas federadas em seu banco de dados mestre para acessar os dados de um lugar, pois você estaria lendo as tabelas.

    ...

    Além disso, esteja ciente de que eles não estão usando o mySQL para troca de pilha, eles estão usando o SQL Server.

    E não tenho ideia de que tipo de sobrecarga de desempenho haveria no mysql nessa escala, acho que nunca passei de 30 'bancos de dados' no mysql.

    • 9
  4. RolandoMySQLDBA
    2011-03-12T00:24:26+08:002011-03-12T00:24:26+08:00

    Eu tenho um cliente Web/DB Hosting que tem mais de 750 bancos de dados de clientes com o mesmo número de tabelas (162) e as mesmas estruturas de tabela. Combinados, todos os dados do cliente do meu cliente totalizam 524 GB (95% InnoDB)

    Imagine todos esses bancos de dados competindo por 13 G de buffer pool innodb em nove servidores de banco de dados por meio de replicação circular. Escalar com essa configuração de hardware não foi suficiente. Imediatamente, recomendamos ao cliente que escalasse.

    Recentemente, migramos este cliente para servidores de 3 BD com muito mais potência (a todo custo, fique longe de SSD em ambientes de alta gravação, SEMPRE !!!). Nós os atualizamos do MySQL 5.0.90 para o MySQL 5.5.9. Diferenças dramáticas foram vistas quase instantaneamente.

    O dimensionamento horizontal também deve ser considerado porque, se você tiver centenas de clientes atingindo os mesmos recursos de memória e disco, o dimensionamento reduz seu uso linearmente (O(n)), em que n é baseado no número de servidores de banco de dados em um ambiente multimestre.

    No caso do meu cliente, minha empresa está reduzindo ele de 9 servidores DB (Quad Code, 32GB RAM, 824G RAID10) para servidores DB mais rápidos (Dual HexaCore [isso mesmo 12 CPUs], 192GB RAM,1.7TB RAID10) do MySQL 5.5 .9 (para tabela aproveitar as múltiplas CPUs). Além disso, imagine um pool de buffer innodb de 150 GB em 50 partições de 3 GB cada (vários pools de buffer InnoDB são um novo recurso no MySQL 5.5). Uma expansão menor, mas uma expansão massiva, funcionou para a infraestrutura exclusiva do meu cliente.

    MORAL DA HISTÓRIA : Aumentar ou diminuir a escala nem sempre é a solução se você tiver tabelas mal projetadas. O que quero dizer é o seguinte: se as páginas de índice têm população de chaves desequilibrada para índices de várias colunas, consultar chaves das partes desiguais dos índices leva à varredura de tabela após varredura de tabela, ou pelo menos índices que nunca são usados ​​devido a serem descartados pela consulta do MySQL Otimizador. Simplesmente não há substituto para o design adequado.

    • 7
  5. David Hall
    2011-02-05T07:53:03+08:002011-02-05T07:53:03+08:00

    O MySQL cria bancos de dados em diretórios separados, então depende muito do sistema operacional subjacente e de quantas pastas / manipuladores de arquivos ele pode manipular. Não deve ser um problema com os sistemas operacionais modernos, mas é daí que vem grande parte do gargalo.

    • 2
  6. Sean Siegel
    2013-02-18T13:18:03+08:002013-02-18T13:18:03+08:00

    Não há nada dizendo que você precisa hospedar versões diferentes do banco de dados ou do aplicativo. O que há de errado em simplesmente isolar os dados fazendo um db por cliente e tendo uma versão do banco de dados e do aplicativo? É claro que cada banco de dados do cliente teria que ser clonado a partir de um modelo da versão de trabalho atual. Do ponto de vista de segurança e isolamento de dados, acho que isso é o ideal.

    A única desvantagem que posso ver é que você teria que atualizar manualmente cada banco de dados ao criar uma nova versão. Isso poderia ser facilmente automatizado embora.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve