ELK

ELK 스택?

elk-stack

"ELK"는 Elasticsearch, Logstash 및 Kibana, 이 오픈 소스 프로젝트 세 개의 머리글자입니다. Elasticsearch는 검색 및 분석 엔진입니다. Logstash는 여러 소스에서 동시에 데이터를 수집하여 변환한 후 Elasticsearch 같은 “stash”로 전송하는 서버 사이드 데이터 처리 파이프라인입니다. Kibana는 사용자가 Elasticsearch에서 차트와 그래프를 이용해 데이터를 시각화할 수 있게 해줍니다.

Elastic Stack은 ELK Stack이 그 다음 단계로 발전한 것입니다.

OpenSource VS SSPL

2021년 1월 21일 Elastic 라이센스 정책은 APACHE LICENSE VERSION 2.0에서 SSPL로 변경되었습니다.

스택별 역활

이름 언어 바인딩 역활 기본포트
Elasticsearch Lucene+Java json 검색엔진 9200
Logstash Java PipeLine 데이터 저장 -
filebeat Java PipeLine 파일 데이터 수집, 전달 5044
Metricbeat Java PipeLine 시스템 정보 수집, 전달 -
Winlogbeat Java PipeLine Windows 이벤트 로그 수집, 전달 -
Packetbeat Java PipeLine 네트워크패킷 수집, 전달 -
Heartbeat Java PipeLine 가동시간 수집, 전달 -
Kibana Java json 웹 데이터 시각화 5601

데이터 플로어

dataflow

Azure HCI ELK

dataflow

키바나 데모

질의

  • KQL : Kibana Query Language [기본]
  • LQS : Lucene Query Syntax
  • Query DSL : Domain Specific Language

    CURD는 Restful 규칙에 따라 PUT:생성,POST:업데이트,GET:검색,DELETE:삭제

인덱스 검색

GET _cat/indices/?v&h=index,docs.count,docs.deleted,pri.store.size&s=index,health&format=json
GET _cat/indices/?v&h=index,docs.count,docs.deleted,pri.store.size&s=index

검색 질의

GET /<index>/_search
{
  "query": {<parameters>}
}

GET my-incidence/_search
{
    "query" : {
        "term" : { "field1" : "value1" }
    }
}

기간검색

GET my-incidence/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "2099-05-05",
        "lt": "2099-05-08"
      }
    }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

단일 문서 생성 질의

POST  my-incidence/_doc
{
  "field1": {
    "field2": "value2"
  }
}

리인덱스

#reindex
POST _reindex
{
  "source": {
    "index": "localdata-raw-accommodation-202207"
  },
  "dest": {
      "index": "raw-localdata-accommodation-202207"
  }
}
POST _reindex
{
  "source": {
    "index": "logs-localdata-accommodation-202207"
  },
  "dest": {
      "index": "temp-localdata-accommodation-202207"
  }
}
#일부만 리인덱싱
POST _reindex
{
  "source": {
    "index": "old-index-name",
    "_source": {
      "includes": ["field1", "field2"]
    }
  },
  "dest": {
      "index": "new-index-name"
  }
}
#쿼리검색으로 리인덱싱
POST _reindex
{
  "source": {
    "index": "old-index-name",
    "_source": {
      "includes": ["field1", "field2"]
    },
    "size": 10000,
    "query": {
      "bool": {
        "filter": [
          {
            "match_phrase": {
              "field1": "search_keyword"
            }
          },
          {
            "range": {
              "datetime": {
                "gte": "2018-07-05T05:05:54.000Z"
              }
            }
          }
        ]
      }
    }
  },
  "dest": {
      "index": "new-index-name"
  }
}

벌크 쿼리

