在Postgres中拥有成千上万的用户可行吗?


9

我们正在创建SAAS,最多将有50.000个客户。我们正在考虑在Postgres数据库中为每个客户创建一个用户。我们将每个登录我们服务的用户映射到数据库中的一个用户,以确保他们只能访问自己的数据。我们还希望通过此解决方案在触发器中直接在数据库中实现审计跟踪。如果每个客户都有自己的数据库用户,那么即使两个客户共享相同的数据,也很容易看到谁做了什么。

因为我们的数据库中有50.000个用户,我们是否会遇到一些意外问题?绩效方面或管理方面。也许连接池会更困难,但是我真的不知道我们是否需要它。


2
如果您正在使用数据库身份验证,您将无法进行任何类型的连接池?对于性能而言,重要的问题是并发连接的数量以及它们正在使用多少资源,而不是数据库中的用户数量。
杰克说请尝试topanswers.xyz 2015年

2
@JackDouglas是的,您可以使用连接池。然后以“ commonUser”身份连接set role actualUser
Neil McGuigan

2
@Neil当然,但这不是数据库身份验证。如果您使用数据库用户的密码进行身份验证,则需要在postgres中使用某种外部身份验证。
杰克说尝试topanswers.xyz 2015年

2
@JackDouglas你是对的,它是代理身份验证,而不是数据库身份验证。
尼尔·麦圭根

到目前为止的答案是假设并发用户数量很高,会是这种情况吗?
杰克说,请尝试topanswers.xyz 2015年

Answers:


12

是的,应该没问题。但是,您应该使用连接池,因为pg每个连接都使用大量内存(大约10MB AFAIK)。

但是,每个框超过500个并发连接将是一个问题(例如,正好在同一时间主动查询数据库)。cpus / cores越多越好。搭配RAID 10使用SSD。

您的SaaS应用程序应以一个用户身份连接,然后再连接set role到真实用户。这允许您使用连接池,因为连接字符串将相同,但使用不同的用户。reset role返回连接到池时,您应该。

这不是真正的数据库身份验证。它是代理身份验证(又名模拟)。

您还可以考虑每个公司或每个角色使用单独的池。

为了使管理员更轻松,您可以将用户分组,并通过组设置权限。这称为RBAC。

更新:我能够在2.4秒内创建50,000个用户。由于用户数量众多,PGAdmin的运行速度明显慢。但是,通过JDBC进行连接的速度与以前一样快。我无法一次删除50,000个用户,但一次只能做大约10,000个。


非常感谢您的研究。完全可以在PGAdmin中工作吗?那里的性能有什么大问题吗?
大卫

@David PGAdmin很好,只是很慢。psql应该没问题。可以调整PGAdmin来加快速度。
尼尔·麦圭根

2

性能:成千上万个并发连接将耗尽您的内存,建议使用连接池的值大约超过1,000个并发连接,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还将记录在您要应用的审核触发器中。更多细节在这里

希望能帮助到你。


4
与50,000个应用程序用户相比,管理50,000个db用户的难度如何?
尼尔·麦圭根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.