什么是分发PostgreSQL的最佳方法?

10

我有一个postgresql数据库,用于一个软件即服务,拥有数百个客户。目前为每个客户都有一个postgresql架构,但是由于客户数量迅速增加,我需要一种更好的解决方案。我了解了cassandra的相关知识,但是我不想失去主键、外键和检查约束的完整性。我也研究了postgresql在分布式系统中的应用,但目前我不知道最好的实现方式是什么。

2个回答

11

您可以按以下四个层次区分客户:

  1. 为每个客户运行单独的PostgreSQL集群。这样可以提供最大的隔离性;每个客户都在不同的端口上,有自己的系统表、事务日志等。

  2. 将每个客户放入相同集群中的不同数据库中。这样,他们每个人都有单独的登录名,但使用相同的端口号,并共享全局表如pg_database。

  3. 在同一数据库中为每个客户提供单独的模式。如果他们只通过您的软件连接,则不需要单独的用户ID,因为您可以设置search_path。当然,如果您愿意,也可以使用单独的用户ID。

  4. 使customer_id成为每个表主键的一部分,并确保在您的软件中进行限制。这可能比为每个数百个用户创建重复表要更好,但必须非常小心,始终通过customer_id限定查询。

有些人已知会组合这些技术,例如,将每个集群限制为100个数据库,每个客户有一个单独的数据库。

除非有更多详细信息,否则很难知道哪种配置对您的情况最好,除非要允许用户直接访问数据库,而不通过您的软件,否则需要考虑每个选项中系统表中的可见内容。从用户角度查看pg_database、pg_user和pg_class,以查看公开的内容。


7
我不想失去主键、外键和检查的完整性。
像Cassandra这样的系统的重点是,一旦你的数据集或工作负载无法放在单个机器上,即使你仍然使用postgresql,你也必须放弃这些东西。(我在一次讲座中详细介绍了这些内容,非常推荐观看:http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2010-what-every-developer-should-know-about-database-scalability-21-3280648)。
因此,Cassandra是一个回答问题的解决方案:“如果我们知道我们将不得不放弃外键和联接,那么重新思考如何设计我们的数据库,我们可以构建什么?”
如果你从来没有到达过这个点,那么Cassandra就是杀鸡焉用牛刀了。(但你仍然应该观看那个讲座。:)

以上链接没有指向对应的讲座页面。请您提供相关链接。 - SahuKahn
@SahuKahn 试试这两个链接:
  • 视频:http://pyvideo.org/video/313/pycon-2010--what-every-developer-should-know-abou
  • 幻灯片:http://www.slideshare.net/jbellis/what-every-developer-should-know-about-database-scalability-pycon-2010
- Heinrich Hartmann
1
一旦你的数据集或工作负载无法适应单台机器,即使你仍然使用PostgreSQL,也必须放弃这些东西 - 这不再完全准确了,参见http://www.postgres-xl.org。 - Greg0ry
这在以前确实是准确的。然而,许多数据库现在已经摆脱了那个想法。即使Cassandra并不是为此而建立,它也正在添加可调整一致性级别。Fauna和Spanner是新数据库的典型例子,它们在不放弃这些要求的情况下实现了可扩展性。 - Brecht De Rooms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接