PUT logs-my_app-default/_bulk
{"index":{"_index":"my-incidence","_id":"1"}}
{"field1":"value1"}
{"index":{"_index":"my-incidence","_id":"2"}}
{"field":"value2"}
{"delete":{"_index":"my-incidence","_id":"2"}}
{"create":{"_index":"my-incidence","_id":"3"}}
{"field":"value3"}
{"update":{"_index":"my-incidence","_id":"1"}}
{"doc":{"field":"value2"}}
{"delete":{"_index":"my-incidence","_id":"2"}}

ES 메타데이터 생성

## 공공데이터 숙박업소 메타 데이터
GET  meta-data/_search
DELETE meta-data
PUT meta-data/_doc/logs-localdata-accommodation-202207
{
  "properties" : {
    "coordinates" : {
      "type" : "geo_point"
      ,"description" : "공간좌표"
    },
    "no" : {
      "type" : "long"
      ,"description" : "번호"      
    },
    "service_name" : {
      "type" : "text"
      ,"description" : "개방서비스명"    
    },
    "service_id" : {
      "type" : "text"
      ,"description" : "개방서비스아이디"    
    },
    "org_code" : {
      "type" : "long"
      ,"description" : "개방자치단체코드"    
    },
    "mng_no" : {
      "type" : "text"
      ,"description" : "관리번호"    
    },      
    "license_reg_date" : {
      "format": "yyyyMMdd||epoch_millis"
      ,"type" : "date"
      ,"description" : "인허가일자"    
    },     
    "license_cancel_date" : {
      "format": "yyyyMMdd||epoch_millis"
      ,"type" : "date"
      ,"description" : "인허가취소일자"    
    },
    "state_code" : {
      "type" : "text"
      ,"description" : "영업상태구분코드"         
    },
    "state_name" : {
      "type" : "text"
      ,"description" : "영업상태명"           
    },
    "state_detail_code" : {
      "type" : "text"
      ,"description" : "상세영업상태코드"         
    },
    "state_detail_name" : {
      "type" : "text"
      ,"description" : "상세영업상태명"           
    },    
    "shutdown_date" : {
      "format": "yyyyMMdd||epoch_millis",
      "type" : "date"
      ,"description" : "폐업일자"         
    },
    "closed_start_date" : {
      "format": "yyyyMMdd||epoch_millis",
      "type" : "date"
      ,"description" : "휴업시작일자"         
    },
    "closed_end_date" : {
      "format": "yyyyMMdd||epoch_millis",
      "type" : "date"
      ,"description" : "휴업종료일자"         
    },
    "reopen_date" : {
      "format": "yyyyMMdd||epoch_millis",
      "type" : "date"
      ,"description" : "재개업일자"         
    },
    "site_tel" : {
      "type" : "text"
      ,"description" : "소재지전화"         
    },
    "site_area" : {
      "type" : "float"
      ,"description" : "소재지면적"         
    },
    "site_post" : {
      "type" : "long"
      ,"description" : "소재지우편번호"         
    },
    "site_address" : {
      "type" : "text"
      ,"description" : "소재지전체주소"         
    },
    "region_1depth_name": {
      "type" : "text"
      ,"description" : "소재지 시도"         
    },    
    "region_2depth_name": {
      "type" : "text"
      ,"description" : "소재지 군구"         
    }, 
    "region_3depth_h_name": {
      "type" : "text"
      ,"description" : "소재지 읍면동"         
    }, 
    "region_3depth_name": {
      "type" : "text"
      ,"description" : "소재지 군구읍면동 "         
    }, 
    "main_address_no": {
      "type" : "text"
      ,"description" : "소재지 번"         
    }, 
    "sub_address_no": {
      "type" : "text"
      ,"description" : "소재지 지"         
    },                     
    "road_address" : {
      "type" : "text"
      ,"description" : "도로명전체주소"         
    },
    "road_building_name" : {
      "type" : "text"
      ,"description" : "도로 건물명"         
    },
    "road_main_building_no": {
      "type" : "text"
      ,"description" : "도로주소 빌딩번호"         
    },    
    "road_region_1depth_name": {
      "type" : "text"
      ,"description" : "도로주소 시도"         
    }, 
    "road_region_2depth_name": {
      "type" : "text"
      ,"description" : "도로주소 군구"         
    }, 
    "road_region_3depth_name": {
      "type" : "text"
      ,"description" : "도로주소 읍면동 "         
    }, 
    "road_name": {
      "type" : "text"
      ,"description" : "도로주소명"         
    }, 
    "road_sub_building_no": {
      "type" : "text"
      ,"description" : "도로주소 빌딩부번"         
    },                     
    "road_underground_yn" : {
      "type" : "text"
      ,"description" : "도로주소 지하유무"         
    }, 
    "road_post" : {
      "type" : "long"
      ,"description" : "도로명우편번호"         
    },
    "business_name" : {
      "type" : "text"
      ,"description" : "사업장명"         
    },
    "last_update" : {
      "format": "yyyyMMddHHmmss||epoch_millis",
      "type" : "date"
      ,"description" : "최종수정시점"         
    },
    "update_type" : {
      "type" : "text"
      ,"description" : "데이터갱신구분"         
    },
    "update_date" : {
      "type" : "date"
      ,"format": "yyyy-MM-dd HH:mm:ss.S||epoch_millis"   
      ,"description" : "데이터갱신일자"             
    },
    "business_type" : {
      "type" : "text"
      ,"description" : "업태구분명"         
    },
    "x" : {
      "type" : "float"
      ,"description" : "좌표정보(X)"         
    },
    "y" : {
      "type" : "float"
      ,"description" : "좌표정보(Y)"         
    },
    "sanitary_business_name" : {
      "type" : "text"
      ,"description" : "위생업태명"         
    },
    "building_ground" : {
      "type" : "long"
      ,"description" : "건물지상층수"         
    },
    "building_underground" : {
      "type" : "long"
      ,"description" : "건물지하층수"         
    },
    "use_start_ground" : {
      "type" : "long"
      ,"description" : "사용시작지상층"         
    },
    "use_end_ground" : {
      "type" : "long"
      ,"description" : "사용끝지상층"         
    },
    "use_start_underground" : {
      "type" : "long"
      ,"description" : "사용시작지하층"         
    },
    "use_end_underground" : {
      "type" : "long"
      ,"description" : "사용끝지하층"         
    },
    "krean_rooms" : {
      "type" : "long"
      ,"description" : "한실수"         
    },
    "western_rooms" : {
      "type" : "long"
      ,"description" : "양실수"         
    },
    "bath_rooms" : {
      "type" : "long"
      ,"description" : "욕실수"         
    },
    "sweating_rooms" : {
      "type" : "text"
      ,"description" : "발한실여부"         
    },      
    "seat" : {
      "type" : "long"
      ,"description" : "좌석수"         
    },
    "conditional_perm_reason" : {
      "type" : "text"
      ,"description" : "조건부허가신고사유"         
    },
    "conditional_perm_start_date" : {
      "format": "yyyyMMdd||epoch_millis",
      "type" : "date"
      ,"description" : "조건부허가시작일자"         
    },
    "conditional_perm_end_date" : {
      "format": "yyyyMMdd||epoch_millis",
      "type" : "date"
      ,"description" : "조건부허가종료일자"         
    },
    "building_owned" : {
      "type" : "text"
      ,"description" : "건물소유구분명"         
    },
    "washing_machine" : {
      "type" : "long"
      ,"description" : "세탁기수"         
    },
    "female_employee" : {
      "type" : "long"
      ,"description" : "여성종사자수"         
    },
    "male_employee" : {
      "type" : "long"
      ,"description" : "남성종사자수"         
    },
    "drying_machine" : {
      "type" : "long"
      ,"description" : "회수건조수"         
    },
    "bed" : {
      "type" : "long"
      ,"description" : "침대수"         
    },
    "multi_use_business" : {
      "type" : "text"
      ,"description" : "다중이용업소여부"         
    },
    "kakao":{
      "properties" : {
        "address" : {
          "properties" : {
            "address_name" : {
              "type" : "text",
              "description" : "전체 지번 주소"
            },
            "b_code" : {
              "type" : "long",
              "description" : "법정 코드"              
            },
            "h_code" : {
              "type" : "long",
              "description" : "행정 코드"              
            },
            "main_address_no" : {
              "type" : "long",
              "description" : "지번 주번지"
            },
            "mountain_yn" : {
              "type" : "text",
              "description" : "산 여부, Y 또는 N"
            },
            "region_1depth_name" : {
              "type" : "text",
              "description" : "지역 1 Depth, 시도 단위"
            },
            "region_2depth_name" : {
              "type" : "text",
              "description" : "지역 2 Depth, 구 단위"
            },
            "region_3depth_h_name" : {
              "type" : "text",
              "description" : "지역 3 Depth, 동 단위"
            },
            "region_3depth_name" : {
              "type" : "text",
              "description" : "지역 3 Depth, 행정동 명칭"
            },
            "sub_address_no" : {
              "type" : "long",
              "description" : "지번 부번지"
            },
            "x" : {
              "type" : "float",
              "description" : "X 좌표값, 경위도인 경우 경도(longitude)"
            },
            "y" : {
              "type" : "float",
              "description" : "Y 좌표값, 경위도인 경우 위도(latitude)"
            }
          }
        },
        "address_name" : {
          "type" : "text",
          "description" : "전체 지번 주소 또는 전체 도로명 주소, 입력에 따라 결정됨"
        },
        "address_type" : {
          "type" : "text",
          "description" : "REGION(지명)/ROAD(도로명)/REGION_ADDR(지번 주소)/ROAD_ADDR(도로명 주소)"
        },
        "road_address" : {
          "properties" : {
            "address_name" : {
              "type" : "text",
              "description" : "전체 도로명 주소"
            },
            "building_name" : {
              "type" : "text",
              "description" : ""
            },
            "main_building_no" : {
              "type" : "long",
              "description" : "건물 본번"
            },
            "region_1depth_name" : {
              "type" : "text",
              "description" : "지역명1"
            },
            "region_2depth_name" : {
              "type" : "text",
              "description" : "지역명2"
            },
            "region_3depth_name" : {
              "type" : "text",
              "description" : "지역명3"
            },
            "road_name" : {
              "type" : "text",
              "description" : "도로명"
            },
            "sub_building_no" : {
              "type" : "long",
              "description" : "건물 부번"
            },
            "underground_yn" : {
              "type" : "text",
              "description" : "지하 여부, Y 또는 N"
            },
            "x" : {
              "type" : "float",
              "description" : "X 좌표값, 경위도인 경우 경도(longitude)"
            },
            "y" : {
              "type" : "float",
              "description" : "Y 좌표값, 경위도인 경우 위도(latitude)"
            },
            "zone_no" : {
              "type" : "long",
              "description" : "우편번호(5자리)"
            }
          }
        },
        "x" : {
          "type" : "float",
          "description" : "X 좌표값, 경위도인 경우 경도(longitude)"
        },
        "y" : {
          "type" : "float",
          "description" : "Y 좌표값, 경위도인 경우 위도(latitude)"
        }
      }
    }
  } 
}

SQL 쿼리 변환 기능

GET /_sql/translate
{
  "query": "SELECT max(score) FROM gcp_failure GROUP BY c_key"
}

Cli 환경에서 Curl 질의

curl -XGET "http://localhost:9200/_bulk" -H 'Content-Type: application/json' -d {"query":{"term":{"field1":"value1"}}

Cli 환경에서 Basic Auth Curl 질의

curl -u 'user/Password!' -XPOST "http://localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @bulk.json
elasticsearch