마이그레이션 가이드: Elasticsearch에서 Azure로 Data Explorer

이 가이드에서는 Logstash를 사용하여 Elasticsearch 데이터를 Azure Data Explorer 마이그레이션하는 방법을 알아봅니다.

이 가이드에서 마이그레이션할 데이터는 다음 데이터 스키마가 있는 vehicle 라는 Elasticsearch 인덱스에 있습니다.

{
  "Manufacturer": "string",
  "Model": "string",
  "ReleaseYear": "int",
  "ReleaseDate": "datetime"
}

사전 요구 사항

Elasticsearch 데이터를 Azure Data Explorer 마이그레이션하려면 다음이 필요합니다.

사전 마이그레이션

필수 조건을 충족하면 사용자 환경의 토폴로지를 검색하고 Azure 클라우드 마이그레이션의 적합성을 평가할 수 있습니다.

Azure Data Explorer 클러스터에서 대상 스키마 만들기

쿼리 및 분석을 위해 데이터를 올바르게 수집하고 구성하려면 Azure Data Explorer 클러스터에서 테이블 스키마와 매핑을 만들어야 합니다.

테이블의 스키마와 마이그레이션되는 데이터가 일치해야 합니다. 수집 매핑은 ELK의 원본 열을 테이블의 대상 열에 매핑하는 데 중요합니다.

클러스터에서 테이블 스키마 및 수집 매핑을 만들려면 다음을 수행합니다.

  1. Azure Data Explorer 웹 UI에 로그인합니다.

  2. 클러스터에 연결을 추가합니다.

  3. 마이그레이션 데이터에 대한 테이블 스키마를 만들 데이터베이스를 선택합니다.

  4. 데이터베이스 쿼리 창에서 다음 명령을 실행하여 테이블 스키마를 만듭니다.

    .create tables Vehicle (
      Manufacturer: string,
      Model: string,
      ReleaseYear: int,
      ReleaseDate: datetime
      )
    
  5. 다음 명령을 실행하여 수집 매핑을 만듭니다.

    .create table Vehicle ingestion json mapping 'VechicleMapping'
      '['
      '  {"column":"Manufacturer", "path":"$.manufacturer"},'
      '  {"column":"Model", "path":"$.model"},'
      '  {"column":"ReleaseYear", "path":"$.releaseYear"},'
      '  {"column":"ReleaseDate", "path":"$.releaseDate"}'
      ']'
    

마이그레이션을 위한 Logstash 준비

Azure Data Explorer 클러스터로 데이터를 마이그레이션할 때 Logstash 파이프라인을 올바르게 설정하는 것이 중요합니다. 파이프라인은 데이터의 형식이 올바르게 지정되고 대상 테이블로 전송되도록 합니다.

여러 Elasticsearch 클러스터 또는 인덱스에서 데이터를 이동해야 하는 경우 파이프라인 구성 파일에서 여러 입력 섹션을 만들 수 있습니다. 이를 위해 각 Elasticsearch 클러스터 또는 인덱스에 대해 하나의 입력 섹션을 정의하고 원하는 경우 태그를 사용하여 분류할 수 있습니다. 그런 다음 출력 섹션의 조건문에서 이러한 태그를 사용하여 이러한 데이터 세트를 특정 Azure Data Explorer 클러스터 테이블로 안내할 수 있습니다.

Logstash 파이프라인을 설정하려면 다음을 수행합니다.

  1. 명령 셸에서 Logstash 루트 디렉터리로 이동한 다음, 다음 명령을 실행하여 Logstash 출력 플러그 인을 설치합니다. 플러그 인에 대한 자세한 내용은 Logstash에서 데이터 수집을 참조하세요.

    bin/logstash-plugin install logstash-output-kusto
    
  2. 다음 설정을 사용하여 Logstash 파이프라인 구성 파일을 만듭니다.

    input {
      elasticsearch {
        hosts => "http://localhost:9200"
        index => "vehicle"
        query => '{ "query": { "range" : { "releaseDate": { "gte": "2019-01-01", "lte": "2023-12-31" }}}}'
        user => "<elasticsearch_username>"
        password => "<elasticsearch_password>"
        ssl => true
        ca_file => "<certification_file>"
      }
    }
    
    filter
    {
      ruby
      {
        code => "event.set('[@metadata][timebucket]', Time.now().to_i/10)"
      }
    }
    
    output {
      kusto {
        path => "/tmp/region1/%{+YYYY-MM-dd}-%{[@metadata][timebucket]}.txt"
        ingest_url => "https://ingest-<azure_data_explorer_cluster_name>.<region>.kusto.windows.net"
        app_id => "<app_id>"
        app_key => "<app_secret>"
        app_tenant => "<app_tenant_id>"
        database => "<your_database>"
        table => "Vehicle" // The table schema you created earlier
        json_mapping => "vehicleMapping" // The ingestion mapping you created earlier
      }
    }
    

    입력 매개 변수

    매개 변수 이름 설명
    호스트 Elasticsearch 클러스터의 URL입니다.
    index 마이그레이션할 인덱스의 이름입니다.
    쿼리 인덱스에서 특정 데이터를 가져오는 선택적 쿼리입니다.
    user Elasticsearch 클러스터에 연결할 사용자 이름입니다.
    password Elasticsearch 클러스터에 연결할 암호입니다.
    태그 데이터 원본을 식별하는 선택적 태그입니다. 예를 들어 elasticsearch 섹션에서 를 지정 tags => ["vehicle"] 한 다음 kusto 섹션 래핑을 사용하여 if "vehicle" in [tags] { ... } 필터링합니다.
    ssl SSL 인증서가 필요한지 여부를 지정합니다.
    ca_file 인증을 위해 전달할 인증서 파일입니다.

    필터 매개 변수

    Ruby 필터는 Elasticsearch 데이터 파일에 대한 고유한 타임스탬프를 10초마다 설정하여 중복 데이터가 클러스터에 수집되는 것을 방지합니다. 이는 데이터를 고유한 타임스탬프가 있는 파일로 청크하여 마이그레이션을 위해 데이터가 제대로 처리되도록 하는 모범 사례입니다.

    출력 매개 변수

    매개 변수 이름 설명
    path Logstash 플러그 인은 이벤트를 클러스터로 보내기 전에 임시 파일에 씁니다. 이 매개 변수는 임시 파일이 저장되는 경로와 클러스터에 대한 업로드를 트리거하기 위한 파일 회전에 대한 시간 식을 설명합니다.
    ingest_url 수집 관련 통신을 위한 클러스터 엔드포인트입니다.
    app_id, app_keyapp_tenant 클러스터에 연결하는 데 필요한 자격 증명입니다. 수집 권한이 있는 애플리케이션을 사용해야 합니다. 자세한 내용은 필수 구성 요소를 참조하세요.
    database 이벤트를 적용할 데이터베이스 이름입니다.
    table 이벤트를 적용할 대상 테이블 이름입니다.
    json_mapping 매핑은 들어오는 이벤트 json 문자열을 올바른 행 형식으로 매핑하는 데 사용됩니다(어떤 ELK 속성이 어떤 테이블 스키마 열로 들어가는지 정의).

