Share via


업데이트 정책 개요

업데이트 정책은 새 데이터가 테이블에 기록될 때 트리거되는 자동화 메커니즘입니다. 수집된 데이터를 변환하고 결과를 대상 테이블에 저장하는 쿼리를 실행하여 특수 오케스트레이션이 필요하지 않습니다. 단일 테이블에 여러 업데이트 정책을 정의하여 서로 다른 변환을 허용하고 동시에 여러 테이블에 데이터를 저장할 수 있습니다. 대상 테이블에는 원본 테이블의 다른 스키마, 보존 정책 및 기타 정책이 있을 수 있습니다.

예를 들어 높은 비율의 추적 원본 테이블에는 자유 텍스트 열로 서식이 지정된 데이터가 포함될 수 있습니다. 대상 테이블에는 구문 분석 연산자를 사용하여 원본 테이블의 자유 텍스트 데이터 변환에서 생성된 잘 구조화된 스키마가 포함된 특정 추적선이 포함될 수 있습니다. 자세한 내용은 일반적인 시나리오를 참조하세요.

다음 다이어그램은 업데이트 정책의 개략적인 보기를 보여 줍니다. 의 데이터가 두 번째 원본 테이블에 추가되고 변환된 데이터가 두 대상 테이블에 추가될 때 트리거되는 두 개의 업데이트 정책을 보여 줍니다.

다이어그램은 업데이트 정책의 개요를 보여줍니다.

업데이트 정책에는 일반 수집과 동일한 제한 사항 및 모범 사례가 적용됩니다. 정책은 클러스터 크기에 따라 스케일 아웃되며 대량 수집을 처리할 때 더 효율적입니다.

참고

  • 원본 및 대상 테이블은 동일한 데이터베이스에 있어야 합니다.
  • 업데이트 정책 함수 스키마와 대상 테이블 스키마는 열 이름, 형식 및 순서에서 일치해야 합니다.

형식이 지정된 데이터를 수집하면 성능이 향상되며, CSV는 잘 정의된 형식이므로 선호됩니다. 그러나 경우에 따라 데이터 형식을 제어할 수 없거나 수집된 데이터를 보강하려는 경우가 있습니다( 예: 데이터베이스의 정적 차원 테이블과 레코드 조인).

정책 쿼리 업데이트

대상 테이블에 업데이트 정책이 정의된 경우 원본 테이블에 수집된 데이터에서 여러 쿼리를 실행할 수 있습니다. 여러 업데이트 정책이 있는 경우 실행 순서를 반드시 알 수 있는 것은 아닙니다.

쿼리 제한 사항

  • 정책 관련 쿼리는 저장된 함수를 호출할 수 있지만 다음을 수행할 수 있습니다.
    • 클러스터 간 쿼리를 수행할 수 없습니다.
    • 외부 데이터 또는 외부 테이블에 액세스할 수 없습니다.
    • 플러그 인을 사용하여 설명선은 만들 수 없습니다.
  • 쿼리에는 RestrictedViewAccess 정책을 사용하도록 설정된 테이블에 대한 읽기 권한이 없습니다.
  • 스트리밍 수집의 업데이트 정책 제한 사항은 스트리밍 수집 제한을 참조하세요.

경고

잘못된 쿼리는 원본 테이블로의 데이터 수집을 방지할 수 있습니다. 쿼리 결과와 원본 및 대상 테이블의 스키마 간의 호환성뿐만 아니라 제한 사항으로 인해 잘못된 쿼리로 인해 원본 테이블로의 데이터 수집을 방지할 수 있다는 점에 유의해야 합니다.

이러한 제한 사항은 정책을 만들고 실행하는 동안 유효성이 검사되지만 쿼리에서 참조할 수 있는 임의의 저장된 함수가 업데이트되는 경우는 아닙니다. 따라서 업데이트 정책이 그대로 유지되도록 주의해서 변경해야 합니다.

정책의 일부 또는 파트에서 Query 참조하는 Source 함수에서 테이블을 참조하는 Query 경우:

  • 테이블의 정규화된 이름을 사용하지 마세요. 대신 TableName 을(를) 사용하세요.
  • database("DatabaseName").TableName 또는 cluster("ClusterName").database("DatabaseName").TableName은 사용하지 마세요.

업데이트 정책 개체

테이블에는 0개 이상의 업데이트 정책 개체가 연결되어 있을 수 있습니다. 이러한 각 개체는 다음 속성이 정의된 JSON 속성 모음으로 표시됩니다.

