30.3. 데이터 복제

복제를 사용하면 라이브 및 백업 서버 쌍이 동일한 데이터 디렉터리를 공유하지 않으며 네트워크를 통해 모든 데이터 동기화가 수행됩니다. 따라서 라이브 서버에서 수신하는 모든 (영구) 데이터가 백업에 복제됩니다.

라이브 서버가 완전히 종료되면 백업 서버가 활성화되고 클라이언트가 백업으로 장애 조치됩니다. 이 동작은 미리 결정되므로 데이터 복제를 사용할 때 구성할 수 없습니다.

백업 서버는 먼저 교체하기 전에 먼저 라이브 서버의 모든 기존 데이터를 동기화해야 합니다. 공유 스토리지와 달리, 복제 백업은 시작 후 즉시 완전히 작동하지 않습니다. 동기화가 진행되는 데 걸리는 시간은 동기화할 데이터 양과 네트워크 속도에 따라 다릅니다. 또한 백업이 시작될 때 클라이언트가 initial-replication-sync-timeout 기간 동안 차단됩니다. 이 시간 초과가 경과하면 동기화가 완료되지 않았더라도 클라이언트는 차단 해제됩니다.

장애 조치에 성공하면 백업의 저널이 라이브 서버의 데이터보다 최신 데이터를 저장하기 시작합니다. 장애 조치를 수행하도록 원래 라이브 서버를 구성하고 다시 시작되면 라이브 서버가 될 수 있습니다. 장애 복구는 라이브 서버가 다시 온라인 상태가 되기 전에 백업과 라이브 서버 간에 데이터를 동기화합니다.

두 서버가 모두 종료된 경우 관리자는 최신 데이터가 있는 서버의 저널을 확인해야 합니다. 백업 저널에 최신 데이터가 있는 경우 해당 저널을 라이브 서버에 복사합니다. 그렇지 않으면 백업이 라이브 서버에서 오래된 저널 데이터를 복제하고 자체 저널 데이터를 삭제합니다. 라이브 서버의 데이터가 최신인 경우 작업을 수행할 필요가 없으며 정상적으로 서버를 시작할 수 있습니다.

중요

대기 시간이 길고 잠재적으로 불안정한 네트워크로 인해 데이터 센터 간에 고가용성을 위해 복제된 저널을 구성하고 사용하는 것은 권장되거나 지원되지 않습니다.

실시간 및 백업 쌍 복제는 클러스터의 일부여야 합니다. cluster-connection 구성 요소는 백업 서버가 실시간 일치를 찾는 방법을 정의합니다.

이러한 위험을 제거할 수는 없지만 복제에는 네트워크 격리의 위험을 줄이기 위해 최소 3개의 실시간/백업 쌍이 필요합니다. 3개 이상의 라이브/백업 쌍을 사용하는 경우 클러스터에서 쿼럼 투표를 사용하여 두 개의 라이브 브로커를 사용하지 않도록 할 수 있습니다.

cluster-connection 을 구성할 때 다음 세부 사항을 기억하십시오.

  • 라이브 및 백업 서버 모두 동일한 클러스터의 일부여야 합니다. 간단한 실시간/백업 복제 쌍도 클러스터 구성이 필요합니다.
  • 이 쌍의 각 서버에서 클러스터 사용자 및 암호가 일치해야 합니다.

<master> 및 <slave> 요소 모두에서 group-name 속성을 구성하여 라이브/백업 서버 쌍을 지정합니다. 백업 서버는 동일한 그룹 이름을 공유하는 라이브 서버에만 연결됩니다.

그룹 이름 사용의 예로는 세 개의 라이브 서버와 3개의 백업 서버가 있다고 가정합니다. 각 라이브 서버는 자체 백업과 연결해야 하므로 다음 그룹 이름을 할당합니다.

  • live1 및 backup1은 pair1 의 그룹 이름을 사용합니다.
  • live2 및 backup2는 pair2 의 그룹 이름을 사용합니다.
  • live3 및 backup3은 pair3 의 그룹 이름을 사용합니다.

이 예에서 server backup1 은 동일한 group-name,pair1 의 라이브 서버를 검색합니다. 이 경우 서버 live1 입니다.

공유 저장소의 경우와 마찬가지로, 라이브 서버가 중지되거나 충돌하면 복제된 백업이 활성화되고 해당 작업을 대신합니다. 특히, 라이브 서버와의 연결이 끊어지면 쌍된 백업이 활성화됩니다. 이는 임시 네트워크 문제로 인해 발생할 수 있기 때문에 문제가 될 수 있습니다. 이 문제를 해결하기 위해 쌍 백업에서는 클러스터의 다른 서버에 연결할 수 있는지 여부를 결정합니다. 절반 이상의 서버에 연결할 수 있으면 활성화됩니다. 라이브 서버와 클러스터의 다른 서버 절반 이상이 통신이 끊어지면 쌍의 백업이 대기하여 라이브 서버와 다시 연결을 시도합니다. 이렇게 하면 백업과 라이브 서버가 다른 서버도 알지 못하더라도 메시지를 처리하는 "스플릿 브레인" 상황이 발생할 위험이 줄어듭니다.

