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 / 184617
Accepted
Shaul Behr
Shaul Behr
Asked: 2017-08-30 10:15:44 +0800 CST2017-08-30 10:15:44 +0800 CST 2017-08-30 10:15:44 +0800 CST

Existe algum limite para o número de bancos de dados que você pode colocar em um servidor SQL?

  • 772

Estou montando um sistema SaaS, onde planejamos dar a cada cliente seu próprio banco de dados. O sistema já está configurado para que possamos expandir facilmente para servidores adicionais se a carga se tornar muito grande; esperamos ter milhares, ou mesmo dezenas de milhares de clientes.

Perguntas

  • Existe alguma limitação prática no número de micro-bancos de dados que você pode/deve ter em um SQL Server?
  • Isso pode afetar o desempenho do servidor?
  • É melhor ter 10.000 bancos de dados de 100 MB cada ou um banco de dados de 1 TB?

Informação adicional

Quando digo "microbancos de dados", não quero dizer "micro"; Quero dizer apenas que estamos visando milhares de clientes, de modo que cada banco de dados individual seria apenas um milésimo ou menos do armazenamento total de dados. Na realidade, cada banco de dados teria cerca de 100 MB, dependendo de quanto uso ele recebe.

A principal razão para usar 10.000 bancos de dados é a escalabilidade. O fato é que a V1 do sistema tem um banco de dados e tivemos alguns momentos desconfortáveis ​​quando o banco de dados estava sobrecarregado.

Estava sobrecarregando CPU, memória, E/S - todos os itens acima. Apesar de termos corrigido esses problemas, eles nos fizeram perceber que em algum momento, mesmo com a melhor indexação do mundo, se formos tão bem-sucedidos quanto esperamos, simplesmente não podemos colocar todos os nossos dados em um grande honkin ' base de dados. Portanto, para a V2, estamos fragmentando, para que possamos dividir a carga entre vários servidores de banco de dados.

Passei o último ano desenvolvendo essa solução fragmentada. É uma licença por servidor, mas de qualquer forma isso é resolvido, pois estamos usando VMs no Azure. A razão pela qual a questão surge agora é porque anteriormente estávamos oferecendo apenas para grandes instituições e montando cada uma por nós mesmos. Nossa próxima ordem de negócios é um modelo de autoatendimento em que qualquer pessoa com um navegador pode se inscrever e criar seu próprio banco de dados. Seus bancos de dados serão muito menores e muito mais numerosos do que as grandes instituições.

Tentamos os Pools Elásticos do Banco de Dados SQL do Azure . O desempenho foi muito decepcionante, então voltamos para as VMs normais.

sql-server scalability
  • 6 6 respostas
  • 11592 Views

