본문 바로가기
ELK stack

[ELK] 11. elasticsearch 인덱스 재색인 (2) - 인덱스 템플릿과 스크립트 사용

by 천뿌니 2022. 7. 3.
728x90

인덱스 템플릿

아파치 로그 형태의 데이터를 같은 매핑 형태로 넣어주기 위해서 _index_template 활용합니다.

PUT /_index_template/mylogs
{
  "index_patterns" : [
    "mylogs*"
  ],
  "priority" : 10,
  "template": {
    "mappings": {
      "properties" : {
      	{재설정한 필드 매핑}
      }
   	}
  }
}

 

mylogs라는 인덱스 템플릿 확인 - 지우는 건 DELETE

GET _index_template/mylogs
DELETE _index_template/mylogs

 

인덱스 재색인

인덱스 재색인을 위해 source에 apachelog-*의 이름의 파일들을 전체 적용합니다. 

주의할 점은 dest에 mylogs-*로 하면 되지 않을까? 인데 아래와 같이 하면 오류가 납니다.

POST _reindex
{
  "source": {
    "index": "apachelog-*"
  },
  "dest": {
    "index": "mylogs"
  }
}

dest에는 mylogs에 하나로 모으지 않고 apachelog의 날짜에 맞게 따로 저장하기 위해서 mylogs-{각 데이터 날짜}가 필요합니다. 즉, 스크립트가 필요합니다.

스크립트(painless script) 인덱스 재색인을 해보겠습니다.

POST _reindex
{
  "source": {
    "index": "apachelog-*"
  },
  "dest": {
    "index": "mylogs",
  },
  "script": {
    "lang": "painless",
    "source": "ctx._index = 'mylogs-' + (ctx._index.substring('apachelog-'.length(), ctx._index.length()))"
  }
}

 

 

필요 없는 필드 삭제

방법 1 : 소스에서 제거해서 나머지 필드만 가져오기

방법 2 : source->dest로 넘어갈 때 스크립트로 삭제하는 방법(_ingest/pipeline 사용)

PUT _ingest/pipeline/mylogs_delete_fields
{
  "processors": [
    {
    "remove": {
      "field": ["clientip", "ecs", "input", "tags", "log"]
      }
    }
  ]
}
# 스크립트(painless script) 인덱스 재색인 + _ingest/pipeline(remove)
POST _reindex
{
  "source": {
    "index": "apachelog-*"
  },
  "dest": {
    "index": "mylogs",
    "pipeline": "mylogs_delete_fields"
  },
  "script": {
    "lang": "painless",
    "source": "ctx._index = 'mylogs-' + (ctx._index.substring('apachelog-'.length(), ctx._index.length()))"
  }
}

전체 아파치 로그 데이터 재색인(새로 적용한 템플릿 적용) 한 후 확인해보면 아래와 같이 나타납니다.

GET _cat/indices/mylogs*

데이터가 많기 때문에 생략

# 하나의 데이터 mapping 확인
GET mylogs-2020.08.08/_mapping

 

 

tips

1. elasticsearch에서 데이터를 한번 색인을 할 때 mapping 정보가 잘못 들어가면 재색인을 해야 합니다.
2. 다음 예제는 데이터가 30만 건 밖에 되지 않지만 실제 현업에서 이렇게 재색인하면 비효율적입니다.
3. mappings이나 settings 정보들은 데이터 전체를 색인하기 전에 실제 데이터 일부만 넣어서 생성된 mappings을 보고 오류/최적화 진행 후 template을 만들고 난 뒤 실제 데이터를 색인하면 더 효율적입니다.

 

 

 

마무리

이번 포스팅은 elasticsearch의 필드 매핑과 그것을 효율적으로 하는 인덱스 템플릿과 스크립트에 대해 알아보았습니다.

다음 포스팅은 중요한 개념인 샤드와 역 인덱스에 대해 알아보겠습니다. 감사합니다.

댓글