posted by 방랑군 2009. 12. 22. 15:18


참조 : http://blog.naver.com/dhysys?Redirect=Log&logNo=50039413036


BizTalk Server를 설치하러 다니다보면 꼭 한번은 격는 문제중에 하나는 MSDTC 문제입니다.

문제가 생기면 인프라적인 문제와 애플리케이션적인 문제속에서 고민하느라 시간을 마구 잡아먹는 하마가 될 경우도 종종 발생합니다.

 

오늘은 그동안 사이트를 돌아다니면서 여러가지 시도해본것중에 필요한 스텝만 정리해보도록 하겠습니다.

 

그럼 MSDTC가 무엇이냐?

DTC(Distributed Transaction Coordinator) 서비스는 데이터베이스, 메시지 큐, 파일 시스템 등 두 가지 이상의 트랜잭션 보호 리소스를 업데이트하는 트랜잭션을 조정합니다. 단일 환경의 컴퓨터나 또는 네트워크 상에 있는 분산환경의 컴퓨터들의 트랜잭션 리소스를 보호합니다. blah..blah..blah.. 자세한 설명은 링크를 확인하시기 바랍니다. 한국어 페이지는 열리지 않는군요..

 

큰 내용을 살펴보면 트랜잭션을 사용하는 상황에서 그것도 분산환경 상에서 그것을 보장해주는 기술입니다.

 

트랜잭션 (Transaction) 이란?

정보의 교환이나 데이터베이스 갱신 등 연관되는 작업들에 대한 일련의 연속을 의미...

 

예를들어 은행 ATM기를 사용할때 A라는 고객과 B라는 고객에 서로 다른 위치에서 같은 구좌의 돈을 찾게 되는 상황이 발생하였을때 B라는 사람이 먼저 조회를 했지만 A라는 사람이 돈을 찾아버리게 되면 B가 조회한 내용과 찾을 수 있는 돈이 달라지면서 문제가 발생할 수 있습니다. 이럴때에 구좌의 돈(데이터)의 무결성을 보장해주는것이 트랜잭션이라고 생각하시면 됩니다.

 

분산환경에서 트랜잭션을 보호해준다!

이렇게 보았을때는 괴장히 비즈니스에 도움을 주는 기술입니다. 하지만! 이것이 Microsoft사에서 나왔기때문에.. Microsoft 제품 (SQL, MSMQ)에 제한적으로 지원됩니다. 물론 Oracle 같은 경우도 지원을 하지만 Version을 매우 따지기때문에 아무래도 이기종간 (Oracle, DB2, HOST, CA...)에 사용하기에는 좀 무리가 있습니다.

 

사설이 길었지만... 이기술이 BizTalk Server에서도 사용되어지고 있습니다. BizTalk Server 와 Message Box(SQL) 사이에 트랜잭션 그리고 BizTalk Server 와 분산환경의 SQL Server와 통신하기 위해서 사용되고 있습니다.

 

그렇다면 왜! Microsoft 제품군을 설치하는데 문제가 발생할까?

BizTalk Server를 설치하게 되면 절대! 같은 머신에 설치하는 경우가 없습니다. 테스트 용도 또는 아주 작은 사이즈에서는 가끔 설치하기도 하지요.. 그렇게 되면 BizTalk Server와 Message Box 사이가 분산환경이 되버리면서.. IP Filtering, FireWall, Security... 같은 아주 다양한 문제와 맞이 하게 됩니다.

 

MSDTC는 분산환경에서 트랜잭션을 보장하기 위해 매우 많은 포트를 사용하고 있습니다. 그것도 동적으로! 가끔 너무 많은 포트를 사용한다는 고객사로부터 듣습니다.

 

MSDTC관련 오류가 발생하였다!! 무엇을 확인해야할까?

 

1. 방화벽 체크

MSDTC를 사용하기 위해서는 필요한 포트가 있습니다. 반드시 포트가 오픈되었는지 확인해야 합니다.

다음의 포트리스트는 일반적으로 BizTalk Server에서 필요로 하는 포트입니다. 

 

2. MSDTC 구성 체크

로컬 머신과 MSDTC통신을 하고 싶은 리모트 머신의 MSDTC구성을 확인합니다.

(1) Application Server

Windows Add/Remove -> Applicatoin Serve에서 "Enable network COM+ access", "Enable network DTC acess"를 체크하여 설치하도록 합니다.

 

 

(2) MSDTC Security Configuration

 

Start->Administrator Tools->Component Services에서 트리노드를 확장하여 "My Computer"에서 속성버튼을 클릭합니다.

"COM Security"탭으로 이동 "Security Configuration"을 클릭합니다.

 

- "Network DTC Access" 체크

- "Allow Remote Clients, Allow Remote Administration" 체크