6 respostas

  • Voted
  1. Best Answer
    Hannah Vernon
    2017-08-30T10:53:13+08:002017-08-30T10:53:13+08:00

    Já trabalhei em SQL Servers com 8 a 10 mil bancos de dados em uma única instância. Não é bonito.

    A reinicialização do servidor pode levar uma hora ou mais. Pense no processo de recuperação de 10.000 bancos de dados.

    Você não pode usar o SQL Server Management Studio para localizar um banco de dados de forma confiável no Pesquisador de Objetos.

    Os backups são um pesadelo, pois, para que os backups valham a pena, você precisa ter uma solução de recuperação de desastres viável. Espero que sua equipe seja ótima em scripts de tudo .

    Você começa a fazer coisas como nomear bancos de dados com números, como M01022, e T9945. Tentar ter certeza de que você está trabalhando no banco de dados correto, por exemplo, M001022em vez de M01022, pode ser enlouquecedor.

    Alocar memória para tantos bancos de dados pode ser excruciante; O SQL Server acaba fazendo muita E/S, o que pode prejudicar muito o desempenho. Considere um sistema que registra os detalhes do uso de carbono em 4 tabelas para 10.000 empresas. Se você fizer isso em um banco de dados, precisará apenas de 4 tabelas; se você fizer isso em 10.000 bancos de dados, de repente você precisará de 40.000 tabelas na memória. A sobrecarga de lidar com esse número de tabelas na memória é substancial. Qualquer consulta que você projetar que será executada nessas tabelas exigirá pelo menos 10.000 planos no cache de planos se houver 10.000 bancos de dados em uso.

    A lista acima é apenas uma pequena amostra dos problemas que você precisará planejar ao operar nesse tipo de escala.

    Você provavelmente encontrará coisas como o SQL Server Service demorando muito para inicializar, o que pode causar erros do Service Controller. Você mesmo pode aumentar o tempo de inicialização do serviço, crie a seguinte entrada de registro:

    Subchave: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
    Nome: ServicesPipeTimeout
    Tipo: REG_DWORD
    Dados: o número de milissegundos antes que o tempo limite ocorra durante a inicialização do serviço

    Por exemplo, para aguardar 600 segundos (10 minutos) antes que o serviço expire, digite 600000.


    Desde que escrevi minha resposta, percebi que a pergunta está falando sobre o Azure. Talvez fazer isso no Banco de Dados SQL do Azure não seja tão problemático; talvez seja mais problemático. Pessoalmente, eu provavelmente projetaria um sistema usando um único banco de dados, talvez fragmentado verticalmente em vários servidores, mas certamente não um banco de dados por cliente.

    • 85
  2. Zane
    2017-08-30T11:03:41+08:002017-08-30T11:03:41+08:00

    Portanto, há prós e contras para ambos os métodos. Sem saber mais sobre seu aplicativo ou os serviços que você deseja fornecer, não poderei dar uma resposta definitiva, mas vou expor alguns dos meus pensamentos sobre o assunto.

    Meu caso de por que você deve usar 1 banco de dados para todos os clientes.

    Prós

    • Manutenção fácil. Ter um banco de dados significa que você só precisa fazer sua tarefa de manutenção em um local em vez de muitos. Imagine o pesadelo de lidar com 1.000 bancos de dados diferentes para fazer backup. Que tal atualizar estatísticas em 1000 DB's ou reconstruir índices ou DBCC CHECKDB?

    • Código de implantação. Digamos que você tenha um problema com um procedimento armazenado em seu código de aplicativo ou relatório. Você precisa fazer uma alteração rápida... Agora você precisa implantar essa alteração em mais de 1000 DBs. Não, obrigado, prefiro não.

    • Fácil Visibilidade. Apenas imagine o SSMS tentando abrir mais de 1000 DBs (estremecer) . Isso praticamente tornaria o problema inútil e levaria um tempo surpreendente para abrir e renderizar o SSMS. Lembre-se, isso se você conseguir criar uma convenção de nomenclatura decente.

    Contras

    • Segurança. Seria mais fácil evitar que as pessoas olhassem os dados de outros clientes se você os tivesse como bancos de dados separados. No entanto, existem algumas coisas muito simples que você pode fazer para evitar que isso aconteça.

    • Atuação. Pode-se argumentar que limitar um banco de dados por cliente significa que o SQL Server terá que varrer menos dados para obter as informações que você está consultando. No entanto, com uma estrutura de dados adequada e uma boa indexação (e possível particionamento), você provavelmente pode eliminar isso como um problema se for feito com cuidado. Eu recomendaria dar a cada tabela que contém dados específicos do cliente algum tipo de guia CompanyIDpara reduzir essa sobrecarga.

    Em última análise, acho que sua melhor aposta é ter um banco de dados para seu aplicativo e apenas dividir os dados do cliente dentro do próprio banco de dados. Os problemas que isso lhe dará não serão nada em comparação com o pesadelo de gerenciar mais de 1000 bancos de dados.

    • 19
  3. Tony Hinkle
    2017-08-30T10:28:40+08:002017-08-30T10:28:40+08:00

    As especificações de capacidade máxima para SQL Server indicam que há um limite de 32.767.

    Quanto ao fato de afetar o desempenho, a resposta é sim, mas as maneiras como afetará o desempenho, e se seria substancial, dependeria de uma infinidade de fatores.

    Eu usaria um banco de dados, a menos que houvesse uma boa razão para dividi-lo em 10.000 bancos de dados. Um backup ou 10.000 backups? Uma verificação de integridade ou 10.000? Pode haver uma boa razão para usar 10.000 BDs pequenos, mas você não forneceu detalhes suficientes para determinar isso. A pergunta que você fez é bastante ampla e simplesmente não há informações suficientes para que alguém saiba qual é a melhor resposta.

    • 17
  4. Ivan McA
    2017-09-01T23:58:00+08:002017-09-01T23:58:00+08:00

    O que você está falando aqui é arquitetura multi-tenant vs multi-instância . Estou apenas trazendo esses termos, pois você não os usa em sua pergunta, mas é assim que você está discutindo e se você apenas conectar "arquitetura multilocatário" ao Google, encontrará uma riqueza de recursos e discussões sobre isso, livros inteiros foram escritos sobre ele.

    Alguns bons recursos sobre o SQL Server especificamente aqui:

    https://msdn.microsoft.com/en-us/library/ff966499.aspx

    https://learn.microsoft.com/en-us/azure/sql-database/sql-database-design-patterns-multi-tenancy-saas-applications

    Eu estaria com outras respostas, na medida em que me inclinaria fortemente para o multi-tenant como padrão, a menos que você tenha razões convincentes para favorecer a multi-instância.

    Você não precisa dividir em milhares de bancos de dados de clientes individuais para dimensionar, existem muitas outras maneiras de fazer isso, que provavelmente serão preferíveis. Como clustering, replicação, fragmentação, particionamento etc. Não reinvente a roda. Não há nada inerente que diga que você precisa dividir isso manualmente em um nível de cliente individual e, de fato, isso provavelmente aumentará significativamente os custos de adicionar cada novo cliente.

    Você está falando de "milhões" de clientes, pense em qualquer software como serviço baseado em nuvem em grande escala, Gmail, qualquer que seja, você dificilmente acha que eles criam um banco de dados totalmente novo para cada nova inscrição, não é?

    Pode haver razões em que você queira facilitar isso, por exemplo, se você estiver vendendo seu produto para um cliente que DEVE hospedá-lo internamente em sua própria infraestrutura. Mas, como regra geral do SAAS, use como padrão uma arquitetura multilocatário.

    • 8
  5. Darshan
    2017-09-08T01:34:43+08:002017-09-08T01:34:43+08:00

    Uma das desvantagens que posso ver na sugestão de banco de dados único é a reversão de dados - se você tiver um banco de dados por configuração de locatário, poderá restaurar os dados de cada cliente independentemente (e em um determinado momento). Se eles estiverem todos em um banco de dados, isso se torna muito mais difícil (e muito mais propenso a erros, pois provavelmente precisaria ser feito por meio de instruções INSERT/UPDATE/DELETE).

    • 8
  6. Shaul Behr
    2017-09-01T00:22:10+08:002017-09-01T00:22:10+08:00

    Obrigado a todos que responderam - realmente aprecio os pontos que você me deu para pensar. A sensação geral que tive foi que um único banco de dados é preferível, mas gostaria de adicionar alguns pontos de compensação a favor da arquitetura fragmentada e abordar algumas das preocupações que outras pessoas mencionaram.

    Motivação para sharding

    Conforme mencionado na pergunta (atualizada), estamos buscando vendas massivas em todo o mundo, com literalmente milhões de usuários. Com o melhor hardware e indexação do mundo, um único servidor de banco de dados não suportará a carga, portanto, precisamos ser capazes de distribuir em vários servidores. E uma vez que você precisa procurar em qual servidor os dados de um determinado cliente estão, não dá muito mais trabalho fornecer a eles um banco de dados dedicado, o que torna as coisas mais simples em termos de manter os dados das pessoas perfeitamente segregados.

    Resposta às Preocupações

    • Reiniciar o servidor leva muito tempo: OK, mas em operação normal não pretendemos reiniciar nenhum servidor. Em última análise, o sistema precisa estar online 24 horas por dia, 7 dias por semana, portanto, se tivermos tempo de inatividade, ele terá que ser agendado de qualquer maneira.
    • Backups/recuperação de desastres: Estamos usando o CloudBerry, que automatiza tudo. Não é um problema.
    • Nomear bancos de dados/localizá-los no SSMS: A convenção de nomenclatura é fácil, apenas com base no nome do cliente. Adicione dígitos seriais se os nomes forem compartilhados.
    • Manutenção: Se cada banco de dados for tão pequeno quanto eu imagino, não haverá necessidade de reconstruir os índices manualmente.
    • Implantação de código: usamos o Entity Framework, portanto, todas as alterações de esquema serão implementadas automaticamente em cada banco de dados com novos lançamentos. É verdade, porém, que se descobrirmos um problema de desempenho na produção que pode ser corrigido com um simples ajuste de índice, não é tão fácil simplesmente colocá-lo lá fora. Por outro lado, com cada banco de dados sendo tão pequeno, é improvável que ocorram problemas de desempenho impressionantes nos fragmentos de produção. E o banco de dados comum continua sendo um único banco de dados, ao qual essas preocupações não se aplicam.

    Ficarei feliz em ouvir de volta de você nos comentários se você acha que estou perdendo alguma coisa!

    • 6

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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