마이그레이션

마이그레이션 전 단계 준비를 완료한 후 다음 단계는 마이그레이션 프로세스를 실행하는 것입니다. 데이터 마이그레이션 프로세스 중에 파이프라인을 모니터링하여 원활하게 실행되고 발생할 수 있는 문제를 해결할 수 있도록 하는 것이 중요합니다.

데이터를 마이그레이션하려면 명령 셸에서 Logstash 루트 디렉터리로 이동한 다음 다음 명령을 실행합니다.

bin/logstash -f <your_pipeline>.conf

화면에 정보가 인쇄되어 표시됩니다.

마이그레이션 후 작업

마이그레이션이 완료되면 데이터의 유효성을 검사하고 모든 것이 최대한 원활하고 효율적으로 작동하는지 확인하기 위해 일련의 마이그레이션 후 작업을 거쳐야 합니다.

특정 인덱스에 대한 데이터 유효성 검사 프로세스는 일반적으로 다음 작업으로 구성됩니다.

데이터 비교: Azure Data Explorer 클러스터의 마이그레이션된 데이터를 Elasticsearch의 원래 데이터와 비교합니다. 두 환경에서 데이터를 쿼리하고 시각화할 수 있는 ELK 스택의 Kibana와 같은 도구를 사용하여 이 작업을 수행할 수 있습니다.

쿼리 실행: Azure Data Explorer 클러스터에서 마이그레이션된 데이터에 대해 일련의 쿼리를 실행하여 데이터가 정확하고 완전한지 확인합니다. 여기에는 서로 다른 필드 간의 관계를 테스트하는 실행 쿼리와 데이터의 무결성을 테스트하는 쿼리가 포함됩니다.

누락된 데이터 확인: 클러스터의 마이그레이션된 데이터를 Elasticsearch의 데이터와 비교하여 누락된 데이터, 중복 데이터 또는 기타 데이터 불일치를 검사.

성능 유효성 검사: 클러스터에서 마이그레이션된 데이터의 성능을 테스트하고 Elasticsearch의 데이터 성능과 비교합니다. 여기에는 쿼리를 실행하고 데이터를 시각화하여 응답 시간을 테스트하고 클러스터의 데이터가 성능에 최적화되었는지 확인하는 것이 포함될 수 있습니다.

중요

마이그레이션된 데이터 또는 클러스터를 변경한 경우 데이터 유효성 검사 프로세스를 반복하여 데이터가 여전히 정확하고 완전한지 확인합니다.

다음은 클러스터의 데이터의 유효성을 검사하기 위해 실행할 수 있는 쿼리의 몇 가지 예입니다.

  1. Elasticsearch에서 다음 쿼리를 실행하여 를 가져옵니다.

    // Gets the total record count of the index
    GET vehicle/_count
    
    // Gets the total record count of the index based on a datetime query
    GET vehicle/_count
    {
      "query": {
        "range" : {
          "releaseDate": { "gte": "2021-01-01", "lte": "2021-12-31" }
                  }
              }
    }
    
    // Gets the count of all vehicles that has manufacturer as "Honda".
    GET vehicle/_count
    {
      "query": {
        "bool" : {
          "must" : {
            "term" : { "manufacturer" : "Honda" }
          }
        }
      }
    }
    
    // Get the record count where a specific property doesn't exist.
    // This is helpful especially when some records don't have NULL properties.
    GET vehicle/_count
    {
      "query": {
        "bool": {
          "must_not": {
            "exists": {
              "field": "description"
            }
          }
        }
      }
    }
    
  2. 데이터베이스 쿼리 창에서 다음 해당 쿼리를 실행합니다.

    // Gets the total record count in the table
    Vehicle
    | count
    
    // Gets the total record count where a given property is NOT empty/null
    Vehicle
    | where isnotempty(Manufacturer)
    
    // Gets the total record count where a given property is empty/null
    Vehicle
    | where isempty(Manufacturer)
    
    // Gets the total record count by a property value
    Vehicle
    | where Manufacturer == "Honda"
    | count
    
  3. 두 쿼리 집합의 결과를 비교하여 클러스터의 데이터가 정확하고 완전한지 확인합니다.

Azure Database Explorer 대한 자세한 내용은 다음을 참조하세요.

클라우드 마이그레이션의 프레임워크 및 채택 주기에 대해 자세히 알아보려면 다음을 참조하세요.