红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore ![]() | Help |
|
July 03 Connection Pool Timeout 与 Connect Timeout = 0最近在做多线程处理数据库的程序时,这个程序总是会报如下错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 System.Data 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 仔细用 SQL Server Management Studio 中的 Activity Monitor 查看数据库链接,竟然是只有2,3个数据库链接时,就报上述错误,很是怪异。 一步步删除掉代码,反复试验后,竟然是数据库链接字符串中的 Connect Timeout=0 来作怪的。 比如下述数据库链接字符串就会出现上述问题, Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=DB1;server=(local);Connect Timeout=0 而把数据库链接字符串修改为 就不会有问题了。
这个bug在微软的反馈中可以看到,如下: 其中微软的官方反馈是: The fix was submitted to the source branch of the next major .Net release.
照这么说,估计.net 4.0 中会修复这个bug。
参考资料: Why Does a Connection Pool Overflow? Trace a SqlConnection - Connection Pooling issues Fixing connection pooling timeout exceptions on third-party code Connection Pooling and the "Timeout expired" exception FAQ ADO.NET Connection Pooling at a Glance http://support.microsoft.com/kb/310617/ ADO.NET数据连接池 关于ADO.Net连接池(Connection Pool)的一些个人见解 How to: Open Activity Monitor (SQL Server Management Studio) Connect Timeout = 0 / Connection Pool Timeout June 23 PowerPoint插件出问题的解决方法今天很怪异,我的PowerPoint出现了下面的提示对话框后,不论我选择是或者否,我的PowerPoint都再也打不开了。 网上搜索了相关资料,通过下面步骤删除这个插件后,就可以正常使用了。
参考资料: 启用或禁用 Office 程序中的加载项 June 17 硅脂硅脂对CPU的热量向散热风扇的传递很重要,上周对我家电脑的处理对此深有感受。特写此篇Blog。 之前我家的台式机由于频繁出现无法启动。症状是:主板灯亮,风扇都在转,但是就是无法启动,而且主板没有任何嘟嘟提醒。每次碰到这种情况,我需要把CPU拆下来,重新装上去才可以启动。我怀疑就是CPU热量散不出去的原因,在能启动的时候,通过进入主板的管理界面,看到一开机,CPU的温度就是74度。风扇乌鸦乌鸦的响。 后来就是买了硅脂,涂在风扇跟CPU接触面上后,开机进入BIOS 后,发现CPU温度只有三十多度,玩一个3D的游戏时,也只有60度。之前不能启动的问题也就解决了。由于我家电脑的风扇是可以根据温度变转速的,之前开机后风扇很响的问题也解决了。 参考: 实践出真知-4种硅脂涂法详尽测试 June 12 Html5上周五参加Google开发者日,给我冲击最大的是Html5。对我的冲击主要有2点: 1、Html 5 可以带来丰富的用户体验。 开发者日中Google演示的用Html5开发的Wave(一个Mail的应用)就被Google玩的很炫。邮件、IM、博客、照片等功能融合在一起。特别是可以在一个邮件中,几个相关人能够协同讨论,不再像从前一样一个问题可以讨论N个邮件。从现场多次的掌声中可以看到这个东西很强大。它可以实现现在Flash\Silverlight才能提供的功能。 下面是 Wave 的一个截图 图片来源自:http://google.org.cn/2009/05/29/google-wave-a-new-communication-platform-for-a-new-web-2/ 2、各种浏览器支持Html5的步伐很快。 Html5的规范不象之前,九几年就出来的规范,不久前普及,这次Html5的支持,进展很快。HTML 5还没有标准化,但Firefox、Chrome、Safari和Opera已经引入了它的元素。很难想象的是一个处于草案解决的规范,已经有众多浏览器支持了。一些支持信息如下: 图片来源自: http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html
小结 进展很快,功能强大,由于Google等大公司的推进,很快我们将能看到Html5的更多应用,这是一个值得关注的领域。
参看: Google Wave会影响RIA/Silverlight吗? 谷歌开发者日:Google Wave将基于BSD协议开源 Google I/O 2009现场视频之HTML 5之歌 Google力挺HTML 5 或成未来应用核心 HTML 5 正式标准恐将2022年才能正式发布 Firefox 3.1开始支持HTML 5 视频和音频 多线程与SqlConnection.Close我做的一个Windows Form 程序碰到一个很怪异的多线程情况,最后检查进去竟然是部分代码的数据库链接没有关闭导致的。 我的这个程序是多线程程序,每个线程不间断的从数据库中取得数据,然后对取出的数据进行处理,一直循环到没有需要处理的数据为至。每个线程的循环是上万次的,即,每个线程上万次的数据库链接打开操作。 这个程序碰到怪异的现象是: 在A服务器上,没有任何问题,在B服务器上程序开一个线程没有任何问题,开多个线程则只有一个线程没问题,其他线程都有问题。 对每一个线程都作 try catch 拦截,就会看到出错线程报如下错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 System.Data 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 从这个异常就可以看到,是数据库链接对象池中没有可用的链接了。 再分析下去,就是其中一部分从数据库中读数据的代码,没有调用 SqlConnection.Close。
分析我这个程序出现的规律: 单线程,不主动调用 SqlConnection.Close 这时候竟然数据库链接池不会报没有可用资源: 数据库链接对象池的默认最大容量为100,单线程对数据库链接打开的请求超过10000的。 显然这种情况下,虽然没有手工SqlConnection.Close,但是这些数据库链接SqlConnection还是回到了数据库链接对象池中了。 多线程时,不主动调用 SqlConnection.Close。 只有一个线程在跑,其他线程都报上述错误。 显然,多线程时,数据库链接对象池都被一个线程占住了,其他线程获得不了可用分数据库链接。
这个多线程怪异的特征,之前一直没想到会是SqlConnection.Close导致的,一直在其他方面想可能的问题。这次经验教训后,心得就是:
参考资料: FIX: Error message when a "System.Data" thread tries to open a pooled connection in the .NET Framework 2.0: "Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool http://support.microsoft.com/kb/948868/en-us
使用连接池 Connection Pooling for the .NET Framework Data Provider for SQL Server 学习笔记:7种结构型设计模式简单对比这7种结构型设计模式是下面7种:
对比:
从接口的角度来看:
May 08 学习笔记:创建型设计模式简单对比知识点:
我们如何选择那个设计模式来创建“易变类”呢? 如果遇到“易变类”,起初的设计通常是从Factory Method 开始,当遇到更多更复杂的变化时,再考虑重构为其他三种工厂模式(Abstract Factory ,Builder ,Prototype ),后这三种区别看上面的知识点。 参考资料: 李建忠老师Webcast讲解的“C#面向对象设计模式纵横谈” April 29 MemberwiseClone与CloneMemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。 下面的代码就是演示这个问题: using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace CloneDemo { [Serializable] class DemoClass { public int i = 0; public int[] iArr = { 1, 2, 3 }; public DemoClass Clone1() { return this.MemberwiseClone() as DemoClass; } public DemoClass Clone2() { MemoryStream stream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, this); stream.Position = 0; return formatter.Deserialize(stream) as DemoClass; } } class Program { static void Main(string[] args) { DemoClass a = new DemoClass(); a.i = 10; a.iArr = new int[] { 8, 9, 10 }; DemoClass b = a.Clone1(); DemoClass c = a.Clone2(); // 更改 a 对象的iArr[0], 导致 b 对象的iArr[0] 也发生了变化 a.iArr[0] = 88; Console.WriteLine("MemberwiseClone"); Console.WriteLine(b.i); foreach (var item in b.iArr) { Console.WriteLine(item); } Console.WriteLine("Clone2"); Console.WriteLine(c.i); foreach (var item in c.iArr) { Console.WriteLine(item); } Console.ReadLine(); } } } April 13 多线程Singleton单件模式Singleton模式是最简单的模式,比较汗颜的是自己一直以来使用的是单线程的Singleton模式,最近在听了李建忠老师的模式讲座录像后,才发现自己一直没注意到这点。这个录像讲座在后面给出了链接地址: C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 下面内容整理自李建忠老师的讲课内容: 单线程的Singleton模式 public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton Instance { get { if (instance == null) instance = new Singleton(); return instance; } } } 要点:
多线程的Singleton模式 public class Singleton { private static volatile Singleton instance = null; private static object lockHelper = new object(); private Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (lockHelper) { if (instance == null) { instance = new Singleton(); } } } return instance; } } } 代码说明:
使用.net特有的支持多线程的单件模式代码 public sealed class Singleton { public static readonly Singleton Instance = new Singleton(); private Singleton() { } } 代码说明:
缺点:
参考资料: 讲讲volatile的作用
Implementing the Singleton Pattern in C#
初始化内联引用类型静态字段
通过七个关键编程技巧得益于静态内容
模式设计c#--创建型--Singleton
April 03 Thread.Sleep(0)今天在看 EnterpriseLibrary 源文件时,看到如下的代码,这个代码可以比较经典的解释Thread.Sleep(0)的用途。代码如下: Hashtable inMemoryCache; CacheItem cacheItemBeforeLock = null; // ..... 一些其他代码 Thread.Sleep(0); 线程挂起0毫秒。表面看来这个代码是没啥意义的。 其实不然,挂起0毫秒的意义不在于0毫秒,而在于挂起2个字,线程挂起,其他线程就有机会优先执行。 上面的代码中,在Thread.Sleep(0);之前,这个线程跟其他线程争抢cacheItemBeforeLock的情况,就会因为这个挂起而得到解决。 参考: 关于Thread.Sleep(0) Thread.Sleep 方法 (Int32) April 01 一个简单的演示SQL2005的查询通知的例子设置具体数据库启动Service Broker服务,如下图: 我这里试例数据库的名字为“ghj_Demo”,修改 Broker Enabled 属性为 true。 你也可以用SQL 语句来修改,修改的SQL语句如下: ALTER DATABASE ghj_Demo SET ENABLE_BROKER 确保你将使用的数据库帐户具有必需的权限 你在后面连接这个数据库的帐户,要确保对这个数据库具有 SUBSCRIBE、 QUERY 、NOTIFICATIONS 的权限。 下面就是一个简单的代码例子,来演示查询通知。这里用到一个我自己建立的表: 这个表结构如下: CREATE TABLE [dbo].[User]( [UserName] [nvarchar](20) NOT NULL, [Email] [nvarchar](50) NULL ) ON [PRIMARY] GO 演示的控制台代码如下: using System; using System.Data; using System.Data.SqlClient; namespace Demo { class Program { public static string connectionstring = "Data Source=.;Initial Catalog=ghj_Demo;Integrated Security=True"; public void DoDependency() { using (SqlConnection conn = new SqlConnection(connectionstring)) { // sql is a local procedure that returns // a paramaterized SQL string. You might want // to use a stored procedure in your application. string sql = "select [UserName] ,[Email] from dbo.[User]"; SqlCommand cmd = new SqlCommand(sql, conn); // Ensure the command object does not have a notification object. cmd.Notification = null; //Notification specific code SqlDependency dep = new SqlDependency(cmd); dep.OnChange += new OnChangeEventHandler(TestEvent); conn.Open(); SqlDataReader r = cmd.ExecuteReader(); //Read the data here and close the reader r.Close(); conn.Close(); Console.WriteLine("DataReader Read..."); } } void TestEvent(Object o, SqlNotificationEventArgs args) { // 注意: // 如果Server端在很短的时间内发生了大量的改动(比如用了一个循环Update了好多行), // OnChanged必须能迅速处理事件,否则它只会被触发一次。这个不是缺陷, // 因为一般OnChanged事件处理函数内都要执行类似刷新缓存的操作,它只触发一次, // 不会影响程序逻辑,却能提高程序性能。 Console.WriteLine("======================"); Console.WriteLine("Event Recd"); Console.WriteLine("Info:" + args.Info); Console.WriteLine("Source:" + args.Source); Console.WriteLine("Type:" + args.Type); } static void Main(string[] args) { // In order to use the callback feature of the // SqlDependency, the application must have // the SqlClientPermission permission. try { SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted); perm.Demand(); } catch { throw new ApplicationException("No permission"); } try { SqlDependency.Stop(connectionstring); //Start the listener infrastructure on the client SqlDependency.Start(connectionstring); Program q = new Program(); q.DoDependency(); Console.WriteLine("Wait for Notification Event..."); Console.Read(); } finally { //Optional step to clean up dependency else it will fallback to automatic cleanup SqlDependency.Stop(connectionstring); } } } } 一些注意事项:摘自MSDN文档 使用查询通知功能的应用程序需要考虑下列特殊注意事项。
编写通知查询语句的约束您可以为 SELECT 和 EXECUTE 语句设置通知。 使用 EXECUTE 语句时,SQL Server 会为执行的命令而不是 EXECUTE 语句本身注册通知。 该命令必须满足 SELECT 语句的要求和限制。 当注册通知的命令包含多个语句时,数据库引擎会为批处理中的每个语句创建一个通知。 对满足以下要求的 SELECT 语句支持查询通知:
sunmast 对查询通知的注意事情也有很多有价值的整理:
参考资料: 剖析SQL Server 2005查询通知之基础
Using SqlDependency for data change events
SQL Server 2005 Service Broker 初探
SQL Server 2005数据库开发详解
C# Windows 应用程序中实现 SQL Server 2005 查询通知
SqlDependency changes for RTM [Sushil Chordia]
.NET 2.0 SqlDependency快速上手指南
在 Windows 应用程序中使用 SqlDependency
Using SqlDependency in an ASP.NET Application Minimum Database Permissions Required for SqlDependency
使用SQL Server 2005 Query Notification的几个注意事项
March 30 Html标签嵌套对展示性能的影响一个简单问题:如下2种Html写法,那个加载速度快? <!-- 写法1 --> <div> <div>内容代码2</div> <div>内容代码3</div> <div>内容代码4</div> <div>内容代码5</div> <div>内容代码6</div> <div>内容代码7</div> <div>内容代码8</div> <div>内容代码9</div> <div>内容代码10</div> </div> <!-- 写法2 --> <div>内容代码2</div> <div>内容代码3</div> <div>内容代码4</div> <div>内容代码5</div> <div>内容代码6</div> <div>内容代码7</div> <div>内容代码8</div> <div>内容代码9</div> <div>内容代码10</div> 我的答案,写法2。当然,如果只是上面的写法,实际上这两种写法对性能的差别,可以忽略不计。 但是如果,上图的内容代码区域如果嵌入了一些不可控的因素,比如:外站的一些脚本出现在<div>内容代码7</div>中。写法1需要所有都加载完成才可以正常显示,写法2的内容2-6 不受这个影响。
更具体的来说:浏览器解析Html的规则必然是:
再回到最初的问题: 一般美工在作页面时,会喜欢写法1的嵌套Html。如果一个夏姆,对用户体验要求高,同时预测到可能会在一些地方嵌入广告脚本会影响到页面显示,我会要求美工用方法2的方式来书写源文件,以保证用户体验。页面的设计,减少嵌套的层次,对页面的加载会好处多多的。 最后,我家儿子刚过一周岁,文章的最后祝福一下我家小宝贝。
参考资料: <div>嵌套<div>后的显示速度问题
关于DIV和表格的速度评论
把所有东西都放在一个大DIV里,显示速度问题。
整个网页面用一个DIV包含起来好不好
March 19 NLB是如何做负载分流计算的网络负载平衡采用一种完全分布式的算法,根据传入客户端的 IP 地址和端口,以统计方式将其映射到群集主机。此进程的发生不需要主机间进行任何通信。当发现到达的数据包时,所有主机同时执行这种映射,以快速确定哪个主机应当处理这个程序包。这种映射一直保持不变,直到群集主机数发生更改时为止。与集中式负载平衡应用程序相比,网络负载平衡筛选算法处理数据包的效率更高,因为前者必须修改和重新传送数据包。 如下图:
这个统计算法在 Wlbs.sys 组件中实现。 有关这个算法细节可以搜索关键字:“Load Balancing Algorithm” 下面是一些相关文章链接: How Network Load Balancing Algorithm works internally
为了协调其操作,网络负载平衡主机在群集内周期性地交换检测信号。IP 多播允许主机监控群集状态。当群集状态更改时(例如当主机发生故障、离开或加入群集时),网络负载平衡将调用称作“聚合”的过程,在该过程中,主机交换数量有限的消息,以确定群集的新的一致状态,并为主机指定最高主机优先级,即作为新的默认主机。当所有群集主机在正确的新群集状态下取得一致后,它们将在 Windows 事件日志中记录聚合的完成。完成这个过程一般用不了 10 秒种。 在聚合过程中,其余主机继续处理传入的网络通信。对工作主机的客户端请求不受影响。完成聚合后,将以故障主机为目标的通信重新分发给仍在工作的主机。经过负载平衡后的通信将在仍在工作的主机间得到重新划分,以便尽可能好地实现特定 TCP 或 UDP 端口的新的负载平衡。 如果向群集添加了一个主机,则聚合允许该主机接收自己那份经过负载平衡的通信。群集的扩展不影响正在进行的群集操作,而且其实现过程对 Internet 客户端和服务器应用程序都是透明的。但是,当选择了“客户端相似性”时,它可能影响跨多个 TCP 连接的客户端会话,因为可能会将客户端重映射到连接间的不同群集主机。有关相似性的详细信息,请参阅网络负载平衡和状态可控的连接。 网络负载平衡假定,主机在群集内正常工作的时间与它同其他群集主机交换检测信号的时间一样长。如果在多次检测信号交换中,其他主机都没有接收到来自任何成员的响应,则它们将启动聚合,重新分发本来应由失败主机处理的负载。 对于消息交换时段以及启动聚合所需的丢失的消息数,您都可以进行控制。默认值设置分别为 1000 毫秒(1 秒)和 5 个丢失的消息交换时段。由于一般都不修改这些参数,所以无法通过“网络负载平衡属性”对话框配置它们。必要时,可以在注册表中手动调整它们。调整聚合参数对完成此操作的过程进行了描述。 如下图所示发生群机主机变更时的处理。
聚集前的NLB集群 聚集后的NLB集群
参考资料: How Network Load Balancing Technology Works Appendix B - Network Load Balancing Technical Overview
网络负载平衡的工作原理 March 18 ASP.net2.0的machineKeymachineKey的作用在于下述场景:
ASP.net 1.0 以及 ASP.net 1.1, 我们都可以在下面地址的文件中找到machineKey的配置信息: %Windir%\Microsoft.NET\Framework\<version>\config\machine.config 不同的是 ASP.net 1.0 找到的是如下的配置信息 <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" /> ASP.net 1.1 找到的是如下信息: <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" /> 但是 ASP.net 2.0 , .net Framework 3.0 ,.net Framework 3.5 这些版本中,我们在 %Windir%\Microsoft.NET\Framework\<version>\config\ 目录的 machine.config 和 web.config 中找不到machineKey的设置。 这是因为, ASP.net 2.0 中,machineKey 的默认设置没有写在配置文件中。 ASP.net 2.0 中,machineKey 的默认设置如下: <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" decryption="Auto" /> 我们如果要修改machineKey的默认设置,就需要在必要的地方新加machineKey的配置节点。 产生一个可用的 machineKey 配置信息可以使用下面地址提供的工具:
参考资料: How To: Configure MachineKey in ASP.NET 2.0
machineKey 元素(ASP.NET 设置架构)
March 17 ASP.net 的工作线程与请求队列ASP.net工作线程池当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程。 一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求。如果一个同步请求成为 I/O bound(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态。 这影响了可伸缩性,原因是线程池的可用线程是有限的。 这个数字的设置是在 machine.config 的 下述节点的 maxWorkerThreads 属性 <system.web> <processModel requestQueueLimit="num|Infinite" maxWorkerThreads="num" /> </system.web> maxWorkerThreads
ASP.net请求队列上述设置中,还有一个队列设置,如下:
默认情况下,这个可用分线程数为1000。下图为IIS6和IIS7中这个参数的设置地方。 IIS 7 的可用线程数设置
IIS 6 的可用线程数设置
如果所有请求处理线程全部阻塞以等待 I/O 操作完成,则其他请求排入队列等待线程释放。 最好的情况是吞吐量减少,因为请求等待较长的时间才能得到处理。 最坏的情况则是该队列填满,并且 ASP.NET 因 503“Server Unavailable”错误使后续请求失败。
参考资料: 在服务器端 Web 代码中使用线程和生成异步处理程序
ASP.NET 2.0 中的异步页
IIS 6.0 架构
IIS 7.0 架构
了解ASP.NET底层架构
网络负载平衡(Network Load Balancing)的工作原理最近正在研究如何把CSDN的论坛WEB服务器实现负载平衡(NLB)。下面就是我整理资料笔记: NLB 的工作原理NLB算法的特点:
要确保上面算法的特点,单播(Unicast ),多播(Multicast)实现NLB就会有以下的特点: NLB中的单播(Unicast)在单播模式下,NLB重新对每个NLB节点中启用NLB的网络适配器分配MAC地址(此MAC地址称为群集MAC地址),并且所有的NLB节点均使用相同的MAC地址(均使用群集MAC地址),同时NLB修改所有发送的数据包中的源MAC地址,确保使交换机不能将此群集MAC地址绑定在某个端口上。 工作在单播模式下的NLB可以在所有网络环境下正常运行,但是由于它的工作特性,具有以下两个限制:
单播模式的优点也很明显:它可以无缝地与大多数路由器和交换机协同工作。 如下图所示: 单播的其他注意项:
参考: 单播模式下的单个网络适配器
NLB中的多播(Multicast)在多播模式下,NLB不会修改NLB节点启用NLB的网络适配器的MAC地址,而是为它再分配一个二层多播MAC地址专用于NLB的通讯(此MAC地址称为群集MAC地址),这样NLB节点之间可以通过自己原有的专用IP地址进行通讯。 但是在多播模式中,NLB节点发送的针对群集IP地址MAC地址ARP(Address Resolution Protocol,地址解析协议)请求的ARP回复会将群集IP地址映射到多播MAC地址,而许多路由器或者交换机(包括CISCO的产品)会拒绝这一行为。当出现这种情况时,你必须在路由器和交换机上手动添加静态映射,将群集IP地址映射到群集的多播MAC地址。 这种模式的优点是可以通过在交换机的“内容可寻址存储器”(CAM) 表中创建静态项,从而使得入站流量仅到达群集中的主机。 还有一个缺点就是很多路由器不会自动将单播 IP 地址(群集的虚拟 IP 地址)与多播 MAC 地址关联起来。如果进行静态配置的话,一些路由器可以存在这种关联。若我们在NLB创建时选择多播的模式,在“群集IP配置”中的“网络地址”是以“03 -BF”开头,后面紧跟IP地址的十六进制表示。 如下图所示:
IGMP Multicast(IGMP多播)NLB算法需要NLB群集中的所有主机都能看到发往群集的每一个数据包。NLB不允许交换机将群集的MAC地址关联到交换机的某个特定端口,从而实现了这个目的。但是,这种做法也会带来不想要的副作用,就是发往NLB群集的所有数据包会在交换机上的所有端口上造成数据“洪水”。这不仅非常麻烦,而且必将会造成网络资源的浪费。 为了解决这个问题,一个被称作IGMP支持的新特性被引入到了Windows Server 2003之中。该特性有助于将数据“洪水”限制到交换机上与NLB计算机相连接的端口上。通过这种方式,非NLB的计算机不会看到发往NLB群集的数据,而与此同时,所有的NLB计算机都可以看到发往群集的数据,因此满足了NBL算法的要求。但是,应该指出的是:IGMP支持只有在NLB被配置多播(multicast)模式时才能启用。 在选择多播模式时,后面还有个复选项“IGMP Multicast(IGMP多播)”,若复选此项,就像多播操作模式一样,NLB 保留原厂 MAC 地址不变,但是向网络适配器中增加了一个 IGMP 多播地址。此外,NLB 主机会发出这个组的 IGMP 加入消息。如果交换机探测到这些消息,它可以使用所需的多播地址来填充自己的 CAM 表,这样入站流量就不会扩散到 VLAN 上的所有端口。这是这种群集模式的主要优点。缺点是有一些交换机不支持 IGMP 探测。除此之外,路由器仍然支持单播 IP 地址到多播 MAC 地址的转换。在IGMP多播模式下,将采用“01 – 00 - 5E”开头的MAC地址。在多播的模式下,实体主机之间可以互相通信。 如下图所示:
NLB对路由器的要求当群集已配置为在多播模式下工作时,如果网络负载平衡客户端正在通过路由器访问一个群集,请确保路由器满足以下要求:
单播模式对路由器没有要求。
参考: 多播模式下的单个网络适配器 多播模式下的多个网络适配器
附:单播(Unicast),多播(Multicast),广播(Broadcast) 的区别: 单播: 主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。 多播(组播): 主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。 广播: 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。 参考资料: Load Balancing and ASP.NET Web Farming with the Network Load Balancing Service in Windows Server 2003 网络负载平衡算法 Works 内部怎样 WEB farm - Load Balancing in Asp.net How to test web load balance 将asp.net迁移到Load Balance和NAS上的步骤 微软知识库中的关于负载均衡的HowTo文章汇总 TechNet 关于 网络负载平衡群集 的内容 下面文章中间谈到了负载均衡的工作原理 NLB配置中单播与多播区别 NLB群集 Using NLB with ISA Server Part 2: Layer 2 Fun with Unicast and Multicast Modes
IP多播概述 TCP/IP学习笔记之九 --- 广播和多播
网络负载平衡关键特性 Network Load Balancing Network Load Balancing Technical Overview March 13 information_schema.routines与sysobjects在建立存储过程前,我习惯于先检查存储过程是否存在,如果存在就建立,然后再创建。 这个检查的过程,现在有2种习惯写法,如下: if exists ( select * from information_schema.routines where specific_name = 'WorkOrdersForBlade' and specific_schema = 'dbo') begin drop procedure dbo.workordersforblade end go 或者 if exists ( select * from sysobjects where type = 'p' and name = 'WorkOrdersForBlade') begin drop procedure dbo.workordersforblade end go information_schema.routines 是SQL Server 2000开始新加的系统视图,它是以 sysobjects 和 syscolumns 系统表为基础建立的系统视图。它的字段更具备可读性。 用上面那个写法都没有问题。 在SQL Server 2005 以及 2008 的默认模板中,使用的是第一种写法。 显然,我们最好用经过整合后,更具备可读性的视图 information_schema.routines 。 参考资料: SQL Server 2008 联机丛书 对routines 视图的介绍
数据库中User和Schema的关系
ROUTINES
March 12 EditPlus 多行合并的方法March 11 VS2008的DataBase Project的项目模板目录公司正在统一存储过程的编写规范,为了更宜用,我们就修改了SQL Server Management Studio 和 Microsoft Visual Studio 2008 的模板文件。 SQL Server Management Studio 的模板文件所在的目录请参看我之前的博客: 改变 SQL Server Management Studio的模板 Visual Studio 2008 的DataBase Project(如下这个数据库项目)的模板则在 C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\Templates\Database Project Items 这个目录下。 注意:这跟其他类型项目的模板不是一个目录。 我这里要修改的模板就是下面方式建立的存储过程的模板。
额外多说一句,我是通过下面这个工具找到这个目录的。 Process Monitor 参考资料: |
|
|