ELK
2022-05-20ELK 스택?
"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 |
데이터 플로어
Azure HCI ELK
키바나 데모
질의
- 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