最近工作过程中遇到了一些关于Failover Cluster的小问题,记录一下:
1. 使用两台机器做数据库故障转移集群Failover Cluster部署。其中Cluster group name是cluGroup,Cluster group IP是10.1.1.45。部署在几个测试场,有一个测试环境里的某一个节点出现如下问题:
在Management Studio中连接数据库:
cluGroup,sa登录,正常
cluGroup,域账户登录,正常
10.1.1.45,sa登录,正常
10.1.1.45,域账户登录,连接超时
此问题只出现在某一个测试环境的某一个节点,另一台节点工作正常。修改连接超时时间,可连接,但是连接时间超过20秒,未查明原因。最后发现是域名反向解析的问题,增加10.1.1.45的反向解析解决此问题。
2. 在Failover Cluster中需要使用报表服务,最初的使用方式是使用报表服务的扩展部署(两个节点都启动报表服务),连接的数据库都是10.1.1.45。但是我们的应用服务只在活动节点上,也就是说实际上只用了活动节点上的报表服务。在这种情况下,在切换集群完毕时,应用服务调用报表服务生成报表总会出现System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.的错误。
同样在切换节点完成之后,应用调用报表服务发布报表,也会出现The request failed with HTTP status 401: Unauthorized。的错误
微软给出的结果是报表服务的扩展部署是应对负载做均衡的,而和故障转移一起使用不是推荐的方式,故不再其测试范畴。
准备编写集群脚本只在活动节点开启报表服务,并使应用服务连接本地的报表服务,待后续测试。
3. 数据库服务器身份验证采用混合认证模式。将域用户Domain/Account1加入到SQL Server Administrators中。 以域用户登录数据库服务器,创建用户数据库若干,之后其中一个用户数据库DB1创建程序集,并创建数据库function调用程序集中的方法。在节点一上调用此数据库function成功,切换到节点二上执行同样的操作失败。反复切换节点,始终是节点二不可正确执行。
Msg 10314, Level 16, State 11, Line 1
An error occurred in the Microsoft .NET Framework while trying to load assembly id 65546. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error:
System.IO.FileLoadException: Could not load file or assembly 'XXXXXX, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Exception from HRESULT: 0x80FC3C2C
System.IO.FileLoadException:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
若是我们将数据库所有者改为sa(而非域用户)则两台节点都可以正确执行。
做以下排查
A.
Use Interface
go
select * from sys.server_principals
select * from sys.database_principals
select * from sys.databases
未发现异常
B.
微软方面给出的回复是
Exception from HRESULT: 0x80FC3C2C
Could not obtain information about Windows NT group/user
可能是DC连接有问题
使用nltest /dsgetdc: domainname排错
最后结果就是没有结果,重启了服务器,问题不复现了,憔悴ing~~