속성 형식 설명
IsEnabled bool 업데이트 정책이 true 인 경우(사용 또는 false ) 사용 안 함 상태
Source string 업데이트 정책의 호출을 트리거하는 테이블의 이름
쿼리 string 업데이트에 대한 데이터를 생성하는 데 사용되는 쿼리
IsTransactional bool 업데이트 정책이 트랜잭션인지 여부를 지정하고, 기본값은 false입니다. 정책이 트랜잭션이고 업데이트 정책이 실패하면 원본 테이블이 업데이트되지 않습니다.
PropagateIngestionProperties bool 원본 테이블에 수집하는 동안 지정된 속성(예: 익스텐트 태그 및 생성 시간)이 대상 테이블에 적용되는지 확인합니다.
ManagedIdentity string 업데이트 정책이 실행되는 관리 ID입니다. 관리 ID는 개체 ID 또는 예약어일 system 수 있습니다. 쿼리가 활성화된 행 수준 보안 정책을 사용하여 다른 데이터베이스 또는 테이블의 테이블을 참조하는 경우 업데이트 정책을 관리 ID로 구성해야 합니다. 자세한 내용은 관리 ID를 사용하여 업데이트 정책 실행을 참조하세요.

참고

프로덕션 시스템에서 :true를 설정IsTransactional하여 대상 테이블이 일시적인 오류로 데이터가 손실되지 않도록 합니다.

참고

예를 들어 테이블 A에서 테이블 B, 테이블 C까지 연속 업데이트가 허용됩니다. 그러나 업데이트 정책이 순환 방식으로 정의된 경우 런타임에 이 정책이 검색되고 업데이트 체인이 잘려집니다. 데이터는 체인의 각 테이블에 한 번만 수집됩니다.

관리 명령

업데이트 정책 관리 명령은 다음과 같습니다.

업데이트 정책은 수집 후 시작됩니다.

업데이트 정책은 데이터를 수집하거나 원본 테이블로 이동하거나 다음 명령을 사용하여 원본 테이블에 익스텐트를 만들 때 적용됩니다.

경고

업데이트 정책이 명령의 일부로 호출되면 기본적으로 파생 테이블의 .set-or-replace 데이터가 원본 테이블과 동일한 방식으로 대체됩니다. 명령이 호출되면 업데이트 정책 관계가 replace 있는 모든 테이블에서 데이터가 손실될 수 있습니다. 대신 .set-or-append을 사용하는 것이 좋습니다.

원본 테이블에서 데이터 제거

대상 테이블에 데이터를 수집한 후 필요에 따라 원본 테이블에서 제거할 수 있습니다. 원본 테이블의 0sec보존 정책에서 일시 삭제 기간(또는 00:00:00)을 설정하고 업데이트 정책을 트랜잭션으로 설정합니다. 다음 조건이 적용됩니다.

  • 원본 데이터는 원본 테이블에서 쿼리할 수 없습니다.
  • 원본 데이터는 수집 작업의 일부로 지속형 스토리지에 유지되지 않습니다.
  • 운영 성능이 향상됩니다. 원본 테이블의 익스텐 트에서 백그라운드 정리 작업을 위해 수집 후 리소스가 줄어듭니다.

참고

원본 테이블에 일시 삭제 기간 0sec (또는 00:00:00)이 있는 경우 이 테이블을 참조하는 모든 업데이트 정책은 트랜잭션이어야 합니다.

성능에 미치는 영향

업데이트 정책은 클러스터 성능에 영향을 줄 수 있으며 데이터 익스텐트 수집에는 대상 테이블의 수를 곱합니다. 정책 관련 쿼리를 최적화하는 것이 중요합니다. 기존 익스텐트에서 정책을 호출하거나, 정책을 만들거나 변경하기 전에 또는 쿼리와 함께 사용되는 함수에서 정책을 호출하여 업데이트 정책의 성능 영향을 테스트할 수 있습니다.

리소스 사용량 평가

를 사용하여 .show queries다음 매개 변수를 사용하여 리소스 사용량(CPU, 메모리 등)을 평가합니다.

  • Source 원본 테이블 이름인 속성을 로 설정합니다.MySourceTable
  • Query 라는 함수를 호출하도록 속성을 설정합니다.MyFunction()
