Eu sei que essa é uma pergunta antiga, mas vou tentar respondê-la mesmo agora, já que fiz algumas pesquisas relacionadas a isso.
O que você está tentando fazer é chamado multilocação no nível do banco de dados. Isso pode ser conseguido de duas maneiras:
-
Em um único cluster de banco de dados, um pouco como o OP descreveu, no entanto, minha escolha pessoal seria esta:
-
O usuário do
- postgres usa a autenticação peer e não tem permissão para conexões de senha. A autenticação MD5, na minha opinião, é uma prática ruim. Se você tiver algum tipo de problema com a consistência do banco de dados ou com esse tipo de coisa, ainda poderá fazer o login se deixar que o postgres use a autenticação peer.
- Cada cliente deve ter seu próprio esquema e não o banco de dados. Há múltiplas razões para isto:
- Possuir o banco de dados inteiro concederia muitos privilégios.
- Possuir apenas tabelas específicas traria problemas para os desenvolvedores e sempre exigiria que os administradores adicionassem permissões e outras coisas.
- Assim, em uma configuração normal, cada um deles teria acesso para criar coisas dentro de seus esquemas, incluindo tabelas, visualizações, acionadores etc.
- Todos eles usam a mesma string de conexão, exceto o nome de usuário. No postgres, por padrão, se você tiver um esquema com o nome do seu usuário, ele estará automaticamente em seu search_path.
- Eu optaria por não ter um usuário administrador que possa acessar cada esquema, como medida de segurança. Você deve fazer backups descarregando cada esquema com seu próprio usuário ou usando a técnica PITR do PostgreSQL. Você ainda precisaria usar o usuário postgres para criar novos esquemas, eu usaria uma regra sudo e um script para isso.
- Muitas boas práticas de segurança recomendam a eliminação do esquema padrão - lá vamos nós.
- Esta solução é extremamente adequada se o banco de dados para cada cliente for pequeno e você tiver muitos clientes.
- Se o seu aplicativo lida com multilocação, ele pode usar um único conjunto de conexões para todos os clientes. Naturalmente, isso elimina muitos dos aprimoramentos de segurança acima, mas pode ter benefícios de desempenho, especialmente quando você tem um grande número de clientes (se você tiver entre 500-1000 origens de dados separadas e usar pool de conexões, será bastante complicado). / li>
-
Cada cliente recebe seu próprio cluster de banco de dados. Esta é a minha solução preferida, especialmente porque geralmente trabalho com aplicativos que possuem grandes bancos de dados para cada cliente.
- Este traz uma excelente separação de dados. Você pode usar volumes de armazenamento separados para cada cliente, alocar limitações de CPU e memória (usando o docker?).
- Flexibilidade realmente boa sobre o que cada cliente precisa em sua instância. Eles podem ser semelhantes ou ter recursos distintos.
- Muito fácil de escalar em ambas as direções (para cima e para fora).
- Eu também uso IPs separados em locais onde cada cluster escuta conexões, fazendo com que o scale-out não precise de reconfiguração da fonte de dados. Os backups de PITR
- são por cliente, por isso, será mais fácil restaurar um único cliente em comparação com a multilocação por esquema.
- Em configurações complexas, cada cliente pode precisar de vários bancos de dados, esquemas, usuários e funções, etc., portanto, essa é uma solução muito melhor nesses casos.
Você também pode usar uma combinação das opções acima e usar o pgBouncer como um roteador.