ELK stack

[ELK] 10. elasticsearch 인덱스 재색인 (1) - 필드 매핑 개선

천뿌니 2022. 7. 1. 21:25
728x90

필드 매핑 개선

전 포스팅까지 진행했다면 아파치 로그 데이터들을 elasticsearch에 모두 다운로드했다고 가정하겠습니다.

apachelog-{yyyy.MM.dd} 인덱스들 중 "apachelog-2020-08-08" 사용하겠습니다.

 

_mapping 으로 자동 생성된 필드들의 정보 확인

GET apachelog-2020-08-08/_search

GET apachelog-2020-08-08/_mapping

길기 때문에 생략

- 필드들의 타입과 속성들을 알 수 있습니다. 그리고 적합하지 않은 타입의 필드들을 개선할 필요가 있습니다.

 

 

필드 매핑 개선

적합하지 않은 타입의 필드들을 개선한 새로운 인덱스를 생성하겠습니다.

1. @timestamp : date(날짜) 필드
2. auth : keyword
3. clientip : geoip안에 있기 때문에 삭제
4. ecs : 삭제
5. bytes : long 타입
-- geoip --
1. city_name : 집계(keyword), 검색(text)을 위해 두기
<code는 keyword로 변경>
2. continent_code : 대륙 코드 - keyword로 변경
3. country_code2 : 나라 코드1 - keyword로 변경
4. country_code3 : 나라 코드2 - keyword로 변경
5. country_name : 나라 이름 - keyword로 변경
6. dma_code : long 타입
7. ip : elasticsearch ip 필드 사용
8. latitude, longitude : half_float
9. location : lat, lon이 하위필드가 아닌 geo_point 필드로 변경
10. postal_code : 우편 번호 - 국가에 따라 텍스트가 들어갈 수도 있기 때문에 keyword로 변경
11. region_code : 지역 코드 - keyword로 변경
12. region_name : 지역 이름 - keyword로 변경
13. timezone : text, keyword

------
6. httpversion : keyword
7. ident : keyword
8. input : filebeat에서 설정된 것, 삭제 가능
9. log : filebeat에서 설정된 것, 삭제 가능
10. message : keyword로 저장할 일이 없다. text로 확인
11. referrer : text, keyword
12. request : text, keyword
13. respnse : 응답 코드, keyword
14. tags : filebeat에서 설정된 것, 삭제 가능
------

-- useragent --
1. build : keyword 
2. device : keyword
3. major : text, keyword
4. minor : keyword
5. name : text, keyword
6. os : text, keyword
7. os_major : keyword
8. os_minor : keyword
9. os_name : text, keyword
10. patch : text, keyword
------
PUT mylog
{
  "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        }, 
        "auth" : {
          "type" : "keyword"
        },
        "bytes" : {
          "type" : "long"
        },
        "cloud" : {
          "properties" : {
            "account" : {
              "properties" : {
                "id" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "availability_zone" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "instance" : {
              "properties" : {
                "id" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "machine" : {
              "properties" : {
                "type" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "project" : {
              "properties" : {
                "id" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "provider" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "geoip" : {
          "properties" : {
            "city_name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "continent_code" : {
              "type" : "keyword"
            },
            "country_code2" : {
              "type" : "keyword"
            },
            "country_code3" : {
              "type" : "keyword"
            },
            "country_name" : {
              "type" : "keyword"
            },
            "dma_code" : {
              "type" : "long"
            },
            "ip" : {
              "type" : "ip"
            },
            "latitude" : {
              "type" : "half_float"
            },
            "location" : {
              "type": "geo_point"
            },
            "longitude" : {
              "type" : "half_float"
            },
            "postal_code" : {
              "type" : "keyword"
            },
            "region_code" : {
              "type" : "keyword"
            },
            "region_name" : {
              "type" : "keyword"
            },
            "timezone" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "httpversion" : {
          "type" : "keyword"
        },
        "ident" : {
          "type" : "keyword"
        },
        "message" : {
          "type" : "text"
        },
        "referrer" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "request" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "response" : {
          "type" : "keyword"
        },
        "useragent" : {
          "properties" : {
            "build" : {
              "type" : "keyword"
            },
            "device" : {
              "type" : "keyword"
            },
            "major" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "minor" : {
              "type" : "keyword"
            },
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "os" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "os_major" : {
              "type" : "keyword"
            },
            "os_minor" : {
              "type" : "keyword"
            },
            "os_name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "patch" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "verb" : {
          "type" : "keyword"
        }
      }
    }
}

이 글을 읽는 분들은 다이나믹으로 생성된 매핑을 위와 하나하나 따져가며 매핑을 재설정하는 것을 추천드립니다. 

따져간다는 것은 해당 필드들을 단순 검색으로만 사용할 것인지 집계나 정렬에도 사용할 건지 생각하면서 작성하는 것입니다.

위와 같이 mylog에 새로운 매핑을 생성하였고, 기존 "apachelog-2020-08-08"에 새로운 매핑으로 인덱스를 재색인 할 필요가 있습니다.

 

_reindex API 인덱스 재색인

POST _reindex {
 source : { index : "{source index}" },
 dest : { index : "{target index}" }
}


POST _reindex {
 source : { 
 	index : "apachelog-2020.08.08" 
 },
 dest : { 
    index : "mylog" 
 }
}

 

 

마무리

이번 포스팅은 필드 매핑 개선 후 인덱스 재색인 방법을 알아보았습니다.

여기까지 잘 따라오셨다면 의문점이 생기실 겁니다. 예를 들면, 파일이 많을 때 _reindex를 하나하나 수작업으로 처리해야 할까? 시간이 너무 많이 걸리진 않을까? 필요 없는 필드는 어떻게 삭제할까? 수작업? 등 많은 의문점이 생기시겠지만 그것들은 다음 포스팅인 인덱스 템플릿과 스크립트에서 설명하겠습니다. 감사합니다.