인프라 담당자로 경력을 쌓다 보니, 쿼리나 이런 부분에 대해서는 예전 호스팅업체를 다닐 때 mysql에서 select정도만
사용해 보고 지식이 전무한 상태이다. Elastic Stack을 임시 구축하며 느끼기에 Elastic Stack에 대한 구축도 중요하지만
운영도 해야기에 껍질만 구축해선 안된다는 생각이 들었다.
그리고 정작 원하는 데이터를 가지고 알람 설정등을 진행해야하는데, 개발 인력의 도움 없이 혼자서 진행하려고 하니,
구축은 어느정도 했으나 엘라스틱서치에 데이터 조회 부분부터 막막하여 , ElasticSearch의 기초적인 부분을 공부하고자 한다.
ElasticSearch 중요한 개념 두 가지
첫 번째. Documents
데이터베이스적 관점에서 생각한다면 문서는 어떤 Entity를 나타내는 데이터베이스에서 한 줄의 행과 같은 역할을 하며 검색의 대상이다. 모든 문서는 유니크한 ID를 가지고 있으며 직접 할당할 수도 있다.
두 번째. Indices
Index는 ES에서 쿼리 할 수 있는 가장 높은 단계의 Entity이며, 여러 문서를 포함할 수 있다. 데이터베이스로 치면 테이블과 같은 개념이다. Index는 데이터유형의 정의하는 체계가 있으며, 하나의 ES와 index에는 한 가지 유형의 Documents만 사용할 수 있다.
*기존 데이터베이스와 비교하자면, 클러스터(데이터베이스) 인덱스(테이블) 문서(행)로 생각하면 이해하기가 쉽다.
ElasticSearch 통신 방법 및 CRUD
*ElasticSearch는 RESTful API 기반으로 통신을 한다.
이는 HTTP요청과 응답으로 ElasticSearch와 소통을 한다는 의미이며, 아래와 같은 메서드 동작을 통해 소통한다.
HTTP 메서드 | CRUD | SQL |
GET | Read | Select |
PUT | Update | Update |
POST | Create | Insert |
DELETE | Delete | Delete |
* CRUD란 (Create Read Update Delete)를 의미한다.
Elastic Search 필터/쿼리 동작
필터명 | 필터동작 | 쿼리명 | 쿼리동작 |
terms | 용어 필터 | match_all | 모두 반환되는 기본값,미지정시 모든결과반환 |
range | gt(초과),gte(이상),lt(미만),lte(이하) | match | 특정 단어에 대한 검색 |
exist | 존재여부 | multi_match | 여러필드 동시에 쿼리 |
missing | 해당 필터가 없는문서 | bool | bool 필터와 동일 |
bool | must(and),must not(not),shoud(or) | match_phrase | 구절 매치 (함께 붙어있어야함) slop사용에 따라 변경 |
예시 )
* index_test의 모든 값 반환
curl -XGET -H 'Content-Type: application/json' http://127.0.0.1:9200/index_test/_search?pretty -d '{ "query": { "match_all":{} } }' | more
* secure_test index의 syslog에 pam이 포함되고, pid가 300000 이하인 값을 조회.
curl -XGET -H 'Content-Type: application/json' http://127.0.0.1:9200/secure-test/_search?pretty -d '{
"query": { "bool": { "must": { "term": {"syslog":"pam"}},"filter":{"range":{"pid": {"lte": 300000}}} } } }'
*구문 쿼리는 쿼리 블록으로 싸여있고, 필터는 필터 블록으로 싸여있으며 쿼리 내에서 필터블록 필터 내에서 쿼리를 사용할 수 있다.
* 구절 매치 쿼리 match_phrase의 경우 함께 붙어있어야 정상조회 되지만, "slop"을 사용 시에 단어 사이에 slop 수만큼 단어를 매치시킬 수 있다.
curl -XGET -H 'Content-Type: application/json' http://127.0.0.1:9200/secure-test-8.11.4-2024.02.01/_search?pretty -d '
{
"query": {
"match_phrase": {
"syslog_detail": {"query": "pam_unix(sshd:session): opened","slop":1}
}
}
}'
* 결괏값 (pam_unix(sshd:session): 과 opened사이에 session이 들어갔으나 정상적으로 조회)
--중략--
"syslog_detail" : "pam_unix(sshd:session): session opened for user root by (uid=0)"
*추가로 반전된 구절도 매치할 수 있음, slop 1 설정 시 opend pam_unix(sshd:session): 와도 일치한다는 의미.
'Project > ElasticStack' 카테고리의 다른 글
beat-rsyslog 연동 이슈 (1) | 2024.09.26 |
---|---|
ElastAlert2 Alert UTC 타임존 문제 해결 (0) | 2024.09.25 |
로그 모니터링 시스템 구축 도전기 #2 로그 파싱룰 잡기(Grok) (0) | 2024.02.23 |
로그 모니터링 시스템 구축 도전기 #0.1 ElastAlert (0) | 2024.01.28 |
로그 모니터링 시스템 구축 도전기#0 (0) | 2023.02.09 |