중요

이는 공유 저장소 백업과 중요한 차이점입니다. 이 백업은 활성 서버를 찾지 못하고 저널의 파일 잠금이 릴리스된 경우 백업이 활성화되고 클라이언트 요청을 제공하기 시작합니다. 또한 복제에서는 백업 서버가 보유할 수 있는 데이터가 최신 상태인지 알 수 없으므로 자동 활성화를 결정할 수 없습니다. 보유한 데이터를 사용하여 복제 백업 서버를 활성화하려면 슬레이브를 master로 변경하여 활성 서버로 구성되도록 구성을 변경해야 합니다.

추가 리소스

30.3.1. 데이터 복제 구성

아래는 my-cluster 라는 클러스터와 group1 이라는 백업 그룹에 상주하는 라이브 및 백업 서버 모두에 대한 기본 구성을 보여줍니다.

아래 단계에서는 관리 CLI를 사용하여 my-cluster 라는 클러스터와 group1 이라는 백업 그룹에 상주하는 라이브 및 백업 서버 모두에 대한 기본 구성을 제공합니다.

참고

아래 예제에서는 standalone-full-ha 구성 프로필을 사용하여 JBoss EAP를 실행한다고 가정합니다.

데이터 복제를 위한 라이브 서버를 구성하기 위한 관리 CLI 명령

  1. 라이브 서버에 ha-policy 추가

    /subsystem=messaging-activemq/server=default/ha-policy=replication-master:add(check-for-live-server=true,cluster-name=my-cluster,group-name=group1)

    check-for-live-server 특성은 클러스터 내에 다른 서버에 지정된 ID가 없는지 확인하기 위해 라이브 서버에 지시합니다. 이 속성의 기본값은 JBoss EAP 7.0에서 false입니다. JBoss EAP 7.1 이상에서는 기본값은 true 입니다.

  2. ha-policy 를 백업 서버에 추가합니다.

    /subsystem=messaging-activemq/server=default/ha-policy=replication-slave:add(cluster-name=my-cluster,group-name=group1)
  3. 공유 클러스터-커넥션 이 있는지 확인합니다.

    라이브 서버와 백업 서버 간의 적절한 통신에는 클러스터 연결이 필요합니다. 다음 관리 CLI 명령을 사용하여 동일한 cluster-connection 이 라이브 및 백업 서버에 모두 구성되어 있는지 확인합니다. 이 예제에서는 standalone - full-ha 구성 프로필에 있는 기본 cluster- connection 을 사용하며 대부분의 사용 사례에 충분해야 합니다. 클러스터 연결을 구성하는 방법에 대한 자세한 내용은 클러스터 연결 구성을 참조하십시오.

    다음 관리 CLI 명령을 사용하여 라이브 및 백업 서버가 모두 동일한 cluster-connection을 사용하고 있는지 확인합니다.

    /subsystem=messaging-activemq/server=default/cluster-connection=my-cluster:read-resource

    cluster-connection 이 있으면 출력에서 현재 구성을 제공합니다. 그렇지 않으면 오류 메시지가 표시됩니다.

모든 구성 속성에 대한 자세한 내용은 모든 복제 구성을 참조하십시오.

30.3.2. 모든 복제 설정

관리 CLI를 사용하여 추가한 후 정책에 구성을 추가할 수 있습니다. 이를 수행하는 명령은 아래 기본 구문을 따릅니다.

/subsystem=messaging-activemq/server=default/ha-policy=POLICY:write-attribute(name=ATTRIBUTE,value=VALUE)

예를 들어 restart-backup 특성 값을 true 로 설정하려면 다음 명령을 사용합니다.

/subsystem=messaging-activemq/server=default/ha-policy=replication-slave:write-attribute(name=restart-backup,value=true)

다음 표에서는 replication -master 노드 및 replication- slave 구성 요소의 HA 구성 속성을 제공합니다.

표 30.1. replication-master의 속성

속성설명

Check-for-live-server

시작할 때 동일한 서버 ID를 사용하는 다른 서버의 클러스터를 확인하도록 이 서버에 알리려면 true 로 설정합니다. JBoss EAP 7.0의 기본값은 false 입니다. JBoss EAP 7.1 이상의 기본값은 true 입니다.

cluster-name

복제에 사용되는 클러스터의 이름입니다.

group-name

