负载均衡分两大部分:
一、N个网站之间的配置要保持一致
1、 确定状态服务器也就是主要机器A,将其注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection的键值改为1,然后重启本机的ASP.NET State Service服务。
2、确定N台服务器A,B..., Web 站点的应用程序路径(D:\XX\XX)、应用名称(网站名称)、应用的端口、应用ID(网站点右键->管理网站->高级设置->ID)是一致的(比如都设成1)。
3、N个网站下的web.config中添加machinekey配置,包括手机端webservice也要一并设置。
<system.web> <!-- 设置 compilation debug="true" 可将调试符号插入 已编译的页面中。但由于这会 影响性能,因此只在开发过程中将此值 设置为 true。 --> <machineKey validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/> </system.web>
machinekey生成算法如下:
validationKey = CreateKey(20); decryptionKey = CreateKey(24); protected string CreateKey(int len) { byte[] bytes = new byte[len]; new RNGCryptoServiceProvider().GetBytes(bytes); StringBuilder sb = new StringBuilder(); for(int i = 0; i < bytes.Length; i++) { sb.Append(string.Format("{0:X2}",bytes[i])); } return sb.ToString(); }
4、N个网站下的web.config下的SessionState设置
<system.web> <!-- 设置 compilation debug="true" 可将调试符号插入 已编译的页面中。但由于这会 影响性能,因此只在开发过程中将此值 设置为 true。 --> <sessionState mode="StateServer" cookieless="false" timeout="240" stateConnectionString="tcpip=192.168.1.110:42424" stateNetworkTimeout="14400" /> <compilation debug="true" targetFramework="4.0"> </system.web>
5、如果开启了防火墙,将42424端口开启。
补充一些相关资料:
关于Session
PRB: Session Variables Are Lost If You Use FRAMESET in Internet Explorer 6.0
http://support.microsoft.com/kb/323752/EN-US/#
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
http://support.microsoft.com/?id=324772
PRB:如果您使用 SqlServer 或 StateServer 会话模式 Web 场中会丢失会话状态
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056
ASP.NET Session State FAQ
http://www.eggheadcafe.com/articles/20021016.asp
参考来自:http://hi.baidu.com/panshuaiyang
二、集群的设定和负载均衡设定
1、在N个服务器的基础上,设定一个虚拟网址,用户其实都是访问这个虚拟网址,但实际随即映射到N个服务器。
2、专用负载均衡软件
服务器管理器->功能->网络负载平衡
(待补)
需注意事项:
1、凡设计到上传文件的要保持N个服务器之间要一致。
解决办法:1、文件以附件的格式存在数据库中;2、上传的同时要同步至所有服务器上