Estamos criando o SAAS, onde teremos no máximo 50.000 clientes. Estamos pensando em criar um usuário no banco de dados do Postgres para cada cliente. Mapearemos cada usuário que fizer login em nosso serviço para um usuário no banco de dados, para ter certeza de que eles só terão acesso aos seus próprios dados. Também queremos implementar uma trilha de auditoria diretamente no banco de dados por essas soluções , que utiliza gatilhos. Se cada cliente tiver seu próprio usuário do banco de dados, será muito fácil ver quem fez o que, mesmo que dois clientes compartilhem os mesmos dados.
Teremos 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 eu realmente não sei se precisaríamos disso.
set role actualUser
Respostas:
Sim, tudo bem. Você deve usar o pool de conexões, pois a pg usa uma quantidade razoável de memória por conexão (cerca de 10 MB de 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 depois
set role
ao usuário real. Isso permite que você use o pool de conexões, pois a cadeia de conexão será a mesma, mas use usuários diferentes. Você devereset role
retornar a conexão com a piscina.Isso realmente não é autenticação de banco de dados. É autenticação por 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 de RBAC.
Atualização: Consegui criar 50.000 usuários em 2,4 segundos. O PGAdmin é 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 eliminar 50.000 usuários de uma só vez, mas consegui fazer cerca de 10.000 por vez.
fonte
Desempenho: milhares de conexões simultâneas consumirão Sua memória, aproximadamente um valor acima de 1.000 conexões simultâneas recomendadas para usar o pool de conexões, o pgbouncer é bom, desenvolvido pelo skype.
Administrando: administrar 50.000 usuários será um grande trabalho na IMO. Que tal diferenciar o cliente com o mesmo acesso a dados usando diferente
application_name
, para que cada cliente se conecte ao banco de dados usando o mesmo nome de usuário.Exemplo:
usando nome de usuário diferente, a seqüência de conexão de cada cliente seria:
--user user1
,--user user2
, etc.Mas usando diferente
application_name
, a seqüência 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. Eu acho que seria mais fácil de implementar. E oapplication_name
também é registrado no gatilho de auditoria que você deseja aplicar. Mais detalhes aqui .Espero que ajude.
fonte