我在 postgresql 中有一个数据库,用于为数百个客户提供软件即服务,目前每个客户都有一个 postgresql 模式,但我喜欢最好的解决方案,因为客户迅速增加。我读过关于 cassandra 的文章,但我不想失去主键、外键和检查的完整性。还阅读了分布式系统中的 postgresql,但我不知道目前实现这一点的最佳方法是什么
2 回答
您可以在四个级别上区分客户:
为每个客户运行一个单独的 PostgreSQL 集群。这提供了最大的分离;每个客户端都在一个单独的端口上,具有自己的一组系统表、事务日志等。
将每个客户放在同一集群中的单独数据库中。这样,他们每个人都有一个单独的登录名,但在相同的端口号上,并且他们共享全局表,如 pg_database。
在同一个数据库中为每个客户提供一个单独的模式。如果他们仅通过您的软件连接,则不需要单独的用户 ID,因为您只需设置 search_path。当然,如果您愿意,可以使用单独的用户 ID。
让 customer_id 成为每个表的主键的一部分,并确保在您的软件中受到限制。这可能比为数百个用户中的每个用户都有重复的表更好地扩展,但您必须非常小心,始终通过 customer_id 限定您的查询。
众所周知,有些人会将这些技术结合起来,例如,将每个集群限制为 100 个数据库,并为每个客户提供一个单独的数据库。
没有更多详细信息,很难知道哪种配置最适合您的情况,除了说如果您想允许用户直接访问数据库,而不通过您的软件,您需要考虑系统表中可见的内容每个选项。从用户的角度看 pg_database、pg_user 和 pg_class,看看暴露了什么。
我不想失去主键、外键和检查的完整性
像 Cassandra 这样的系统的要点是,一旦您的数据集或工作负载不适合单台机器,即使您留在 postgresql 上,您也必须放弃这些东西。(我在我强烈推荐的演讲中介绍了细节:http: //blip.tv/pycon-us-videos-2009-2010-2011/pycon-2010-what-every-developer-should-know-about-database -可扩展性-21-3280648)。
所以 Cassandra 是对这个问题的回答,“如果我们知道我们将不得不放弃外键和连接,我们可以通过重新思考如何设计我们的数据库来构建什么?”
如果你永远都达不到这一点,那么 Cassandra 就太过分了。(但你还是应该看那个演讲。:)