

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# RabbitMQ 일시 중지된 대기열 동기화 문제 해결
<a name="rabbitmq-queue-sync"></a>

RabbitMQ용 Amazon MQ [클러스터 배포](rabbitmq-broker-architecture.md#rabbitmq-broker-architecture-cluster)에서 각 대기열에 게시된 메시지는 세 개의 브로커 노드 간에 복제됩니다. *미러링*이라고 하는 이 복제는 RabbitMQ 브로커에 고가용성(HA)을 제공합니다. 클러스터 배포의 대기열은 한 노드의 *기본* 복제본과 하나 이상의 *미러*로 구성됩니다. 미러링된 대기열에 적용되는 메시지 대기열에 넣기를 비롯한 모든 작업은 먼저 기본 대기열에 적용된 다음 해당 미러 전체에 복제됩니다.

예를 들어 미러링된 대기열이 기본 노드(`main`)와 두 개 미러(`mirror-1` 및 `mirror-2`)의 세 개 노드에서 복제된다고 가정합니다. 이 미러링된 대기열의 모든 메시지가 모든 미러에 전파되면 대기열이 동기화됩니다. 노드(`mirror-1`)가 일정 시간 사용할 수 없게 되더라도 대기열은 작동하고 계속 메시지를 대기열에 넣을 수 있습니다. 그러나 대기열을 동기화하려면 `mirror-1`을 사용할 수 없는 동안 `main`에 게시된 메시지를 `mirror-1`에 복제해야 합니다.

미러링에 대한 자세한 내용은 RabbitMQ 웹 사이트에서 [클래식 미러링된 대기열](https://www.rabbitmq.com/ha.html)을 참조하세요.

**유지 관리 및 대기열 동기화**

[유지 관리 기간](amazon-mq-rabbitmq-editing-broker-preferences.md#rabbitmq-edit-current-configuration-console) 중 Amazon MQ는 모든 유지 관리 작업을 한 번에 한 노드에서 수행하여 브로커가 계속 작동하도록 합니다. 따라서 각 노드의 작동이 다시 시작할 때 대기열을 동기화해야 할 수 있습니다. 동기화하는 동안 미러에 복제되어야 하는 메시지는 해당하는 Amazon Elastic Block Store(Amazon EBS) 볼륨에서 메모리로 로드되어 배치로 처리됩니다. 메시지를 배치로 처리하면 대기열을 더 빠르게 동기화할 수 있습니다.

대기열이 짧게 유지되고 메시지가 작으면 대기열이 성공적으로 동기화되고 예상대로 작업이 재개됩니다. 그러나 배치의 데이터 양이 노드의 메모리 한도에 가까워지면 노드에서 고용량 메모리 경보가 발생하여 대기열 동기화가 일시 중지됩니다. 메모리 사용량은 [CloudWatch의 브로커 노드 지표](amazon-mq-accessing-metrics.md) `RabbitMemUsed`와 `RabbitMqMemLimit`를 비교하여 확인할 수 있습니다. 메시지가 사용 또는 삭제되거나 배치의 메시지 수가 줄지 않으면 동기화가 완료될 수 없습니다.

**참고**  
대기열 동기화 배치 크기를 줄이면 복제 트랜잭션 수가 더 많아질 수 있습니다.

일시 중지된 대기열 동기화 문제를 해결하려면 `ha-sync-batch-size` 정책을 적용하고 대기열 동기화를 다시 시작하는 방법을 보여주는 이 자습서의 단계를 따릅니다.

**Topics**
+ [사전 조건](#rabbitmq-queue-sync-prerequisites)
+ [1단계: `ha-sync-batch-size` 정책 적용](#rabbitmq-queue-sync-step-1)
+ [2단계: 대기열 동기화 다시 시작](#rabbitmq-queue-sync-step-2)
+ [다음 단계](#rabbitmq-queue-sync-next-steps)
+ [관련 리소스](#rabbitmq-queue-sync-related-resources)

## 사전 조건
<a name="rabbitmq-queue-sync-prerequisites"></a>

이 자습서를 사용하려면 관리자 권한이 있는 RabbitMQ용 Amazon MQ 브로커 사용자가 있어야 합니다. 브로커를 처음 생성할 때 만든 관리자 사용자를 사용하거나 나중에 만들었을 수 있는 다른 사용자를 사용할 수 있습니다. 다음 표에는 필요한 관리자 사용자 태그 및 권한이 정규식(regexp) 패턴으로 나와 있습니다.


| Tags | regexp 읽기 | regexp 구성 | regexp 쓰기 | 
| --- | --- | --- | --- | 
| administrator | .\$1 | .\$1 | .\$1 | 

RabbitMQ 사용자를 생성하고 사용자 태그 및 권한을 관리하는 방법에 대한 자세한 내용은 [RabbitMQ용 Amazon MQ 브로커 사용자](rabbitmq-simple-auth-broker-users.md#rabbitmq-basic-elements-user) 단원을 참조하세요.

## 1단계: `ha-sync-batch-size` 정책 적용
<a name="rabbitmq-queue-sync-step-1"></a>

다음 절차에서는 브로커에서 생성되는 모든 대기열에 적용되는 정책을 추가하는 방법을 보여줍니다. RabbitMQ 웹 콘솔이나 RabbitMQ 관리 API를 사용할 수 있습니다. 자세한 내용은 RabbitMQ 웹 사이트에서 [관리 플러그 인](https://www.rabbitmq.com/management.html)을 참조하세요.

**RabbitMQ 웹 콘솔을 사용하여 `ha-sync-batch-size` 정책을 적용하려면**

1. [Amazon MQ 콘솔](https://console.aws.amazon.com/amazon-mq/)에 로그인합니다.

1. 왼쪽 탐색 창에서 **Brokers(브로커)**를 선택합니다.

1. 브로커 목록에서 새 정책을 적용할 브로커의 이름을 선택합니다.

1. 브로커 페이지의 **Connections(연결)** 섹션에서 **RabbitMQ 웹 콘솔** URL을 선택합니다. RabbitMQ 웹 콘솔이 새 브라우저 탭 또는 창에 열립니다.

1. 브로커 관리자 로그인 보안 인증 정보를 사용하여 RabbitMQ 웹 콘솔에 로그인합니다.

1. RabbitMQ 웹 콘솔의 페이지 상단에서 **Admin(관리자)**을 선택합니다.

1. **Admin(관리자)** 페이지의 오른쪽 탐색 창에서 **Policies(정책)**를 선택합니다.

1. **Policies(정책)** 페이지에서 브로커의 현재 **User policies(사용자 정책)** 목록을 볼 수 있습니다. **User policies(사용자 정책)** 아래에서 **Add / update a policy(정책 추가/업데이트)**를 확장합니다.
**참고**  
기본적으로 RabbitMQ용 Amazon MQ 클러스터는 `ha-all-AWS-OWNED-DO-NOT-DELETE`라는 초기 브로커 정책과 함께 생성됩니다. Amazon MQ는 브로커의 모든 대기열이 세 노드 모두에 복제되고 대기열이 자동으로 동기화되도록 이 정책을 관리합니다.

1. 새 브로커 정책을 생성하려면 **Add / update a policy(정책 추가/업데이트)**에서 다음을 수행합니다.

   1. **Name(이름)**에 정책의 이름을 입력합니다(예: **batch-size-policy**).

   1. **Pattern(패턴)**에 regexp 패턴 **.\$1**를 입력합니다. 이 경우 정책이 브로커의 모든 대기열과 일치합니다.

   1. **Apply to(적용 대상)**의 드롭다운 목록에서 **Exchanges and queues(교환 및 대기열)**를 선택합니다.

   1. **Priority(우선 순위)**에 vhost에 적용된 다른 모든 정책보다 큰 정수를 입력합니다. 지정된 시간에 RabbitMQ 대기열 및 교환에 정확히 하나의 정책 정의 집합을 적용할 수 있습니다. RabbitMQ는 가장 높은 우선 순위 값과 일치하는 정책을 선택합니다. 정책 우선 순위 및 정책을 결합하는 방법에 대한 자세한 내용은 RabbitMQ Server 설명서에서 [정책](https://www.rabbitmq.com/parameters.html#policies)을 참조하세요.

   1. **Definition(정의)**에 다음 키-값 페어를 추가합니다.
      + **ha-sync-batch-size**=*100*. 드롭다운 목록에서 **Number(숫자)**를 선택합니다.
**참고**  
대기열에 있는 동기화되지 않은 메시지 수와 크기를 기준으로 `ha-sync-batch-size` 값을 조정하고 보정해야 할 수 있습니다.
      + **ha-mode**=**all**. 드롭다운 목록에서 **String(문자열)**을 선택합니다.
**중요**  
`ha-mode` 정의는 모든 HA 관련 정책에 필요합니다. 생략하면 검증이 실패합니다.
      + **ha-sync-mode**=**automatic**. 드롭다운 목록에서 **String(문자열)**을 선택합니다.
**참고**  
`ha-sync-mode` 정의는 모든 사용자 지정 정책에 필요합니다. 생략하면 Amazon MQ가 자동으로 정의를 추가합니다.

   1. **Add / update policy(정책 추가/업데이트)**를 선택합니다.

1. 새 정책이 **User policies(사용자 정책)**의 목록에 표시되는지 확인합니다.

**RabbitMQ 관리 API를 사용하여 `ha-sync-batch-size` 정책을 적용하려면**

1. [Amazon MQ 콘솔](https://console.aws.amazon.com/amazon-mq/)에 로그인합니다.

1. 왼쪽 탐색 창에서 **Brokers(브로커)**를 선택합니다.

1. 브로커 목록에서 새 정책을 적용할 브로커의 이름을 선택합니다.

1. 브로커 페이지의 **Connections(연결)** 섹션에서 **RabbitMQ 웹 콘솔** URL을 기록합니다. 이는 HTTP 요청에서 사용하는 브로커 엔드포인트입니다.

1. 새 터미널 또는 원하는 명령줄 창을 엽니다.

1. 새 브로커 정책을 생성하려면 다음 `curl` 명령을 입력합니다. 이 명령에서는 대기열이 `%2F`로 인코딩된 기본 `/` vhost에 있다고 가정합니다.
**참고**  
*사용자 이름*과 *비밀번호*를 브로커 관리자 로그인 보안 인증 정보로 바꾸세요. 대기열에 있는 동기화되지 않은 메시지 수와 크기를 기준으로 `ha-sync-batch-size` 값(*100*)을 조정하고 보정해야 할 수 있습니다. 브로커 엔드포인트를 이전에 기록한 URL로 바꿉니다.

   ```
   curl -i -u username:password -H "content-type:application/json" -XPUT \
   -d '{"pattern":".*", "priority":1, "definition":{"ha-sync-batch-size":100, "ha-mode":"all", "ha-sync-mode":"automatic"}}' \
   https://b-589c045f-f8ln-4ab0-a89c-co62e1c32ef8.mq.us-west-2.amazonaws.com/api/policies/%2F/batch-size-policy
   ```

1. 브로커의 사용자 정책에 새 정책이 추가되었는지 확인하려면 다음 `curl` 명령을 입력하여 모든 브로커 정책을 나열합니다.

   ```
   curl -i -u username:password https://b-589c045f-f8ln-4ab0-a89c-co62e1c32ef8.mq.us-west-2.amazonaws.com/api/policies
   ```

## 2단계: 대기열 동기화 다시 시작
<a name="rabbitmq-queue-sync-step-2"></a>

브로커에 새 `ha-sync-batch-size` 정책을 적용한 후 대기열 동기화를 다시 시작합니다.

**RabbitMQ 웹 콘솔을 사용하여 대기열 동기화를 다시 시작하려면**
**참고**  
RabbitMQ 웹 콘솔을 열려면 이 자습서 1단계의 이전 지침을 참조하세요.

1. RabbitMQ 웹 콘솔의 페이지 상단에서 **Queues(대기열)**를 선택합니다.

1. **Queues(대기열)** 페이지의 **All queues(모든 대기열)**에서 일시 중지된 대기열을 찾습니다. **정책** 열에서 생성한 새 정책의 이름(예: `batch-size-policy`)이 대기열에 표시되어야 합니다.

1. 줄어든 배치 크기로 동기화 프로세스를 다시 시작하려면 먼저 대기열 동기화를 취소합니다. 그런 다음 대기열 동기화를 다시 시작합니다.

**참고**  
동기화가 일시 중지되고 성공적으로 완료되지 않으면 `ha-sync-batch-size` 값을 줄이고 대기열 동기화를 다시 시작해 보세요.

## 다음 단계
<a name="rabbitmq-queue-sync-next-steps"></a>
+ 대기열이 동기화되면 Amazon CloudWatch 지표 `RabbitMQMemUsed`를 확인하여 RabbitMQ 노드에서 사용하는 메모리 양을 모니터링할 수 있습니다. 또한 `RabbitMQMemLimit` 지표를 확인하여 노드의 메모리 제한을 모니터링할 수 있습니다. 자세한 내용은 [Amazon MQ의 CloudWatch 지표 액세스](amazon-mq-accessing-metrics.md) 및 [RabbitMQ용 Amazon MQ 브로커에 사용 가능한 CloudWatch 지표](rabbitmq-logging-monitoring.md) 단원을 참조하세요.
+ 대기열 동기화 일시 중지를 방지하려면 대기열을 짧게 유지하고 메시지를 처리하는 것이 좋습니다. 메시지 크기가 더 큰 워크로드의 경우 브로커 인스턴스 유형을 메모리가 더 많은 더 큰 인스턴스 크기로 업그레이드하는 것이 좋습니다. 브로커 인스턴스 유형 및 브로커 기본 설정 편집에 대한 자세한 내용은 [브로커 기본 설정 편집](amazon-mq-rabbitmq-editing-broker-preferences.md) 섹션을 참조하세요.
+  새 RabbitMQ용 Amazon MQ 브로커를 생성할 때 Amazon MQ는 브로커 성능을 최적화하기 위해 기본 집합의 브로커 정책 및 가상 호스트 제한을 적용합니다. 브로커에 권장되는 기본 정책 및 제한이 없는 경우 직접 생성하는 것이 좋습니다. 기본 정책 및 vhost 제한을 생성하는 방법에 대한 자세한 내용은 [https://docs.aws.amazon.com//amazon-mq/latest/developer-guide/rabbitmq-defaults.html](https://docs.aws.amazon.com//amazon-mq/latest/developer-guide/rabbitmq-defaults.html) 단원을 참조하세요.

## 관련 리소스
<a name="rabbitmq-queue-sync-related-resources"></a>
+  [UpdateBrokerInput](https://docs.aws.amazon.com/amazon-mq/latest/api-reference/brokers-broker-id.html#brokers-broker-id-model-updatebrokerinput) - Amazon MQ API를 사용하여 브로커 인스턴스 유형을 업데이트하려면 이 브로커 속성을 사용합니다.
+ [파라미터 및 정책](https://www.rabbitmq.com/parameters.html)(RabbitMQ Server 설명서) - RabbitMQ 웹 사이트에서 RabbitMQ 파라미터 및 정책에 대해 자세히 알아봅니다.
+ [RabbitMQ 관리 HTTP API](https://pulse.mozilla.org/api/) - RabbitMQ 관리 API에 대해 자세히 알아봅니다.