본문 바로가기

데이터베이스/ELK

[ElasticSearch] ILM 기능으로 인덱스 주기 관리

이번에는 며칠동안 삽질했던 ILM 정책을 수립하는 과정에 대해서 기록하려고 한다.

환경은 3개의 클라우드 서버 환경에서 각 1개의 노드를 설정하였다. 또한, 노드의 옵션을 hot, warm, cold로 두어서 로그를 효율적으로 관리하려고 한다.
물론 master로 설정된 노드는 키바나가 설치되어 있어야 한다. (로그스태시는 자유)

 

마스터 노드가 있는 서버에서 키바나 Dev Tools로 접속을 한다.

# 모든 인덱스 조회
GET _cat/indices?v

# 모든 노드 조회
GET _cat/nodes?v

# 각 노드의 Roles 조회
GET _cat/nodeattrs?v&s=name
GET _nodes?filter_path=nodes.*.name,nodes.*.roles

위의 명령어를 통해서 각 인덱스와 노드, 규칙을 확인한다. 

각 노드들은 hot, warm, cold가 설정되어 있어야 하기 때문에 확인하는 작업이 꼭 필요하다. 

hot, warm, cold 설정은 docker-compose.yml 파일에 하지말고 elasticsearch.yml에 하는 것을 추천.

 

 

1. 템플릿 생성

그 다음은 템플릿을 생성할 것이다.

템플릿은 곧 생설할 ILM과 인덱스를 연결시켜주는 역할을 한다.

create template 버튼을 누르고,

 

테스트 용으로 만들 my-index*라는 인덱스 패턴을 입력한다. (꼭 와일드카드도 같이 입력하도록 권장)

입력했으면 밑에 Next를 두번 넘어간다.

 

인덱스 세팅에서 아래의 코드를 입력한다.

  "index": {
    "lifecycle": {
      "name": "my-ilm",
      "rollover_alias": "my-index"
    },
    "number_of_shards": "2",
    "number_of_replicas": "0"
  }

인덱스의 수명 주기 정책을 "my-ilm"이라는 이름의 정책을 사용한다는 의미이고, "my-index"라는 인덱스를 사용한다는 의미이다.

또한, 2개의 샤드와 0개의 레플리카를 생성하는 것이다.

 

그리고 밑에 Next를 누르다가 create를 누르면 템플릿이 생성된다.

 

 

2. ILM 생성

이제는 hot, warm, cold에 맞게끔 인덱스를 관리할 정책을 만들 것이다.

create를 누르고,

 

hot phase에서는 샤드의 최대 용량을 20 키로바이트로 하고, 1일까지 핫 노드에 있을수 있도록 한다.

 

warm phase에서는 hot 노드에서 벗어난 인덱스 중에 0일이 지난 인덱스를 타겟으로 하고, shrink와 force merge를 통해서 웜 노드로 들어온 인덱스는 샤드의 수를 1개로 하고 데이터 크기를 수축한다.

 

cold phase는 날짜만 입력하면 편하다...

 

 

3. 인덱스 생성

템플릿과 ILM을 생성했으면 입력한 이름의 인덱스를 만들것이다.

 

# 인덱스 생성
# 000001을 붙여야 핫 페이즈에서 rollover가 가능하다.
PUT my-index-000001 
{ 
  "aliases": {
    "my-index": {
      "is_write_index": true
    }
  }
}


# 수명 주기 업데이트를 5초로 한다. 기본 10분
PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "5s"
  }
}

# my-index에 더미 데이터를 생성
# 더미데이터 생성
POST my-index/_bulk?refresh=true
{"index":{}}
{"message": "The quick brown fox"}
{"index":{}}
{"message": "The quick brown dog"}
{"index":{}}
{"message": "The quick brown cat"}
{"index":{}}
{"message": "The quick brown lion"}

위 명령어처럼 더미 데이터까지 생성하였으면, 샤드가 몇개 있는지 데이터가 몇개 들어가있는지 확인하는 명령어도 필요하다.

 

# 인덱스의 샤드, 레플리카, 갯수, 크기 등을 출력한다.
GET _cat/indices/my-index*?v&h=index,pri,rep,docs.count,store.size

# 인덱스의 샤드를 출력
GET _cat/shards/*my-index*