0

对于我的一个宠物项目(已经超出预期),我需要添加某种形式的负载平衡和故障安全。该项目使用三层:

  1. 前端(客户访问)
  2. 中间件(提供前端和后端之间的通信)
  3. 后端(业务逻辑、数据存储)

中间件是 Java servlet,后端是 PostgreSQL。每个客户都有一个数据库,因此一直有数据库来来去去。后端非常简单,因为每 24 小时导入一次新数据,其余时间基本上是只读的。

为了使整个系统更具弹性(对服务器故障、负载峰值等),我现在想将后端复制到其他服务器上。然后中间件可以将请求均匀地分发到所有正在运行的后端。

现在的问题是如何处理复制:

  1. 让中间件完成所有工作(制作数据库转储,将该转储推送到其他后端服务器并恢复它)
  2. 使用 Postgres 的内置机制(Slony、流复制等)

两种方式都有其优点和缺点,都没有感觉完全正确。我的主要想法是:

  • 使用中间件将提供更大的控制,我可以更轻松地确定当前存在哪些客户并仅复制这些数据库。将新的后端服务器添加到集群会更容易。我可以按需进行复制,即。当此客户的新数据已导入时。正确处理 pg_dump 和 pg_restore 涉及相当多的开发工作
  • 使用内置机制将节省一些工作,并且可能会表现得更好、更可靠。我需要在后端服务器(SSH、VPN)之间提供一些通信通道。

那么,这里有什么更好的方法?我倾向于喜欢中间件选项,但这可能是我对 Postgres 的经验非常有限。

额外的问题:如果 Postgres 复制是更好的选择,哪种机制(在 Postgres 9 中现在有很多)最适合我的方案?

4

3 回答 3

1

简短的回答,建立在现有解决方案之上。复制很难,很多聪明人已经完成了大部分工作。Slony、Londiste、Streaming Replication 都为您提供不同的功能,但它们都有一个共同点:它们确实有效。至于你选择哪个,这取决于你想要达到的目标。

流式复制将为您提供多个只读节点,这些节点仅略微落后于主节点(通常不明显)。它将消除应用架构更改的管理开销,它是二进制复制。但是,它是全有或全无复制(集群级别的复制)。设置起来并不是特别困难,只要您对所有服务器都有根访问权限。

Londiste/Slony 将让您更好地控制要复制的内容,让您控制到表级别。这可以很容易地添加只执行单个任务的节点 - 即,一个业务领域 - 这可能对您有用,也可能对您没有用。安装更复杂一些,模式迁移更复杂。使用 Londiste,您可以获得 PGQ,因此您现在在数据库中有一个消息队列,这对您业务的其他部分可能有用也可能没有用。

我刚刚设置了二进制流复制(一个热备用节点),因为我们的生产数据库最近出现了小问题,因此可以进行故障转移。它的工作原理以及它的最新程度给我留下了深刻的印象,我们还在考虑对这个节点的只读查询进行负载平衡。我对 Londiste 有过简短的体验,发现它有据可查,但我通常想要整个集群复制,所以热备用对我来说最有意义。

除了浪费时间/创建错误/给自己做比你需要的更多的工作之外,我看不到你自己做复制会得到什么。

于 2012-07-15T15:21:02.130 回答
0

我同意 ocharles 的观点,即在这里重新发明轮子没有意义。但是,如果 pg_dump/pg_restore 可以为您完成,那将是一个非常好的设置。完全转储/恢复通常不适用于复制的原因是:

  1. 数据库太大 - 完全转储/恢复需要太长时间。

  2. 数据库太活跃 - 您需要保持副本是最新的。

如果这些对您来说不是问题,那么您的复制过程可能只是:

对于每个数据库...

  1. 将“about to take backup at time T”插入到某个日志记录表中

  2. pg_dump 数据库

  3. 将备份复制到一个或多个从站

  4. pg_restore

  5. 从上面检查我们的时间戳插入是否存在于从站中

这很简单,可维护,并为您提供了很大的好处 - 每个活动数据库的每日、可归档、独立备份。

当然,如果您的数据库变得太大,或者需要每天更新一次以上,那么这对您不起作用

于 2012-07-16T06:10:23.657 回答
0

回答 OP 的后续问题——设置/配置 Londiste 非常简单。只需几个简单的步骤,您就可以在主数据库上添加任意表以进行复制,并将它们具体化到目标数据库(可以使用级联复制)。skytools 包中的 doc 文件夹中有多个操作方法,描述了不同的场景。

于 2013-11-05T16:20:25.473 回答