설정되어 있는 경우 백업 서버는 일치하는 그룹 이름과 라이브 서버만 쌍으로 연결합니다.

initial-replication-sync-timeout

시작 복제가 동기화될 때까지 밀리초 단위로 대기하는 시간입니다. 기본값은 30000 입니다.

synchronized-with-backup

실시간 서버 및 복제 서버의 저널이 동기화되었는지를 나타냅니다.

표 30.2. replication-slave의 속성

속성설명

allow-failback

요청을 다른 위치에 배치할 때 이 서버가 자동으로 중지되는지 여부입니다. 일반적인 사용 사례는 다시 시작 또는 실패 복구 후 활성 처리를 다시 시작하도록 요청하는 라이브 서버 요청입니다. allow-failbacktrue 로 설정된 백업 서버는 클러스터에 다시 가입하고 처리를 재개하도록 요청하면 라이브 서버로 생성됩니다. 기본값은 true 입니다.

cluster-name

복제에 사용되는 클러스터의 이름입니다.

group-name

설정되어 있는 경우 백업 서버는 일치하는 그룹 이름과 라이브 서버만 쌍으로 연결합니다.

initial-replication-sync-timeout

시작 복제가 동기화될 때까지 밀리초 단위로 대기하는 시간입니다. 기본값은 30000 입니다.

max-saved-replicated-journal-size

시작 시 파일을 이동한 후 복제된 백업 서버를 다시 시작할 수 있는 횟수를 지정합니다. 최대값에 도달하면 가 다시 실패하면 서버가 영구적으로 중지됩니다. 기본값은 2 입니다.

restart-backup

실패한 상태로 인해 백업 서버가 중지되면 이 백업 서버를 다시 시작하도록 지시하려면 true 로 설정합니다. 기본값은 true 입니다.

Syncd-with-live

복제 서버의 저널이 라이브 서버와 동기화되었는지를 나타냅니다. 즉, 라이브 서버를 안전하게 종료합니다.

30.3.3. 클러스터 연결 시간 제한 방지

각 라이브 및 백업 쌍은 클러스터 연결을 사용하여 통신합니다. cluster- connection의 call- timeout 특성은 클러스터에서 다른 서버로 호출한 후 서버가 응답을 기다리는 시간을 설정합니다. call-timeout 의 기본값은 30초로, 대부분의 사용 사례에 충분합니다. 그러나 백업 서버가 라이브 서버에서 들어오는 복제 패킷을 처리할 수 없는 경우가 있습니다. 예를 들어, 디스크 작업 속도가 느리거나 journal- min-files 의 큰 값으로 인해 저널 파일의 초기 사전 생성에 시간이 너무 오래 걸릴 수 있습니다. 이와 같은 시간 초과가 발생하면 로그에 다음 행과 유사한 행이 표시됩니다.

AMQ222207: The backup server is not responding promptly introducing latency beyond the limit. Replication server being disconnected now.
주의

위와 같은 행이 로그에 표시되면 복제 프로세스가 중지되었음을 의미합니다. 복제를 다시 시작하려면 백업 서버를 다시 시작해야 합니다.

클러스터 연결 시간 초과를 방지하려면 다음 옵션을 고려하십시오.

  • cluster -connection 의 호출 시간을 늘립니다. 자세한 내용은 클러스터 연결 구성을 참조하십시오.
  • journal-min-file의 값을 줄입니다. 자세한 내용은 지속성 구성을 참조하십시오.

30.3.4. 이전 저널 디렉토리 제거

백업 서버는 라이브 서버와 동기화를 시작할 때 저널을 새 위치로 이동합니다. 기본적으로 저널 디렉터리는 EAP_HOME /standalone의 data/ activemq 디렉터리에 있습니다. 도메인의 경우 각 서버에 EAP_HOME /domain/servers 아래에 자체 serverX/data/ activemq 디렉토리가 있습니다. 디렉터리의 이름은 바인딩,저널,largemessages페이징 입니다. 이러한 디렉터리에 대한 자세한 내용은 지속성 구성 및 페이징 구성을 참조하십시오.

이동한 후 새 디렉토리의 이름은 oldreplica.X 로, 여기서 X 는 숫자 접미사입니다. 새 페일오버로 인해 다른 동기화가 시작되는 경우 "이동된" 디렉토리의 접미사는 1만큼 증가합니다. 예를 들어 첫 번째 동기화에서는 저널 디렉터리가 두 번째, oldreplica. 2 등과 같이 oldreplica. 1 로 이동됩니다. 원래 디렉토리는 라이브 서버에서 동기화된 데이터를 저장합니다.

기본적으로 백업 서버는 두 번 장애 조치(failing) 및 실패(failing)를 관리하도록 구성됩니다. 그런 다음 정리 프로세스가 트리거되면 oldreplica.X 디렉터리를 제거합니다. 백업 서버에서 max-saved-replicated-journal-size 특성을 사용하여 정리 프로세스를 트리거하는 장애 조치 발생 수를 변경할 수 있습니다.

