我们正在创建 SAAS,我们最多将拥有 50.000 个客户。我们正在考虑在 Postgres 数据库中为每个客户创建一个用户。我们会将登录到我们服务的每个用户映射到数据库中的用户,以确保他们只能访问自己的数据。我们还希望通过此解决方案直接在数据库中实施审计跟踪,该解决方案利用触发器。如果每个客户都有自己的数据库用户,那么即使两个客户共享相同的数据,也很容易看出谁做了什么。
我们会因为数据库中有 50.000 个用户而遇到一些意想不到的问题吗?性能方面或管理方面。也许连接池会更困难,但我真的不知道我们是否需要它。
是的,应该没问题。不过,您应该使用连接池,因为 pg 每个连接使用相当数量的内存(大约 10MB AFAIK)。
但是,每个盒子超过 500 个同时连接将是一个问题(例如同时主动查询数据库)。更多的 CPU/核心更好。使用具有 RAID 10 的 SSD。
您的 SaaS 应用程序应作为一个用户连接,然后连接
set role
到真实用户。这允许您使用连接池,因为连接字符串将相同,但使用不同的用户。您应该reset role
在返回连接到池时。详情在这里这不是真正的数据库身份验证。它是代理身份验证(又名模拟)。
您还可以考虑为每个公司或每个角色设置单独的池。
为了使管理更容易,您可以将用户放入组并通过组设置权限。这称为 RBAC。
更新:我能够在 2.4 秒内创建 50,000 个用户。由于用户数量的原因,PGAdmin III 的速度明显较慢。然而,通过 JDBC 连接的速度和以前一样快。我无法一次删除 50,000 个用户,但一次可以删除大约 10,000 个用户。
性能:千并发连接会吃掉你的内存,大约1000个以上的并发连接建议使用连接池,pgbouncer是一个很好的,由skype开发的。
管理:管理 50,000 个用户将是 IMO 的一项大工作。如何使用不同的来区分具有相同数据访问权限的
application_name
客户,这样每个客户都将使用相同的用户名连接到数据库。例子 :
使用不同的用户名,每个客户端的连接字符串将是 :
--user user1
,--user user2
, 等等。但是使用不同
application_name
的,每个客户端的连接字符串将是 :--user user1 --application_name costumer1
,--user user1 --aplication_name costumer2
等。被
application_name
记录在案,pg_stat_activity
也可以被记录下来。我认为这将更容易实现。并且application_name
还记录在您要应用的审计触发器中。更多细节在这里。希望能帮助到你。