服务器configuration来提高性能并为SQL Server提供的ASP.NET站点提供冗余

我正在pipe理一个相当大的网站(目前每天大约有30万页面浏览量),预计这个网站将快速增长。 目前,IIS和SQL Server都运行在四核服务器上,具有RAID 10 SAS硬盘驱动器和32 GB的RAM。 一个不太强大的服务器被configuration为冷备份。 数据库每天都进行同步,而且站点文件每天都会移动到备份服务器。 如果主服务器出现故障,网站可能会在几个小时内重新启动,但这并不理想。 我正在寻找一个解决scheme,将提供:

  • 改进的性能。 将来有必要创build一个networking农场来处理请求,所以我需要为此计划。
  • 冗余。 如果一台服务器停机,该站点不应该停机。
  • 备份。 数据是关键的,所以SQL Serverconfiguration应该是这样的,我们不会丢失超过1天的数据(如果最后一天数据丢失,这不是什么大问题)

此外,解决scheme应包括灾难恢复。 如果数据中心陷入困境,我们需要一个解决scheme在不到一天的时间内恢复在线(我们正在考虑在本地服务器上保留数据和网站的副本),但是我们需要过程尽可能自动化,主服务器托pipe在德国的一个数据中心里)。

该数据库是50GB +,而Web应用程序是相当小的。

这听起来很标准。 我将在这里假设SQL Server 2008 R2或SQL Server 2012用于数据库部分。

你需要做的第一件事是从SQL Server中取出IIS,并把它放到它自己的机器上。 您还需要获得某种负载平衡器才能放到Web场的前面。 我build议像F5或思科一样,但如果你有一个Linux内部人员,你可以使用基于Linux的负载平衡器。 一旦你得到了负载平衡器,因为你需要增加网站,这样做很容易。 您只需购买另一台服务器,将其configuration为正常,然后将其添加到负载均衡器中的服务器场。

至于SQL HA,你可能会想看看SQL Server数据库镜像。 如果您拥有企业版SQL Server,这将为您提供本地数据中心中的两台服务器(尽pipe您可以将它们放在不同的数据中心中),并进行自动故障转移。

设置备份从数据中心复制到办公室并不是那么困难。 只需设置站点到站点VPN并通过networking复制文件。 带宽和延迟成为当时唯一的问题。

你的DR要求将是最难的部分。 要求您在不到一天的时间内备份​​和运行,这意味着您需要与另一个数据中心签订合同,并且您需要在该数据中心拥有服务器。 没有这个设备已经到位,你永远不会达到你的目标,让网站备份和运行在一天之内,因为只要得到新的服务器可能需要几周(或更长的时间,取决于灾难有多大,因为你不会是唯一的人们试图购买新的服务器)。

在Web服务器网站上,DR很容易。 只需将DNS服务器指向DR站点的公共IP即可。

对于SQL Server方面,您可能需要查看从主站点到DR站点的事务日志传送。 如果您希望更轻松地查看SQL Server 2012的AlwaysOn可用性组。 他们会自动执行故障转移,同步和asynchronous数据复制等等。AlwaysOn可用性组需要一个Active Directory域,所以您需要考虑首先获取该设置。

如果你还没有注意到DR是不便宜或容易的。

更多关于SQL Server的信息

MS已经发布了许多免费书籍,其中之一被命名为Microsoft SQL Server AlwaysOn高可用性和灾难恢复解决scheme指南 。

你会在这里find更多的技术指导。

而且,Windows上的备份并不像Linux上那么简单 。


高可用性

一般来说,你可以为网站做这些事情:

  • 让你的网站无国籍; 他们不应该使用会话状态,也不应该使用视图状态 – 这会增加可伸缩性。 相反,让URL决定什么显示; 通过避免共享状态,你可以有效地使用caching,比如前面的NGINX,这个caching说的是跨平台的HTTP:
  • 使用HTTPcaching – 不使用'memcached','varnish'或'MS Velocity' – 因为如果你可以避免的话,你不需要应用程序caching – 这是一个拐杖。 但是,为了正确使用HTTP进行caching,您需要使用ETags或Last-Modified标头,并且需要进行修复,以便ASP.Net正确返回实际上没有更改的dynamic页面的304 Not Changed – 这可能涉及一些更正的编程。
  • 如果您因为遗留原因需要状态,请考虑编写自定义状态提供程序 。 我可以推荐将NoSQL-key-value存储作为支持故障转移/节点故障和密钥过期的后端。 我推荐具有这种function的优秀Riak 。 如果您然后添加更多的应用程序不会说Microsoft,您仍然可以使用Riak HTTP接口。 请记住序列化与普遍已知的东西,如BSON或MessagePack。 通过这样做共享状态,您仍然可以在分配所有会话状态的同时扩展您的网站。

一般来说,你可以做这些事情的数据:

  • 开始将整体大型应用程序分离为具有单独存储的单个应用程序 – 通过这样做,您可以更明智地select将数据移动到冗余数据中心或服务器的方式。
  • 您可以调整一种非常容易分布的编程方式,例如使用CQRS风格编写领域逻辑与事件和实体事件源。 这需要你的程序员。
  • 从这个答案开始进行asynchronous复制(参见最上面的部分)。
  • 开始编写萨加斯来处理由多个真相来源引起的不一致(例如,在networking拆分的情况下,或者在数据库中的相同版本行上的单独读取)
  • 开始转向更容易实现HA的数据存储 – 例如Riak或Cassandra。

祝你好运!