2014-12-18 2 views
1

테스트 환경에서 Windows Server 장애 조치 (Failover) 클러스터를 설치하고 클러스터 된 SQL Server 2014 인스턴스를 설치했습니다. 클러스터에는 두 개의 노드가 있고 네트워크 이름은 SQLINSTANCE입니다.SQL Server 2014 클러스터 장애 조치 인스턴스, 장애 조치시 다시 연결하는 방법?

지금 작은 콘솔 응용 프로그램에서 내가 테스트 데이터베이스를 100ms마다 쿼리 (잘 실행) 간단한 루프가 있습니다 (

while (true) 
{ 
    using (var dbContext = new TestDBContext()) 
    { 
     foreach (var person in dbContext.People) 
     { 
      Console.WriteLine(person.FirstName + " " + person.LastName); 
      System.Threading.Thread.Sleep(100); 
     } 
    } 
} 

지금 내가 클러스터에 강제로 장애 조치를 하나 하나 개의 노드를 종료하여, 또는 SQL Server 역할을 Cluster Manager에서 다른 노드로 이동). 장애 조치 프로세스에는 약 50 초가 소요됩니다. 장애 조치가 완료되면 내 테스트 루프에서 EntityException을 throw하여 "기본 공급자가 열려있을 때 실패했습니다"라고 말합니다. InnerException은 SqlClient.SqlException입니다. "로그인 할 수없는 데이터베이스"TestDB "를 열 수 없습니다. 로그인에 실패했습니다. 'Domain \ User'사용자가 로그인하지 못했습니다."

내 연결 문자열을 다음과 같이 설정을했습니다가 :

<add name="TestDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient; 
     provider connection string=&quot;data source=sqlinstance;initial catalog=TestDB;integrated security=True; 
     MultiSubnetFailover=true; 
     connect timeout=150; 
     ConnectRetryCount=15; 
     ConnectRetryInterval=10; 
     MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

내가 뭘 기대 한 것은하는 SqlClient 10 secondes 간격, 15 시간 내 clusterd 인스턴스에 다시 연결을 시도하는 것입니다, 그리고 성공적인 때 다시 연결 장애 조치가 완료되었습니다. 그러나 여전히 예외는 계속 발생하고 있습니다.

본인은 "연결 시간 초과", "ConnectRetryCount"와 "ConnectRetryInterval"값을 변경하려고했지만 여전히 내가 여기서 무엇을 놓치고 나는 매우 혼란 스러워요 장애 복구 후 더 성공 전체 재 연결 ...

는 없다 , 또는 기본 SqlClient 의존 할 수 및 예를 들어 DAL 내 owm 재시도 논리 제공해야합니까 ???

+0

그리고 예외는? 아마도 장애 조치가 완료 되었기 때문에 묻는 중입니다. 그러나 모든 데이터베이스가 온라인 상태가 아니기 때문에 ... –

+0

"기본 공급자가 열리지 못했습니다"라는 EntityException입니다. InnerException은 SqlClient.SqlException입니다. "로그인 할 수없는 데이터베이스"TestDB "를 열 수 없습니다. 로그인에 실패했습니다. 'Domain \ User'사용자가 로그인하지 못했습니다." 페일 오버가 완료되는 순간에 문제가 발생합니다. Btw 나는 또한이 상세한 예외 정보와 함께 나의 저능을 편집했다 ... – Jeroen1984

+0

문제는 데이터베이스를 opend 할 수 없다. 왜 이것이 appens? SQL Server를 다시 시작할 때마다 데이터베이스에 대한 검사가 필요합니다. 크기 및 보류중인 거래에 따라 며칠에서 며칠이 걸릴 수 있습니다. 오류 로그에서이를 확인할 수 있습니다. "데이터베이스 'dbname'시작하기 '와 같은 검사 메시지와 검사 상태에 대한 정보를 제공하는 메시지를 찾을 수 있습니다. –

답변

1

나는이 모든 것에 대해 전문가가 아니며, 특히 C#이 db 연결을 처리하는 방법을 잘 모르겠습니다. 우리 응용 프로그램 중 하나에서 보았던 것은 AlwaysOn 클러스터의 db와의 연결을 열었을 때 응용 프로그램을 장애 조치 할 때 연결이 실제로 현재 연결되어있는 노드로가는 동일한 기본 TCP 연결을 사용하고 있다는 것입니다 변경되었습니다. 우리에게있어 해결책은 예외 잡기에 제대로 다시 연결하는 것이 었습니다.

+0

안녕하세요. 너의 대답에 걸쳐 왔어. 우리는 우리 환경에서 비슷한 상황에 직면 해 있다고 생각합니다. 장애 조치에도 불구하고 응용 프로그램이 여전히 현재 보조 노드에 연결되어 있습니다. 솔루션이 당신에게 무엇을했는지 좀 자세히 설명해 주시겠습니까? – Crabster

+0

안녕하세요 @Crabster. 내가 너에게 더 많은 것을 줄 수 있을지 확신하지 못한다. 응용 프로그램은 이미 데이터베이스 연결의 상태를 확인하고 연결 삭제시 재 연결을 시도했습니다. 그러나 데이터베이스를 변경하려고 할 때 예외가 발생합니다. 궁극적으로 다음과 같이 내려갔습니다 (100 % 확신하지는 못했습니다). 요청을 서버로 보낼 때 전송 수준 오류가 발생했습니다. (공급자 : TCP 공급자, 오류 : 0 - 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.) 그래서 우리는 예외를 잡아서 데이터베이스 연결을 다시 열었습니다. – ikkjo

관련 문제