// '_extentId' is the ID of a recently created extent, that likely hasn't been merged yet.
let _extentId = toscalar(
    MySourceTable
    | project ExtentId = extent_id(), IngestionTime = ingestion_time()
    | where IngestionTime > ago(10m)
    | top 1 by IngestionTime desc
    | project ExtentId
);
// This scopes the source table to the single recent extent.
let MySourceTable =
    MySourceTable
    | where ingestion_time() > ago(10m) and extent_id() == _extentId;
// This invokes the function in the update policy (that internally references `MySourceTable`).
MyFunction

오류

의 기본 설정을 IsTransactional:false사용하면 정책이 실행되지 않더라도 원본 테이블에 데이터를 계속 수집할 수 있습니다.

설정은 IsTransactional:true 원본 테이블과 대상 테이블의 데이터 간의 일관성을 보장합니다. 그러나 정책 조건이 실패하면 데이터가 원본 테이블에 수집되지 않습니다. 또는 조건에 따라 데이터가 원본 테이블에 수집되지만 대상 테이블에는 수집되지 않는 경우가 있습니다. 그러나 정책이 잘못 정의되었거나 스키마가 일치하지 않으면 데이터가 원본 또는 대상 테이블에 수집되지 않습니다. 예를 들어 쿼리 출력 스키마와 대상 테이블 간의 불일치는 대상 테이블에서 열을 삭제하여 발생할 수 있습니다.

명령을 사용하여 .show ingestion failures오류를 볼 수 있습니다.

.show ingestion failures
| where FailedOn > ago(1hr) and OriginatesFromUpdatePolicy == true

오류 처리

비전송 정책

IsTransactional:false설정하면 정책 실행 실패는 무시됩니다. 수집은 자동으로 다시 시도되지 않습니다. 수동으로 수집을 다시 시도할 수 있습니다.

트랜잭션 정책

로 설정IsTransactional:true하면 수집 메서드가 pull인 경우 데이터 관리 서비스가 관련되고 수집은 다음 조건에 따라 자동으로 다시 시도됩니다.

  • 다음 구성 가능한 제한 설정 중 하나가 충족 DataImporterMaximumRetryPeriod 될 때까지 다시 시도됩니다. 또는 DataImporterMaximumRetryAttempts
  • 기본적으로 설정은 DataImporterMaximumRetryPeriod 2일이며 DataImporterMaximumRetryAttempts10입니다.
  • 백오프 기간은 2분에서 시작하여 두 배가 됩니다. 따라서 대기는 2분으로 시작한 다음 4분, 8분, 16분 등으로 증가합니다.

다른 경우에는 수동으로 수집을 다시 시도할 수 있습니다.

추출, 변환, 로드의 예

업데이트 정책 설정을 사용하여 ETL(추출, 변환, 로드)을 수행할 수 있습니다.

이 예제에서는 간단한 함수가 있는 업데이트 정책을 사용하여 ETL을 수행합니다. 먼저 다음 두 개의 테이블을 만듭니다.

  • 원본 테이블 - 데이터가 수집되는 단일 문자열 형식 열을 포함합니다.
  • 대상 테이블 - 원하는 스키마를 포함합니다. 업데이트 정책은 이 테이블에 정의되어 있습니다.
  1. 원본 테이블을 만들어 보겠습니다.

    .create table MySourceTable (OriginalRecord:string)
    
  2. 다음으로 대상 테이블을 만듭니다.

    .create table MyTargetTable (Timestamp:datetime, ThreadId:int, ProcessId:int, TimeSinceStartup:timespan, Message:string)
    
  3. 그런 다음, 데이터를 추출하는 함수를 만듭니다.

    .create function
     with (docstring = 'Parses raw records into strongly-typed columns', folder = 'UpdatePolicyFunctions')
         ExtractMyLogs()
        {
        MySourceTable
        | parse OriginalRecord with "[" Timestamp:datetime "] [ThreadId:" ThreadId:int "] [ProcessId:" ProcessId:int "] TimeSinceStartup: " TimeSinceStartup:timespan " Message: " Message:string
        | project-away OriginalRecord
    }
    
  4. 이제 업데이트 정책을 설정하여 만든 함수를 호출합니다.

    .alter table MyTargetTable policy update
    @'[{ "IsEnabled": true, "Source": "MySourceTable", "Query": "ExtractMyLogs()", "IsTransactional": true, "PropagateIngestionProperties": false}]'
    
  5. 데이터가 대상 테이블에 수집된 후 원본 테이블을 비우려면 원본 테이블의 보존 정책을 정의하여 0을 로 SoftDeletePeriod지정합니다.

     .alter-merge table MySourceTable policy retention softdelete = 0s