- "Allow Inbound, Allow Outbound, Incomming Caller Authentication Required" 체크

 

** Windows 2003 Server 버전을 기준으로 설명하고 있습니다. Window Server 2003 이전 버전은 Regstry에서 설정하여야 합니다.

     

(3) Port Range assignment

기본적으로 포트의 제한을 걸지 않은 상태라면 0~65535라는 말 그대로 몽땅 다 이용하도록 되어있습니다.

일반적으로 기업내에서 모든 포트를 다 열어주지 않기 때문에 제한을 하도록 합니다. 일반적으로 200개 정도를 동적포트로 할당합니다.

 

 

** 로컬 머신과 리모트 머신 모두 구성해야됩니다.

자 이렇게 하면 기본적인 구성은 완료가 되었다. 하지만.. 실제 해보면 안되는 경우가 비일비재 합니다.. 이제 몇가지 사항을 더 확인해보고 Microsoft에서 제공하는 Tool을 이용하면 당신은 MSDTC를 멋지게 연결할 수 있을것입니다.

 

3. HOST명, IP 확인

MSDTC연결은 HOST명으로 연결되기 때문에 HOST명과 IP가 동일한지 반드시 확인해봐야 합니다.

AD(Active Directory)환경이라면 Domain Server에서 HOST명과 IP를 연결해 줍니다.

AD환경이 아니라면 "C:WINDOWSsystem32driversetc" hosts파일에서 지정할 수 있습니다.

 

 

** 한번 이런경우가 있었습니다. AD환경이기 때문에 아무생각없이 테스트를 하고 있었는데 아무리 해도 연결이 안되는겁니다.

    나중에 알고보니 hosts파일에 IP가 고정되어 전혀 다른 컴퓨터를 바라보고 테스트를 하고 있었습니다. hosts파일을 수정한 후에야

    정상적으로 연결할 수 있었습니다.

 

4. 컴퓨터 방화벽 체크

Windows 2003, XP, Vista... 등에서는 기본적으로 방화벽을 제공 하고 있습니다. 방화벽에 MSDTC를 사용할 수 있도록 구성하거나 방화벽 사용을 중지하여야 합니다.

 

 

5. Microsoft에서 제공하는 툴로 점검하기 (DTCPing, DTCTester, TCPView)

Microsoft에서 제공하는 툴로 정상적으로 RPC통신이 되는지 포트가 열리는지를 확인할 수 있습니다.

(1) DTCPing

가장 기본적으로 사용하는 툴로서 방화벽이 제대로 열렸는지 확인 할 수 있습니다. RPC통신에 필요한 포트를 확인합니다.

실제 통신은 하지 않기 때문에 통신은 되지만 안되는 경우가 발생할 수 있습니다.

 

1. 서버와 클라이언트에 모두 실행되어야 합니다.

 

2. HOST명으로만 연결할 수 있습니다. (AD환경이 아니라면 HOST파일에 정의되어야 합니다.)

 

** 다운로드는 여기서 받을 수 있습니다.

 

(2) DTCTester

DTCPing이 기본적인 RPC통신 확인만 한다면 DTCTester는 실제 SQL데이터베이스에 DTC작업을 합니다. MSDTC가 되는지 확실하게 테스트해 볼 수 있습니다.

1. SQL에 데이터베이스가 있는 환경에서만 사용할 수 있습니다.

 

** ODBC Data source를 이용하여 연결하기 때문에 테스트하려는 서버의 SQL의 Data Source를 반드시 만들어야 합니다.

 

2. SQL데이터베이스에 하는 작업은 다음과 같습니다.

** 사용방법은 "dtctester.exe <dsn name> <user name> <password>" 입니다.

 

- SQL 서버의 데이터 원본명(DSN)으로 연결을 합니다.

- 임시 테이블을 생성합니다.

- 트랜잭션을 초기화 합니다.

- 임시테이블에 데이터를 입력합니다.

- 분산트랜잭션을 커밋합니다.

- 커밋이 되었는지 확인합니다.

- 컨넥션을 종료합니다.

 

 

** 사용방법은 여기서 볼 수 있습니다.

    다운로드는 여기서 받을 수 있습니다.

  

(3) TCPView

"netstat -na"와 비슷한 기능을 제공합니다. 현재 열린 포트 목록과 상태들을 확인 할 수 있습니다. GUI기반으로 좀더 편하게 확인 할 수 있습니다.

 

** Dtcping.exe 가 1567포트로 열린것을 확인할 수 있습니다.

 

다운로드는 여기서 받을 수 있습니다.

 

MSDTC문제가 발생하면..같은 오류이지만 너무나도 많은 환경에 의해서 발생할 수 있습니다. 그 중에서 많이 해결했던 방법을 조금이나만 도움이 되길 바라면서 정리했습니다.