Estamos criando SAAS onde teremos no máximo 50.000 clientes. Estamos pensando em criar um usuário no banco de dados Postgres para cada cliente. Vamos mapear cada usuário que faz login em nosso serviço para um usuário no banco de dados para ter certeza de que ele só terá acesso aos seus próprios dados. Também queremos implementar uma trilha de auditoria diretamente no banco de dados por esta solução , que utiliza gatilhos. Se cada cliente tiver seu próprio usuário de banco de dados, será muito fácil ver quem fez o quê, mesmo que dois clientes compartilhem os mesmos dados.
Estaremos enfrentando alguns problemas inesperados porque temos 50.000 usuários em nosso banco de dados? Em termos de desempenho ou administração. Talvez o pool de conexões seja mais difícil, mas não sei se precisaríamos disso.
Sim, deve ficar bom. No entanto, você deve usar o pool de conexões, pois o pg usa uma quantidade razoável de memória por conexão (cerca de 10 MB AFAIK).
Porém, mais de 500 conexões simultâneas por caixa serão um problema (como consultar ativamente o banco de dados ao mesmo tempo). Mais cpus/núcleos é melhor. Use SSDs com RAID 10.
Seu aplicativo SaaS deve se conectar como um usuário e, em seguida,
set role
ao usuário real. Isso permite que você use o pool de conexões, pois a string de conexão será a mesma, mas usará usuários diferentes. Você devereset role
ao retornar a conexão ao pool. Detalhes aquiIsso não é realmente autenticação de banco de dados. É a autenticação de proxy (também conhecida como representação).
Você também pode considerar pools separados por empresa ou função.
Para facilitar a administração, você pode colocar usuários em grupos e definir permissões por meio de grupos. Isso é chamado RBAC.
Atualização: consegui criar 50.000 usuários em 2,4 segundos. O PGAdmin III é visivelmente mais lento, devido ao número de usuários. No entanto, a conexão via JDBC é tão rápida quanto antes. Não consegui descartar 50.000 usuários de uma vez, mas consegui cerca de 10.000 por vez.
Desempenho: milhares de conexões simultâneas consumirão sua memória, aproximadamente um valor acima de 1.000 conexões simultâneas aconselhadas a usar o pool de conexões, o pgbouncer é bom, desenvolvido pela skype.
Administração: Administrar 50.000 usuários será um grande trabalho IMO. Que tal diferenciar o cliente com o mesmo acesso a dados usando diferentes
application_name
, para que cada cliente se conecte ao banco de dados usando o mesmo nome de usuário.Exemplo :
usando um nome de usuário diferente, a string de conexão de cada cliente seria:
--user user1
,--user user2
, etc.Mas usando different
application_name
, a string de conexão de cada cliente seria :--user user1 --application_name costumer1
,--user user1 --aplication_name costumer2
, etc.O
application_name
é gravadopg_stat_activity
e também pode ser registrado. Acho que seria mais fácil de implementar. Eapplication_name
também é registrado no gatilho de auditoria que você deseja aplicar. Mais detalhes aqui .Espero que ajude.