안녕하세요? 이번 티스토링에서는 MSDTC(Microsoft Distributed Transaction Coordinator) 설정에 대해서 알아 보겠습니다. 이전 티스토링에서는 DB링크(DB Link)를 생성하는 방법을 알려드렸습니다. 마지막에 분산트랜잭션(Distributed Transaction) 오류를 잠깐 보여드렸습니다. 이러한 오류가 발생하는 원인과 해결 방법을 알려 드리겠습니다.

 

MS-SQL DB에서 SSMS로 DB 링크 생성하기~!!

 

 우선 트랜잭션(Transaction)에 대해서 알아 보겠습니다. 트랜잭션(Transaction)은 하나의 논리적 작업 단위로 수행되는 일련의 작업을 이야기 합니다. 조금 이해하기 어렵게 들립니다. 예를 들어서 설명을 드리겠습니다. 보통 계좌 이체로 이야기를 많이 합니다.

 홍길동이 본인 계좌에서 1,000원을 김철수에게 이체를 합니다(실제 시스템에서 더 복잡한 과정을 거치겠지만 이해를 돕기 위한 예제라는 것을 이해해 주시기 바랍니다).

 

 계좌이체 작업

 1. 계좌 이체 시작(BEGIN TRANSACTION)

 2. 홍길동 계좌 잔금 확인(계좌 잔금이 1,000원 이상인지 확인)

 3. 김철수 계좌 확인(존재하는 계좌인지 확인)

 4. 김철수 계좌로 1,000원 증가

 5. 총길동 계좌에 1,000원 감소

 6. 김철수 계좌로 부터 정상 입금이 되었는지 확인

 7. 계좌 이체 완료(COMMIT)

 

 7번까지 순차적으로 처리가 되면 계좌 이체가 됩니다. 여기서 4번까지 수행 후 시스템에 문제가 발생(Abort-네트워크 연결 차단과 같은)하여 처리가 중지가 되었습니다. 그렇게 되면 홍길동 계좌에 1,000원, 김철수 계좌에 1,000원이 있는 상태입니다(이런상태가 되면 은행은 어려워지겠죠??).

 

 이런 문제를 해결하기 위해서 1번처럼 계좌 이체 시작(Begin Transaction)이라는 명령을 합니다. 그리고 마지막에 계좌 이체 완료(Commit)라는 명령을 합니다. 1번이 시작되고 7번까지 완료 되기 전에 문제가 발생을 하면 1번 이후로 작업했던 내용이 원상 복구(Rollback)가 됩니다. 이제 조금 이해가 되실 껍니다. 1번부터 7번까지 계좌이체 작업이 정상적으로 처리가 되거나 계좌이체 작업이 취소 되거나 둘중에 하나가 됩니다(개그 콘서트가 생각이 납니다 ㅎㅎ).

 

 그러면 분산트랜잭션(Distributed Transaction)은 뭘까요? 위 예제에서 홍길동 계좌와 김철수 계좌가 같은 은행이라면(같은 시스템을 가진) 문제가 발생을 해도 원상 복구하는데 어려움이 없을껍니다. 하지만 서로 다른 은행이라면(다른 시스템을 가진) 좀 어려워 보이지 않나요? 분산트랜잭션은 논리적 또는 물리적으로 분산되어 있는 환경에서 하나의 작업으로 처리하는 것을 이야기 합니다.

 

 만약 프로그램적으로 이러한 분산트랜잭션을 처리하도록 구현을 해야 한다면? 본인의 담당 시스템 뿐만 아니라 상대편 시스템도 신경써야 합니다. 이러한 은행이 수십개가 존재한다면? 더욱 어려울껍니다. 마이크로소프트에서 분산트랜잭션(Distributed Transaction)을 쉽게 관리하고 처리 할 수 있도록 만든것이 MSDTC(Microsoft Distributed Transaction Coordinator)입니다.

 

 

 

 

