다음을 통해 공유


다중 클러스터 구성

다중 클러스터 구성은 현재 다중 클러스터의 일부인 클러스터를 결정합니다. 자동으로 변경되지는 않지만 연산자에 의해 제어됩니다. 따라서 클러스터 내에서 사용되는 멤버 자격 메커니즘과는 매우 다르며, 클러스터의 일부인 사일로 세트를 자동으로 결정합니다.

서비스의 클러스터에 대해 다음 용어를 사용합니다.

  • 활성 사일로가 하나 이상 있으면 클러스터가 활성화되고, 그렇지 않으면 비활성됩니다.
  • 클러스터가 현재 다중 클러스터 구성의 일부인 경우 조인되고, 그렇지 않으면 조인되지 않습니다.

활성/비활성 상태인 것은 조인/비 조인과 무관합니다. 네 가지 조합을 모두 사용할 수 있습니다.

특정 서비스에 대한 모든 클러스터는 가십 네트워크에 의해 연결됩니다. 가십 네트워크는 구성 및 상태 정보를 전파합니다.

구성 삽입

운영자는 다중 클러스터 네트워크에 삽입하여 구성 변경을 실행합니다. 구성을 모든 클러스터에 삽입하고 여기에서 모든 활성 클러스터로 분산할 수 있습니다. 각각의 새 구성은 다중 클러스터를 구성하는 클러스터 ID 목록으로 구성됩니다. 가십 네트워크를 통한 전파를 추적하는 데 사용되는 UTC 타임스탬프도 있습니다.

처음에는 다중 클러스터 구성이 null입니다. 즉, 다중 클러스터 목록이 비어 있습니다(클러스터 없음). 따라서 연산자는 처음에 다중 클러스터 구성을 삽입해야 합니다. 삽입되면 이 구성은 연결된 모든 사일로(실행 중) 및 지정된 모든 가십 채널(해당 채널이 영구적인 경우)에 유지됩니다.

운영자가 따라야 하는 새 구성의 주입에 몇 가지 제한 사항이 있습니다.

  • 각각의 새 구성은 여러 클러스터를 추가하거나 일부 클러스터를 제거할 수 있습니다(동시에 둘 다는 아님).
  • 이전 구성 변경이 계속 처리되는 동안 운영자는 새 구성을 실행해서는 안 됩니다.

이러한 제한은 단일 인스턴스 프로토콜과 같은 프로토콜이 구성 변경 시에도 활성화의 상호 제외를 올바르게 유지할 수 있도록 합니다.

관리 조직

다중 클러스터 구성은 Orleans 관리 곡물을 사용하여 모든 클러스터의 모든 노드에 삽입할 수 있습니다. 예를 들어 세 개의 클러스터{ us1, eu1, us2 }로 구성된 다중 클러스터 구성을 삽입하려면 관리 조직에 열거 가능한 문자열을 전달하면 됩니다.

var clusters = "us1,eu1,us2".Split(',');
var mgtGrain = client.GetGrain<IManagementGrain>(0);
mgtGrain.InjectMultiClusterConfiguration(clusters, "my comment here"));

InjectMultiClusterConfiguration(IEnumerable<String>, String, Boolean)에 대한 첫 번째 인수는 새 다중 클러스터 구성을 정의할 클러스터 ID의 컬렉션입니다. 두 번째 인수는 삽입한 사람 및 이유와 같은 임의의 정보로 구성에 태그를 지정하는 데 사용할 수 있는 (선택적) 주석 문자열입니다.

선택적 세 번째 인수인 checkForLaggingSilosFirst라는 부울(기본값이 true)이 있습니다. 즉, 시스템이 현재 구성을 아직 따라잡지 못한 사일로가 있는지 확인하기 위해 최선의 검사를 수행하고 이러한 사일로를 찾으면 변경을 거부합니다. 이렇게 하면 한 번에 하나의 구성 변경만 보류해야 한다는 제한 위반을 탐지하는 데 도움이 됩니다(모든 상황에서 다 보장할 수 없음).

기본 구성

다중 클러스터 구성이 미리 알려지고 배포가 매번 새로 고침되는 경우(테스트를 위해) 기본 구성을 제공할 수 있습니다. 전역 구성은 쉼표로 구분된 클러스터 ID 목록을 사용하는 선택적 특성 DefaultMultiCluster를 지원합니다.

