Exchange Server Study (2-8). Queues and messages in queues
이번 포스팅에서는 아래의 내용에 다뤄보도록 하겠습니다.
Queues and messages in queues in Exchange Server | Microsoft Docs
우선 큐에 대한 기본적인 설명을 확인해 보겠습니다.
A queue is a temporary holding location for messages that are waiting to enter the next stage of processing or delivery to a destination.
큐는 다음 처리 단계로 들어가거나 대상으로 전달되기를 기다리는 메시지를 임시로 보관하는 위치입니다 .
우선 큐는 어떻게 확인할 수 있는지 알아보도록 하겠습니다.
Exchange Toolbox를 실행합니다.
Queue Viewer(큐 뷰어) 를 실행합니다.
아래와 같이 확인할 수 있으며, 큐 뷰어는 특정 서버의 큐만을 표시합니다. -> 전체 큐를 표시해주지 않습니다.
Connect to Server 를 클릭하면, 다른 서버의 큐를 확인할 수 있습니다.
같은 맥락으로 Get-Queue도 명령어를 입력한 서버만을 표시합니다.
Get-ExchangeServer|Get-Queue 명령어를 통해서 전체 큐 상태를 확인할 수 있습니다.
메일 송수신 동작이 없다면 아래와 같이 Submission - Ready가 확인됩니다.
만약 Transport Service가 동작되지 않는다면, 큐도 확인되지 않습니다.
그러면 지금까지 공부했던 Mail flow의 개념에서 큐의 동작을 확인해보겠습니다.
다음과 같이 Outbound 메시지를 발송해보겠습니다.
발송했을때의 기록은 1번서버에서 바로 발송된 것으로 확인됩니다.
프로토콜 로그를 기반으로 흐름을 그려보면 다음과 같은 흐름으로 발송되었습니다.
여기까지는 Mail flow에서 확인한 내용입니다.
그렇다면 큐까지 포함된 흐름은 다음과 같습니다.
아래와 같이 Receive Default Connector를 Disable 하거나 2525포트를 Block한다면, 메일 발송도 안 될 것으로 예상됩니다.
확인해 보기 위해 해당 커넥터들을 Disable 처리한 뒤, 발송을 시도해 봤습니다.
Hotmail.co.kr 로 보냈다고 가정을 합니다.
해당 도메인에 적합한 송신커넥터가 활성화되지 않았기 때문에 아래와 같이 Unreachable Domain으로 기록됩니다.
임시 보관함에서 보낸 편지함으로 이동되지 않는 것으로 확인됩니다.
Mailbox Proxy Send Connector 로그를 확인합니다.
아래와 같이 연결을 시도했으나 실패했다고 기록됩니다. 그리고 다른 서버의 Default Receive Connector 와 연결 시도하는 것을 확인할 수 있습니다.
Failed to connect. Winsock error code: 10060, Win32 error code: 10060, Destination domain: mailboxtransportsubmissioninternalproxy, Error Message: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 10.0.3.6:2525.
그러다가 다시 커넥터를 한 개라도 활성화하면 해당 커넥터로 발송을 시도하게 됩니다.
다음 단계인 Submission Queue에 쌓아 놓는 방법을 고민해 보았으나, 아직 찾지 못했습니다. Send Connector 를 Disable 하면 Delivery Queue에 쌓이지 않을까? 라는 생각으로 Disable을 진행해 보았습니다.
송신커넥터 Disable
limcmfz@hotmail.co.kr 로 보냈다고 가정했을 때, hotmail.co.kr 의 활성화된 송신커넥터가 없기 때문에 DeliveryType이 Unreachable 로 기록되며, NextHopDomain은 Unreachable Domain으로 기록 됩니다.
이번에는 내부 메일도 수신되지 않도록 Mailbox Transport Delivery Service를 중지하도록 하겠습니다.
(내부에 숨겨져 있는 커넥터들은 제어 할 수 없기 때문에 서비스를 중지하는 방법으로 접근하였습니다.)
서비스 중지
아래와 같이 큐가 쌓이는 것을 볼 수 있습니다.
그리고 Transport Service의 Protocol -> SmtpSend 로그를 보면 Failed to Connect. Winsock error:code: 10061 을 확인할 수 있습니다.
1. Types of queues
위와 같이 테스트를 진행하는 과정에서 큐 타입이 어느 부분을 설명하는지 눈에 익힐 수 있었습니다.
기술자료의 내용들을 테스트하려면 아래의 부분을 이해하고 넘어가야 합니다.
Delivery queues (배달 큐)
Holds messages that are being delivered to all internal and external destinations.
Delivery queues are dynamically created when they're required, and are automatically deleted when the queue is empty and the expiration time has passed. The queue expiration time is controlled by the QueueMaxIdleTime parameter on the Set-TransportService cmdlet. The default value is three minutes.
모든 내부 및 외부 대상에 배달되는 메시지를 보류합니다.
배달 큐는 필요한 경우 동적으로 만들어지며, 큐가 비어 있으며 만료 시간이 지나면 자동으로 삭제됩니다. 큐 만료 시간은 Set-TransportService cmdlet의 QueueMaxIdleTime 매개 변수에 의해 제어됩니다. 기본값은 3분입니다.
아래와 같이 MaxIdleTime을 30분으로 변경하면, 어떠한 큐가 발생했는지 30분간 기록됩니다.
2. Queue properties
이 파트는 기술자료와는 다른 순서로 작성하였습니다.
아래와 같이 발송후 큐를 순차적으로 확인해 보겠습니다.
테스트 환경에서는 Queue가 카운팅 되는 것을 보는게 어렵습니다. 그래서 Get-ExchangeServer|Get-Queue를 반복적으로 진행하여 관찰하였습니다.
1차 테스트
2차 테스트
우선 Status는 Ready -> Connecting -> Active -> Ready 순으로 변화하는 것으로 보입니다.
이 내용은 Queue status에 나와있습니다.
Queues and messages in queues in Exchange Server | Microsoft Docs
Message Count
An important queue property that's also worth mentioning here is the MessageCount property that shows how many messages are in a queue. This property is an important indicator of queue health. For example, a delivery queue that contains a large number of messages that continues to grow and never decreases could indicate a routing or transport pipeline issue that requires your attention.
여기서 언급할 가치가 있는 중요한 대기열 속성은 대기열에 있는 메시지 수를 표시하는 MessageCount 속성입니다. 이 속성은 대기열 상태의 중요한 지표입니다. 예를 들어 계속 증가하고 결코 감소하지 않는 많은 수의 메시지가 포함된 배달 큐는 주의가 필요한 라우팅 또는 전송 파이프라인 문제를 나타낼 수 있습니다.
MessageCount 는 IncomingRate, OutgoingRate 와 같이 봐야합니다.
Get-ExchangeServer|Get-Queue|fl
Property | Description |
IncomingRate | The rate that messages are entering the queue. The rate is the number of messages per second averaged over the last minute. 메시지가 대기열에 들어가는 비율입니다. 비율은 지난 1분 동안의 평균 초당 메시지 수입니다. |
OutgoingRate | The rate that messages are leaving the queue. The rate is the number of messages per second averaged over the last minute. 메시지가 대기열에서 나가는 비율입니다. 비율은 지난 1분 동안의 평균 초당 메시지 수입니다. |
Velocity (속도) | The drain rate of the queue, calculated by subtracting the value of IncomingRate from the value of OutgoingRate. OutgoingRate 의 값 에서 IncomingRate 의 값을 빼서 계산된 대기열의 배수율입니다 . If the value is greater than 0, messages are leaving the queue faster than they are entering the queue. 값이 0보다 크면 메시지가 대기열에 들어가는 것보다 더 빨리 대기열에서 나옵니다. If the value equals 0, messages are leaving the queue as fast as they are entering the queue. This is also the value you'll see when the queue is inactive. 값이 0이면 메시지는 대기열에 들어가는 속도만큼 빠르게 대기열을 떠납니다. 이것은 대기열이 비활성 상태일 때 표시되는 값이기도 합니다. If the value is less than 0, messages are entering the queue faster than they are leaving the queue. 값이 0보다 작으면 메시지가 대기열에서 나가는 것보다 더 빨리 대기열에 들어갑니다. Velocity 값은 Get-Queue 결과에 표시 됩니다. |
표현이 어렵기 때문에 정리가 필요합니다.
The rate is the number of messages per second averaged over the last minute.
지난 1분간의 In, Out 된 메시지의 속도를 초 단위로 표시합니다.
지난 1분동안 30건의 메시지를 처리했다고 가정합니다. 1분은 60초이기 때문에 30을 60으로 나눕니다.
30/60 = 0.5 m/s
지난 1분간 30건이 해당 큐에 들어왔으면 IncomingRate 0.5 입니다.
지난 1분간 30건이 해당 큐에서 빠져 나갔으면, OutgoingRate는 0.5입니다.
1분동안 30건이 들어 오고, 30건이 빠져 나갔다면, Velocity는 0입니다.
언제 측정하느냐에 따라 다르기 때문에 IncomingRate, OutgoingRate, Volocity는 양수, 음수, 0의 값이 나올 수 있습니다.
해당 값들은 Mail Flow를 이해하는데 많은 도움을 줍니다.
예를 들면 아래의 EX19MBX3의 Submission Queue의 경우 쌓여 있는 메일(Message Count)은 없지만, Incoming Rate, OutgoingRate를 통해서 메시지가 지나갔었다. 라는 것을 알 수 있습니다.
기술자료에서 주어진 것처럼 각각의 상황을 해석해 보겠습니다.
Velocity: -50 MessageCount: 1000 OutgoingRate: 10 IncomingRate: 60 |
큐에 쌓여 있는 Message가 1,000개
큐에 들어오는 Message는 1분당 60 * 60 = 3,600
큐에서 빠져나가는 메시지는 10 * 60 = 600
분당 쌓이는 메시지는 -50 * 60 = -3,000 개이므로 문제가 있다고 해석할 수 있습니다.
물론 각각의 수치는 명령어를 입력하는 시점에서 계속 유동적으로 변화합니다.
Velocity: -0.85 MessageCount: 2 OutgoingRate: 0.15 IncomingRate: 1 |
이 경우에는 Velocity 가 -0.85지만, 큐에 쌓여있는 Message가 2이므로 안정적인 상황으로 해석할 수 있습니다.
Velocity의 값은 상황에 따른 해석이 필요하며, 음수여도 MessageCount 가 0에 가깝다면 크게 문제가 되지 않는다 라고 기술자료에서 설명하는 것 같습니다.
Delivery Type
기술 자료상에서는 다양한 Delivery Type을 설명하고 있지만, 모든 유형을 테스트상에서 확인할 수는 없었습니다. 확인 가능한 내용들로만 확인해 보았습니다.
DnsConnectorDelivery
The queue holds messages for delivery to recipients in an SMTP domain. The Send connector that services the domain has the local transport server configured as source server, and the Send connector is configured to use DNS routing.
대기열은 SMTP 도메인의 받는 사람에게 배달할 메시지를 보유합니다. 도메인을 서비스하는 송신 커넥터에는 로컬 전송 서버가 원본 서버로 구성되어 있고 송신 커넥터는 DNS 라우팅을 사용하도록 구성되어 있습니다.
DNS 라우팅은 Smarthost를 사용하지 않는다는 의미 입니다.
해당 큐가 기록되는 조건은
1. 수신자가 조직 외부 도메인
2. 송신커넥터가 DNS 라우팅 사용
상세 정보를 보면 기술자료에서 언급하는 다음 내용들을 확인할 수 있습니다.
NextHopConnector는 송신커넥터의 Guid 인 것을 확인할 수 있습니다.
ShadowRedundancy
The queue holds messages in a shadow queue. A shadow queue holds redundant copies messages in transit in case the primary messages aren't successfully delivered.
큐는 섀도우 큐에 메시지를 보관합니다. 섀도우 대기열은 기본 메시지가 성공적으로 배달되지 않은 경우 전송 중인 중복 복사본 메시지를 보유합니다.
DAG가 구성되어 있으면 쉽게 확인할 수 있습니다. 모든 송수신 메시지에 대해서 복사본을 가지고 있습니다.
NextHopDomain은 복사본을 전달한 서버를 가르키고 있으며 Connector는 0으로 표시됩니다.
NextHopCategory는 내부에 백업으로 전송한 개념이기 때문에 Internal로 기록되는 것을 확인할 수 있습니다.
SmartHostConnectorDelivery
The queue holds messages for delivery to recipients in an SMTP domain. The Send connector that services the domain has the local transport server configured as source server, and the Send connector is configured to use smart host routing.
대기열은 SMTP 도메인의 받는 사람에게 배달할 메시지를 보유합니다. 도메인을 서비스하는 송신 커넥터에는 원본 서버로 구성된 로컬 전송 서버가 있고 스마트 호스트 라우팅을 사용하도록 송신 커넥터가 구성되어 있습니다.
커넥터를 아래와 같이 Smart host를 지정하여 설정
아래와 같이 발송
SmartHostConnectorDelivery 를 확인할 수 있습니다.
해당 Type은 External 발송시에 사용되는 것을 알 수 있으며, NextHopConnector 역시 송신커넥터로 기록됩니다.
SmtpDeliveryToMailbox
The queue holds messages for delivery to Exchange 2013 or later mailbox recipients. The destination mailbox database is in one of the following locations.
큐는 Exchange 2013 이상의 사서함 받는 사람에게 배달하기 위해 메시지를 보유합니다. 대상 사서함 데이터베이스는 다
음 위치 중 하나에 있습니다.
해당 Type은 DB에 존재하는 사서함이 수신될 때 기록됩니다.
아래와 같이 내부사용자가 수신되도록 테스트를 진행하였습니다.
아래와 같이 확인
NextHopDomain은 사서함 대상 DB로 기록되는 것으로 확인됩니다.
여기서 NexthopConnector는 DB의 Guid 인 것을 확인할 수 있습니다.
Unreachable
This value is used only on the Unreachable queue.
이 값은 Unreachable Queue 에서만 사용됩니다.
위에서도 언급 했듯이 해당 메일에 대해서 사용할 수 있는 커넥터가 없을 때 기록됩니다.