对于我的一个宠物项目(已经超出预期),我需要添加某种形式的负载平衡和故障安全。该项目使用三层:
- 前端(客户访问)
- 中间件(提供前端和后端之间的通信)
- 后端(业务逻辑、数据存储)
中间件是 Java servlet,后端是 PostgreSQL。每个客户都有一个数据库,因此一直有数据库来来去去。后端非常简单,因为每 24 小时导入一次新数据,其余时间基本上是只读的。
为了使整个系统更具弹性(对服务器故障、负载峰值等),我现在想将后端复制到其他服务器上。然后中间件可以将请求均匀地分发到所有正在运行的后端。
现在的问题是如何处理复制:
- 让中间件完成所有工作(制作数据库转储,将该转储推送到其他后端服务器并恢复它)
- 使用 Postgres 的内置机制(Slony、流复制等)
两种方式都有其优点和缺点,都没有感觉完全正确。我的主要想法是:
- 使用中间件将提供更大的控制,我可以更轻松地确定当前存在哪些客户并仅复制这些数据库。将新的后端服务器添加到集群会更容易。我可以按需进行复制,即。当此客户的新数据已导入时。正确处理 pg_dump 和 pg_restore 涉及相当多的开发工作
- 使用内置机制将节省一些工作,并且可能会表现得更好、更可靠。我需要在后端服务器(SSH、VPN)之间提供一些通信通道。
那么,这里有什么更好的方法?我倾向于喜欢中间件选项,但这可能是我对 Postgres 的经验非常有限。
额外的问题:如果 Postgres 复制是更好的选择,哪种机制(在 Postgres 9 中现在有很多)最适合我的方案?