곡물 배치
Orleans 곡물 호출이 수행되면 클러스터의 일부 서버에서 해당 곡물의 인스턴스를 메모리에 사용하여 요청을 처리하도록 합니다. 곡물이 클러스터에서 현재 활성화되지 않은 경우 Orleans 그레인을 활성화할 서버 중 하나를 선택합니다. 이를 그레인 배치이라고 합니다. 배치는 부하를 분산하는 방법 중 하나입니다. 작업이 많은 요소를 고르게 배치하면 클러스터 전반의 워크로드 균형을 맞출 수 있습니다.
Orleans 배치 프로세스는 완전히 구성할 수 있습니다. 개발자는 임의, 선호 로컬 및 부하 기반과 같은 기본 배치 정책 집합에서 선택하거나 사용자 지정 논리를 구성할 수 있습니다. 이렇게 하면 곡물이 생성되는 위치를 유연하게 결정할 수 있습니다. 예를 들어, 그레인은 작업해야 하는 리소스 가까이 또는 통신하는 다른 그레인 가까이의 서버에 배치할 수 있습니다. 기본적으로 Orleans 임의 호환 서버를 선택합니다.
Orleans 사용하는 배치 전략은 전역적으로 또는 그레인별 클래스별로 구성할 수 있습니다.
임의 배치
서버는 클러스터의 호환되는 서버에서 임의로 선택됩니다. 이 배치 전략은 RandomPlacementAttribute 곡물에 추가하여 구성됩니다.
로컬 배치
로컬 서버가 호환되는 경우 로컬 서버를 선택하고, 그렇지 않으면 임의의 서버를 선택합니다. 이 배치 전략은 PreferLocalPlacementAttribute 곡물에 추가하여 구성됩니다.
해시 기반 배치
곡물 ID를 음수가 아닌 정수로 해싱하고, 이를 호환되는 서버의 수로 나눕니다. 서버 주소로 정렬된 호환되는 서버 목록에서 해당 서버를 선택합니다. 클러스터 멤버 자격이 변경되면 안정성이 보장되지 않을 수 있음을 유의하십시오. 특히 서버를 추가, 제거 또는 다시 시작하면 지정된 곡물 ID에 대해 선택한 서버가 변경될 수 있습니다. 이 전략을 사용하여 배치된 곡물은 그레인 디렉터리에 등록되므로 멤버 자격 변경에 따른 배치 결정의 변경은 일반적으로 눈에 띄는 영향을 미치지 않습니다.
이 배치 전략은 HashBasedPlacementAttribute를 그레인에 추가함으로써 구성됩니다.
활성화 횟수 기반 배치
이 배치 전략은 최근에 사용 중인 곡물 수에 따라 부하가 가장 적은 서버에 새 곡물 활성화를 배치하려고 합니다. 여기에는 모든 서버가 정기적으로 자신들의 총 활성화 횟수를 다른 모든 서버에 게시하는 메커니즘이 포함됩니다. 그런 다음, 배치 디렉터는 가장 최근에 보고된 정품 인증 수를 검사하여 가장 적은 활성화가 있을 것으로 예측되는 서버를 선택하고 현재 서버의 배치 디렉터가 수행한 최근 활성화 횟수에 따라 현재 정품 인증 수를 예측합니다. 디렉터는 동일한 서버를 오버로드하는 여러 개별 서버를 방지하기 위해 이 예측을 수행할 때 여러 서버를 임의로 선택합니다. 기본적으로 두 서버는 임의로 선택되지만 이 값은 ActivationCountBasedPlacementOptions통해 구성할 수 있습니다.
이 알고리즘은 Michael David Mitzenmacher 의 논문"임의 부하 분산에서 두 가지 선택 사항의 힘"을 기반으로 하며, NGINX 및 "두 가지 선택 사항의 힘" Load-Balancing 알고리즘이 설명된문서대로 Nginx의 분산 부하 분산을 위해서도 사용됩니다.
이 배치 전략은 ActivationCountBasedPlacementAttribute를 그레인에 추가하여 구성됩니다.
무상태 작업자 배치
상태 비저장 작업자 배치는 상태 비저장 작업자 곡물사용하는 특수 배치 전략입니다. 이 배치는 각 서버가 동일한 곡물의 여러 활성화를 가질 수 있고 곡물이 필요하지 않으므로 곡물 디렉터리에 등록되지 않는다는 점을 제외하고 PreferLocalPlacement 거의 동일하게 작동합니다.
이 배치 전략은 StatelessWorkerAttribute 곡물에 추가하여 구성됩니다.
사일로 역할을 기반으로 한 배치
특정 역할의 사일로에 곡물을 배치하는 결정적 배치 전략입니다. 이 배치 전략은 SiloRoleBasedPlacementAttribute을(를) 파티클에 추가하여 구성됩니다.
리소스 최적화 배치
리소스 최적화 배치 전략은 사용 가능한 메모리 및 CPU 사용량에 따라 사일로 간에 곡물 활성화를 분산하여 클러스터 리소스를 최적화하려고 시도합니다. 런타임 통계에 가중치를 할당하여 다양한 리소스의 우선 순위를 지정하고 각 사일로에 대해 정규화된 점수를 계산합니다. 가장 낮은 점수를 가진 사일로는 예정된 활성화를 배치하기 위해 선택됩니다. 정규화는 각 속성이 전체 점수에 비례하여 기여하도록 합니다. 다양한 리소스에 대한 사용자별 요구 사항 및 우선 순위에 따라 ResourceOptimizedPlacementOptions 통해 가중치를 조정할 수 있습니다.
또한 이 배치 전략은 새 배치()를 만들기 위한 요청을 받은 로컬 사일로()가 활성화 대상로 선택될 수 있도록, 더 강한 선호도을 구축할 수 있는 옵션을 제공합니다. 옵션의 일부인 LocalSiloPreferenceMargin
속성을 통해 제어됩니다.
또한 온라인적응형 알고리즘은 다항식과 유사한 감쇠 프로세스로 변환하여 빠른 신호 하락을 방지하는 부드러운 효과를 제공합니다. 이는 CPU 사용량에 특히 중요하며, 특히 새로 조인된 사일로의 리소스 포화를 방지하는 데 전반적으로 기여합니다.
이 알고리즘은 다음을 기반으로 합니다. 리소스 기반 배치와 협력적 이중 모드 Kalman 필터링
이 배치 전략은 ResourceOptimizedPlacementAttribute을 곡물에 추가하여 구성됩니다.
배치 전략 선택
Orleans 제공하는 기본값을 넘어서 적절한 곡물 배치 전략을 선택하려면 모니터링 및 개발자 평가가 필요합니다. 배치 전략의 선택은 앱의 크기 및 복잡성, 워크로드 특성 및 배포 환경에 따라 달라집니다.
임의 배치는 법에 의존하므로 많은 수의 곡물(10,000개 이상)에 걸쳐 예측할 수 없는 부하가 분산되는 경우 일반적으로 좋은 기본값입니다.
Activation-count 기반 배치는 또한 임의 요소를 포함하고 있으며, 이는 일반적으로 분산 부하 분산 알고리즘으로 사용되는 'Power of Two Choices' 원칙에 의존하며, 인기 있는 부하 분산 장치에서 사용됩니다. 사일로들은 클러스터 내 다른 사일로들에게 런타임 통계를 자주 게시합니다. 여기에는 다음과 같은 정보들이 포함될 수 있습니다:
- 사용 가능한 메모리, 총 실제 메모리 및 메모리 사용량
- CPU 사용량.
- 총 활성화 수 및 최근 활성 활성화 수입니다.
- 최근 몇 초 동안 활성화된 활성화의 슬라이딩 윈도우는 활성화 작업 집합이라고도 불립니다.
이러한 통계에서 활성화 횟수만 현재 지정된 사일로의 부하를 결정하는 데 사용됩니다.
궁극적으로 다양한 전략을 실험하고 성능 메트릭을 모니터링하여 가장 적합한지 확인해야 합니다. 올바른 그레인 배치 전략을 선택하면 Orleans 앱의 성능, 스케일링 및 비용 효과를 최적화할 수 있습니다.
기본 배치 전략 구성
Orleans 기본값을 재정의하지 않는 한 임의 배치를 사용합니다. 구성 중에 PlacementStrategy 구현을 등록하여 기본 배치 전략을 재정의할 수 있습니다.
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
그레인에 대한 배치 전략 구성
곡물 형식에 대한 배치 전략은 그레인 클래스에 적절한 특성을 추가하여 구성됩니다. 관련 특성은 배치 전략 섹션에 지정됩니다.
샘플 사용자 지정 배치 전략
먼저 단일 메서드가 필요한 IPlacementDirector 인터페이스를 구현하는 클래스를 정의합니다. 이 예제에서는 생성될 곡물의 Guid이 주어지면 사일로 번호를 반환하는 함수 GetSiloNumber
이 정의되어 있다고 가정합니다.
public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);
return Task.FromResult(silos[silo]);
}
}
그런 다음, 그레인 클래스를 전략에 할당할 수 있도록 두 개의 클래스를 정의해야 합니다.
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
그런 다음, 이 전략을 사용하고자 하는 모든 곡물 클래스에 특성을 태그로 지정하세요.
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
마지막으로 SiloHost빌드할 때 전략을 등록합니다.
private static async Task<ISiloHost> StartSilo()
{
var builder = new HostBuilder(c =>
{
// normal configuration methods omitted for brevity
c.ConfigureServices(ConfigureServices);
});
var host = builder.Build();
await host.StartAsync();
return host;
}
private static void ConfigureServices(IServiceCollection services)
{
services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}
배치 컨텍스트의 추가 사용을 보여 주는 두 번째 간단한 예제는 Orleans 원본 리포지토리PreferLocalPlacementDirector
참조하세요.
.NET