var silo = new HostBuilder()
    .UseOrleans(builder =>
    {
        builder.Configure<MultiClusterOptions>(options =>
        {
            options.DefaultMultiCluster = new[] { "us1", "eu1", "us2" };
        })
    })
    .Build();

이 설정으로 사일로를 시작한 후 현재 다중 클러스터 구성이 null인지 확인하고, 그렇다면 지정된 구성을 현재 UTC 타임스탬프에 삽입합니다.

Warning

영구 다중 클러스터 가십 채널(AzureTable 기반)은 명시적으로 삭제되지 않는 한 마지막으로 삽입된 구성을 유지합니다. 이 경우 가십 채널에 저장된 구성이 null이 아니므로 클러스터를 다시 배포할 때 DefaultMultiCluster를 지정해도 효과가 없습니다.>

가십 채널

운영자는 구성을 가십 채널에 직접 삽입할 수도 있습니다. 채널의 변경 내용은 매우 느리지만 주기적인 배경 가십에 의해 자동으로 선택되고 전파됩니다(관리 조직 사용은 훨씬 빠릅니다). 전파 시간에 대한 대략적인 추정치는 30초(또는 전역 구성에 지정된 가십 간격)에 모든 클러스터의 총 사일로 수의 이진 로그를 곱한 것입니다. 그러나 가십 쌍은 무작위로 선택되기 때문에 훨씬 빠르거나 훨씬 느려질 수 있습니다.

Azure 테이블 기반 가십 채널을 사용하는 경우 운영자는 Azure 테이블에서 데이터를 편집하기 위한 일부 도구를 사용하여 OrleansGossipTable의 구성 레코드를 편집하여 새 구성을 삽입할 수 있습니다. 구성 레코드의 형식은 다음과 같습니다.

속성 타입
PartitionKey 문자열 ServiceId
RowKey 문자열 "CONFIG"
클러스터 문자열 쉼표로 구분된 클러스터 ID 목록(예: "us1,eu1,us2")
Comment(설명) 문자열 선택적 주석
GossipTimestamp DateTime 구성에 대한 UTC 타임스탬프

참고 항목

스토리지에서 이 레코드를 편집하는 경우 GossipTimestamp도 현재보다 최신 값으로 설정해야 합니다(그렇지 않으면 변경 내용이 무시됨). 이 작업을 수행하는 가장 편리하고 권장되는 방법은 GossipTimestamp필드를 삭제하는 것입니다. 가십 채널 구현은 이를 올바른 현재 타임스탬프로 자동으로 바꿉니다(Azure 테이블 타임스탬프 사용).

클러스터 프로시저

다중 클러스터에서 클러스터를 추가하거나 제거하는 작업은 더 큰 컨텍스트 내에서 조정해야 하는 경우가 많습니다. 다중 클러스터에서 클러스터를 추가/제거할 때는 항상 아래에 설명된 절차를 따르는 것이 좋습니다.

클러스터 추가 절차

  1. 새 Orleans 클러스터를 시작하고 모든 사일로가 실행될 때까지 기다립니다.
  2. 새 클러스터가 포함된 구성을 삽입합니다.
  3. 사용자 요청을 새 클러스터로 라우팅하기 시작합니다.

클러스터를 제거하는 절차

  1. 클러스터에 대한 새 사용자 요청 라우팅을 중지합니다.
  2. 더 이상 클러스터를 포함하지 않는 구성을 삽입합니다.
  3. 클러스터의 모든 사일로를 중지합니다.

이러한 방식으로 클러스터가 제거되면 새 클러스터를 추가하는 절차에 따라 클러스터를 다시 추가할 수 있습니다.

조인되지 않은 클러스터에 대한 작업

클러스터가 활성 상태이고 조인되지 않은 짧은 임시 기간이 있을 수 있습니다.

  • 새로 시작된 클러스터는 다중 클러스터 구성(클러스터 추가 절차의 1~2단계) 전에 코드 실행을 시작할 수 있습니다.
  • 서비스 해제 중인 클러스터는 사일로가 종료되기 전에 코드를 계속 실행할 수 있습니다(클러스터 제거 절차의 2~3단계).

이러한 중간 상황에서는 다음이 가능합니다.

  • 글로벌 단일 인스턴스 조직의 경우: 조인되지 않은 클러스터에서 조직이 중복 활성화될 수 있습니다.
  • 버전이 지정된 조직의 경우: 조인되지 않은 클러스터의 활성화는 조직 상태가 변경될 때 알림을 받지 않습니다.