6

我有这个想法:

每台服务器上:(它们设置相同

我在服务器前面放置了一个负载均衡器,并在我的主负载均衡器出现故障时更换了一个负载均衡器。

我使用Terracotta在服务器之间复制会话信息。如果一台服务器出现故障,用户应该能够在另一台服务器上继续他们的工作,理想情况下就像什么都没发生一样。剩下要“解决”的是(因为我还没有实际测试过这个,例如不知道我应该使用什么作为负载平衡器)是需要的数据库复制。

如果用户与应用程序交互并且数据库发生更改,则必须将该更改复制到其他服务器机器上的数据库服务器。我该怎么做呢?我应该使用 MySQL PostgreSQL 还是其他东西(理想情况下是免费的,因为我们的预算有限)?上面的其他事情听起来合理吗?

澄清:我首先集群以获得高可用性,我希望能够添加服务器并同时使用它们以获得高可扩展性。

4

5 回答 5

4

由于您已经在使用Terracotta,并且您认为第二个 DB 是个好主意(同意),您可能会考虑扩展 Terracotta 的角色。我们有使用 Terracotta 进行数据库复制的客户。这是一个简短的示例/描述,但我认为他们已停止支持该产品的客户。:

http://www.terracotta.org/web/display/orgsite/TCCS+Asynchronous+Data+Replication

于 2009-02-18T17:56:04.883 回答
2

您正在尝试创建多主复制,这是一个非常糟糕的主意,因为对任何数据库的任何更改都必须复制到每个其他数据库。这非常慢 - 在一台服务器上,您可以使用几个快速磁盘和 RAID1 或 RAID10 每秒获得​​数百个事务。如果您有一个带有电池后备缓存的良好 RAID 控制器,它可能会更多。如果加上与所有服务器通信的开销,您每秒最多将获得数十个事务。

如果您想要高可用性,您应该选择一个热备用解决方案,其中您有一个服务器,该服务器被复制但未使用 - 当主服务器死亡时,替换接管。如果您的主服务器死机,您可能会丢失一些最近的交易。

您也可以进行一主多从异步复制。对数据库的每次更改都必须在一台主服务器上执行。但是您可以拥有多个从属只读服务器。此从属服务器上的数据可以是主服务器后面的多个事务,因此在服务器死亡的情况下您也可能丢失一些最近的事务。

PostgreSQL 确实有两种类型的复制——使用日志传送的热备份和一个使用 slony 的主多从属。

只有当您的写入数量非常少时,您才能进行同步复制。这也可以使用 PgPool-II 或 Sequoia 为 PostgreSQL 设置。

请阅读Postgres 文档中的高可用性、负载平衡和复制章节了解更多信息。

于 2009-02-25T08:39:05.867 回答
1

对于我的(Perl 驱动的)网站,我在两台具有数据库复制功能的服务器上使用 MySQL。每个 MySQL 服务器同时是从属和主控。我这样做是为了冗余,而不是为了性能,但设置在过去 3 年中运行良好,在此期间我们几乎没有停机时间。

关于 Kent 的问题/评论:我正在使用 MySQL 附带的标准复制。

关于故障转移机制:我正在使用 DNSMadeEasy.com 的故障转移功能。我有一个 Perl 脚本通过 cron 每 5 分钟运行一次,它检查复制是否仍在运行(以及许多其他事情,例如服务器负载、HDD 健全性、RAM 使用情况等)。在正常运行期间,两台服务器中速度较快的服务器会传送所有网页。如果脚本检测到服务器出现问题(或者如果服务器只是正常停机),DNSMadeEasy 会切换 DNS 条目,以便辅助服务器成为主服务器。一旦“真正的”主服务器备份,MySQL 会自动赶上丢失的数据库更改,并且 DNSMadeEasy 会自动切换回来。

于 2009-02-18T11:55:50.630 回答
0

这是一个想法。阅读 Theo Schlossnagle 的《Salable Internet Architectures 》一书。

你提出的不是一个最好的主意。

负载均衡器很昂贵,而且不像看起来那么有价值。使用更简单的方法在服务器之间分配负载(例如Wackamole)。

与其在数据库复制上胡闹,不如把钱花在与前端 Web 服务器分开的可靠数据库服务器上。进行定期备份,万一发生数据库故障,请尽快从普通备份中恢复运行。

于 2009-02-18T11:34:53.537 回答
0

AFAIK,MySQL 在可扩展性方面做得更好。请参阅文档 http://dev.mysql.com/doc/mysql-ha-scalability/en/ha-overview.html

还有一个博客,您可以在其中查看现实生活中的示例: http ://highscalability.com/tags/mysql

于 2009-03-02T09:32:42.170 回答