【问题标题】:How a website should handle a database crash网站应如何处理数据库崩溃
【发布时间】:2011-07-08 07:37:27
【问题描述】:

我目前正在用 php 创建一个具有数据库后端(可以是 MySQL 或 SQL Server)的网站,最近我意识到,如果我的数据库随时崩溃,我的网站将无法正常运行,并且可能会引起一些头痛。

那么,如果我的数据库(或任何关键的外部组件)出现故障,在网站上显示的正确内容是什么?我的特定网站严重依赖其数据库,没有它几乎毫无用处。

我被告知的一个选项是向网站管理员发送电子邮件并显示错误 500 页面,说明服务器出现问题,并且基本上使网站无法使用,直到问题得到解决。我还能做些什么来解决这个问题吗?有没有什么方法可以设计一个网站,使数据库(任何关键组件)崩溃都不是问题?

我正在寻找一般的经验法则以及过去人们如何解决此问题的具体示例。此外,这些示例不仅仅适用于我的网站示例。

【问题讨论】:

  • 您可以添加一个冗余数据库并在第一个数据库崩溃时使用它。当然,这增加了确保两个数据库同步的麻烦,这可能值得麻烦 - 或者不。
  • 我认为 HTTP 500 错误几乎是标准。不确定您还期望能做什么,除了在必要时仅使用数据库(从而使您的网站的大部分部分保持“工作”)。作为旁注,您确定您的网站需要数据库服务器吗?一个简单的 SQLite 数据库可能就足够了,并且可以减少您对外部系统的依赖。取决于你的需要。

标签: php database crash web


【解决方案1】:

如果你只有一个数据库服务器,而没有它的数据库网站就无法运行,那就没有魔法了:你必须显示某种漂亮的错误页面通知用户存在技术问题,该网站将很快恢复。

一般来说:

  • 出现此类问题的可能性非常低
  • 如果您的网站是正常的,人们往往会偶尔接受一个问题,尤其是当您与之交流时。


如果你负担得起(并且具备设置它的技术知识),你可以使用两个数据库服务器,在它们之间进行复制(MySQL 支持这个):一个主服务器,您使用的和从属设备,被视为备份。

然后,如果主服务器倒下,您的应用程序将使用从服务器。


当然,这将大大降低与数据库相关的问题的风险(两台服务器同时崩溃的可能性很小),但是您仍然会遇到所有其他组件的问题 - 例如您的网络服务器:如果您只有第一个,您可能要考虑使用两个,第二个作为后备。

之后,如果您还有钱(并且认为您的网站需要更长的正常运行时间),您将需要考虑数据中心出现问题时的情况——设置在两个不同的位置启动服务器...

【讨论】:

    【解决方案2】:
    1. 正确显示的是一个简单的“哎呀”错误消息,它不会泄露任何对黑客有帮助的信息。类似于“我们遇到技术困难”或“网站不可用”之类的东西。 This is for security purposes

    2. 最好有一个错误记录和通知系统,以便在发生崩溃时通知管理员。这写起来相当简单,但我敢肯定已经有库可以处理这个问题。 (http://net.tutsplus.com/tutorials/php/404403-website-error-pages-with-php-auto-mailer/ 有代码示例教程,http://www.w3schools.com/php/php_error.asp 有更简单的示例)

    3. 有一些方法可以设计您的网站架构来处理数据库组件崩溃。它不是构建您的网站,而是构建整个环境。例如,用于高可用性的数据库集群 (http://en.wikipedia.org/wiki/High-availability_cluster)。不便宜。

    总体而言,您只需要确保正确处理错误即可。数据库崩溃是我们需要错误处理的典型例子。有很多资源和指导。

    http://www.google.com/search?q=Error+Handling+Guidelines&rls=com.microsoft:en-us&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1

    编辑

    我发现了这个并认为这是一个很好的资源来回答如何处理错误:

    http://www.nyphp.org/PHundamentals/7_PHP-Error-Handling

    【讨论】:

      【解决方案3】:

      如果您的数据库关闭或任何其他瘫痪的服务阻止您的网站正常运行,则返回 HTTP 500 状态代码被认为是最佳做法。根据您的网站功能,这可能是逐页或站点范围内的。例如,您的“关于我们”页面可能不需要数据库功能,而您的搜索页面则需要。因此,您可以保持“关于我们”页面正常运行,但在有人访问您的搜索页面时返回 500 状态代码。

      不要向最终用户提供有关网站为何无法运行的任何技术信息。这可能存在安全风险。

      如果您使用的是 apache,本文档将告诉您如何设置自定义错误页面:

      http://httpd.apache.org/docs/2.0/custom-error.html

      我建议您对 500 个状态代码页使用纯 HTML。你也可以让你的 PHP 页面通过 header() 函数发送一个 500 状态码,记录在这里:

      http://php.net/manual/en/function.header.php

      【讨论】:

        猜你喜欢
        • 2012-10-16
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多