1. MSDTC 설정

 그럼 지금부터 MSDTC 설정을 해보도록 하겠습니다. 윈도우 서버 2008(Windows Server 2008) 기준으로 설명을 드리겠습니다. 제어판 -> 관리 도구 -> 구성 요소 서비스를 실행합니다. 구성 요소 서비스 -> 컴퓨터 -> 내 컴퓨터 -> Distributed Transaction Coordinator -> 로컬 DTC에서 오른쪽 마우스를 클릭하여 속성(R)로 들어 갑니다. 윈도우 서버 2008 이전 버전에서는 구성 요소 서비스 -> 컴퓨터 -> 내 컴퓨터에서 오른쪽 마우스를 클릭하여 속성(R)로 들어가야 됩니다. 윈도우 서버 2008부터는 Distributed Transaction Coordinator(로컬 DTC) 항목으로 따로 분리가 되어 있습니다.

 

 

 

 로컬 DTC 송성 창이 뜹니다. 추적 탭을 살펴보면 출력 옵션에서 중단된 트랜잭션 추적(B), 수명이 긴 트랜잭션 추적(V)이 선택되어 있습니다. 트랜잭션이 중단되거나 처리시간이 오래 걸리는 트랜잭션을 추적합니다.

 로깅 옵션세션 중지(E)는 현재 실행 중인 모든 세션을 중지 시킵니다. 데이터 플러시(F)는 메모리에 남아 있는 추적 데이터를 디스크로 보냅니다. 최대 메모리 버퍼 수(페이지 크기 조정)(M)은 허용되는 최대 메모리 버퍼 수를 지정합니다. 기본값은 25입니다. 기본값 상태 그대로 둡니다.

 

 

 

 로깅 탭에서는 로그 정보를 저장할 폴더 위치(L)용량(C)을 지정 할 수 있습니다. 성능 향샹을 위해서 물리적으로 다른 위치의 디스크의 폴더를 지정할 수 있습니다. 기본값 상태 그대로 둡니다.

 

 

 

 보안 탭에서 설정이 중요합니다. 클라이언트 및 관리에서 원격 클라리언트 허용(R)은 외부에서 내부 DTC로 연결을 허용하도록 합니다. 원격으로 외부에서 DTC를 관리할 경우에 원격 관리 허용(M)를 선택하시면 됩니다.

 트랜잭션 관리자 통신에서는 인바운드 허용(I)을 선택하셔야 외부에서 DTC로 연결이 됩니다. 아웃바운드 허용(W)은 내부에서 외부로 트랜잭션을 수행을 해야된다면 선택하시면 됩니다.

 오라클과 같은 유닉스 기반의 데이터베이스와 분산트랜잭션을 처리하려면 XA 분산트랜잭션 프로토콜을 사용해야 됩니다. 그럴 경우에 XA 트랜잭션 사용(X)을 선택하시면 됩니다.

 

 

 

 

2. RPC(Remote Procedure Call)와 HOST 등록

 MSDTC 사이의 통신은 RPC(Remote Procedure Call)가 사용이 됩니다. RPCNetBIOS 이름으로 컴퓨터를 찾을 수 있기 때문에 IP만으로 두 컴퓨터를 찾지 못해 분산트랜잭션 오류를 발생시킵니다. 그렇기 때문에 두 컴퓨터의 host 파일에 등록을 해줘야 됩니다. 컴퓨터 이름을 알기 위해서는 제어판 -> 시스템을 실행하고 화면 가운데를 보면 컴퓨터 이름이 있습니다. 저는 TEST, SERVER라는 두 컴퓨터가 있습니다.

 

 

 

 

  host 파일C:\Windows\System32\drivers\etc\에 위치해 있습니다. 확장자명은 없이 host라는 이름의 파일이 있습니다. 메모장으로 열어서 아래와 같이 상대 컴퓨터의 IP와 컴퓨터 이름을 입력합니다.

 

 

 

 아래 그림은 상대편 SERVER 컴퓨터의 host 파일입니다.

 

 

 

 간략하게 표시를 하면 아래와 같습니다. 서로 상태편의 컴퓨터를 인식할 수 있도록 이름을 설정해 주었습니다.

 

 

 

 아래 그림과 같이 상대편 컴퓨터 이름으로 PING 명령어로 연결이 되는지 테스트를 해보시면 됩니다.

 

 

 

 여기까지 설정을 하시면 분산트랜잭션을 정상적으로 수행할 수 있습니다. 아래 그림과 같이 이전 티스토링에서 오류 났던 쿼리를 다시 실행해 보겠습니다.

 

BEGIN DISTRIBUTED TRAN DIS
    SELECT *
    FROM TEST1.ERPSYS.dbo.TERROR_CODE
ROLLBACK

 

 

 

 

 DTC 설정과 HOST 등록을 해도 분산트랜잭션이 수행되지 않는다면 방화벽을 확인해 보시기 바랍니다. DTC 관련 규칙이 사용되고 있는지 확인해 보시면 됩니다.

 

 

 이상으로 이번 티스토링을 마치겠습니다.

 

 

※ 쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있습니다.