참고

라이브 서버에는 max-saved-replicated-journal-size2 로 설정됩니다. 이 값은 변경할 수 없습니다

30.3.5. 전용 라이브 및 백업 서버 업데이트

각 서버가 JBoss EAP의 자체 인스턴스에서 실행되는 전용 토폴로지에 라이브 및 백업 서버가 배포된 경우 다음 단계를 수행하여 클러스터를 원활하게 업데이트하고 다시 시작합니다.

  1. 백업 서버를 완전히 종료합니다.
  2. 라이브 서버를 완전히 종료합니다.
  3. 라이브 및 백업 서버의 구성을 업데이트합니다.
  4. 라이브 서버 시작.
  5. 백업 서버를 시작합니다.

30.3.6. 브로커의 네트워크 분리 감지

브로커의 네트워크 분리를 감지하려면 구성 가능한 호스트 목록을 ping할 수 있습니다. 다음 매개 변수 중 하나를 사용하여 네트워크에서 브로커의 상태를 감지하는 방법을 구성합니다.

  • network-check-NIC: InetAddress.isReachable 메서드에서 사용할 NIC(Network Interface Controller)를 사용하여 네트워크 가용성을 확인합니다.
  • network-check-period: 네트워크 상태를 확인하는 빈도를 정의하는 시간(밀리초)을 나타냅니다.
  • network-check-timeout: 네트워크 연결이 만료되기 전 대기 시간을 나타냅니다.
  • network-check-list: 네트워크 상태를 감지하기 위해 ping되는 IP 주소 목록을 나타냅니다.
  • network-check-URL-list: 네트워크 유효성 검사에 사용되는 http URI 목록을 나타냅니다.
  • network-check-ping-command: IPv4 네트워크에서 네트워크 상태를 감지하는 데 사용되는 ping 명령 및 해당 매개변수를 나타냅니다.
  • network-check-ping6-command: IPv6 네트워크에서 네트워크 상태를 감지하는 데 사용되는 ping 명령 및 해당 매개변수를 나타냅니다.

절차

  • 다음 명령을 사용하여 구성 가능한 호스트 목록을 ping하여 브로커의 네트워크 격리를 감지합니다.

    /subsystem=messaging-activemq/server=default:write-attribute(name=<parameter-name>, value="<ip-address>")

예제

IP 주소 10.0.0.1 을 ping하여 네트워크 상태를 확인하려면 다음 명령을 실행합니다.

/subsystem=messaging-activemq/server=default:write-attribute(name=network-check-list, value="10.0.0.1")

30.3.7. 데이터 복제의 제한 사항: Brain 처리 분할

라이브 서버와 해당 백업이 동시에 활성 상태일 때 "분리" 상황이 발생합니다. 두 서버 모두 다른 서버는 인식하지 않고도 클라이언트 및 프로세스 메시지를 제공할 수 있습니다. 이 경우 라이브 서버와 백업 서버 간에 더 이상 메시지 복제가 없습니다. 두 서버 간에 네트워크 오류가 발생하는 경우 분할이 발생할 수 있습니다.

예를 들어, 라이브 서버와 네트워크 라우터 간의 연결이 끊어지면 백업 서버에서 라이브 서버와의 연결이 끊어집니다. 그러나 백업은 여전히 클러스터의 절반 이상의 서버에 연결할 수 있으므로 활성화됩니다. 활성 백업 쌍이 하나뿐이고 백업 서버가 라이브 서버에 대한 연결이 손실되는 경우에도 백업이 활성화됩니다. 두 서버가 모두 클러스터 내에서 활성 상태일 때 바람직하지 않은 두 가지 상황이 발생할 수 있습니다.

  1. 원격 클라이언트가 백업 서버로 페일오버하지만 MDB와 같은 로컬 클라이언트는 라이브 서버를 사용합니다. 두 노드 모두 완전히 다른 저널을 가지므로 분할된 블록 처리가 생성됩니다.
  2. 원격 클라이언트가 백업 서버로 이미 실패한 경우 라이브 서버에 대한 연결이 끊어졌습니다. 이전 클라이언트에서 백업을 계속 사용하는 동안 새 클라이언트가 라이브 서버에 연결되어 새 클라이언트도 분할된 씬 시나리오가 됩니다.

고객은 데이터 복제를 사용할 때 분할 블록 처리의 위험을 줄이기 위해 각 라이브 및 백업 서버 쌍 간에 신뢰할 수 있는 네트워크를 구현해야 합니다. 예를 들어 중복된 네트워크 인터페이스 카드 및 기타 네트워크 이중화를 사용합니다.