我正在管理一个相当大的网站(目前每天的页面浏览量约为 30 万次),预计该网站将快速增长。目前,IIS 和 SQL Server 都在四核服务器中运行,该服务器具有 RAID 10 SAS 硬盘和 32 GB RAM。功能较弱的服务器配置为冷备份。数据库每天同步,网站文件也每天移至备份服务器。如果主服务器出现故障,网站可以在几个小时内恢复,但这并不理想。我正在寻找一种解决方案,该解决方案将提供:
- 性能有所提高。将来需要创建一个 Web 场来处理请求,因此我需要为此做好规划。
- 冗余。如果一台服务器宕机,整个网站不应该宕机。
- 备份。数据至关重要,因此 SQL Server 配置应确保不会丢失超过 1 天的数据(如果丢失了最后一天的数据,也没什么大问题)
此外,解决方案还应包括灾难恢复。如果数据中心发生故障,我们需要一个解决方案,在不到一天的时间内恢复在线(我们正考虑在本地服务器中保留数据和站点的副本,但我们需要一种方法使该过程尽可能自动化。主服务器托管在德国的一个数据中心)。
数据库有50GB+,而Web应用程序相当小。
答案1
这一切听起来都很标准。我假设数据库部分使用的是 SQL Server 2008 R2 或 SQL Server 2012。
您需要做的第一件事是将 IIS 从 SQL Server 中分离出来,并将其放到自己的机器上。您还需要获取某种负载平衡器,将其放在 Web 场前面。我推荐使用 F5 或 Cisco 之类的产品,不过,如果您家里有 Linux 人员,也可以使用基于 Linux 的负载平衡器。一旦您安装了负载平衡器,那么扩展 Web 场就变得非常简单。您只需购买另一台服务器,像平常一样配置它,然后将其添加到负载平衡器中的场中。
至于 SQL HA,您可能需要查看 SQL Server 数据库镜像。如果您拥有 SQL Server 企业版,这将为您提供本地数据中心中的两台服务器(尽管您可以将它们放在不同的数据中心),并具有自动故障转移功能。
设置从数据中心复制到办公室的备份并不难。只需设置站点到站点 VPN 并通过网络复制文件即可。此时带宽和延迟成为唯一的问题。
您的 DR 要求将是最困难的部分。要求您在一天之内恢复并运行意味着您需要与另一个数据中心签订合同,并且您需要在该数据中心拥有服务器。如果没有这些设备,您将永远无法实现在一天之内恢复并运行网站的目标,因为仅仅获得新服务器就可能需要数周时间(或更长时间,具体取决于灾难的严重程度,因为您不是唯一试图购买新服务器的人)。
在 Web 服务器站点上,DR 很容易。只需将 DNS 服务器指向 DR 站点的公共 IP 即可。
对于 SQL Server 方面,您可能希望查看从主站点到 DR 站点的事务日志传送。如果您想要更简单的配置,请查看 SQL Server 2012 的 AlwaysOn 可用性组。它们将执行自动故障转移、同步和异步数据复制等。AlwaysOn 可用性组确实需要 Active Directory 域,因此您需要先研究如何进行设置。
如果您还没有注意到,DR 并不便宜或容易。
答案2
有关 SQL Server 的更多信息:
MS 出版了许多免费书籍,其中一本名为Microsoft SQL Server AlwaysOn 高可用性和灾难恢复解决方案指南。
您将找到更多技术指导这里。
事实证明,Windows 上的备份不像在 Linux 上那么容易。
高可用性
一般来说,你可以为网站做这些事情:
- 让您的网站无状态;它们不应使用会话状态或视图状态 - 这会使可扩展性变得复杂。相反,让 URL 决定显示什么;通过避免共享状态,您可以有效地使用缓存,例如前面的 NGINX,它使用跨平台 HTTP:
- 使用 HTTP 进行缓存 — 不使用“memcached”、“varnish”或“MS Velocity” — 因为如果可以避免,您不会想要应用程序缓存 — 它只是一种手段。但是,为了使用 HTTP 正确缓存,您需要 ETag 或 Last-Modified 标头,并且您需要进行修复,以便 ASP.Net 正确返回 304 Not Changed 来处理实际上未更改的动态页面 — 这可能涉及一些纠正性编程。
- 如果你确实需要状态,因为遗留原因或其他原因,可以考虑写一个自定义状态提供者。我建议使用 NoSQL 键值存储作为后端,支持故障转移/节点故障和密钥过期。我推荐优秀的里亚克具有以下特点这。如果您随后添加更多不采用 Microsoft 语言的应用程序,您仍然可以使用 Riak HTTP 接口。请记住使用一些众所周知的东西进行序列化,例如 BSON 或 MessagePack。通过这种方式共享状态,您仍然可以扩展您的网站,同时让所有会话状态都分布。
一般来说,你可以对数据做这些事情:
- 开始将单片大型应用程序分离为具有单独存储的单个应用程序 - 通过这样做,您可以更有意识地选择如何将数据移动到冗余数据中心或服务器。
- 您可以采用一种非常容易分布式编程的方式,例如使用 CQRS 样式编写域逻辑,其中包含事件和实体的事件源。但这需要您的程序员付出一些努力。
- 从此答案中的异步复制开始(参见最上面的部分)。
- 开始编写 Sagas 来处理来自多个事实来源的不一致问题(例如,在网络分裂的情况下,或者在数据库中对同一版本行进行单独读取)
- 开始转向更容易实现 HA 的数据存储 - 例如 Riak 或 Cassandra。
祝你好运!