SQL 검색 명령어와 Splunk 검색 명령어 간에 완벽히 일치하는 점은 없지만, SQL에 익숙할 경우 다음과 같이 간단한 비교를 통해 Splunk를 사용하는 데 도움을 받을 수 있습니다.
데이터베이스 측면에서 Splunk는 내재된 시간적 차원을 이용하는 비관계형의 반구조적인 분산 데이터베이스입니다. 규범적 인 의미에서 Splunk는 데이터베이스(관계형 데이터베이스의 경우 모든 테이블 컬럼이 사전에 정의되어야 하고 새 하드웨어 에 연결하는 것만으로는 자동 확장되지 않음)가 아니지만 데이터베이스의 개념과 유사한 점이 많습니다.
DB개념 | Splunk 개념 | 참고 |
---|---|---|
SQL쿼리 | Splunk 검색 | Splunk 검색은 인덱스 데이터를 검색하고 변환 및 보고 작업을 수행할 수 있습니다. 검색 결과를 명령어 간에 "연결" 또는 전송하여 결과를 필터링하고 수정하며 순서를 변경하고 그룹화할 수 있습니다. |
테이블/뷰 | 검색 결과 | 검색 결과를 컬럼이 있는 행 테이블로 동적 생성되는 데이터베이스 뷰로 볼 수 있습니 다. |
index | index | 모든 값과 필드가 Splunk에서 인덱싱되므로 인덱싱 컬럼을 수동으로 추가하거나 업 데이트 및 삭제할 필요도 없습니다. 모든 데이터를 자동으로 신속하게 검색할 수 있습 니다. |
row | 결과/이벤트 | Splunk에서는 결과가 테이블 행에 해당되는 필드(컬럼) 값 리스트로 표시됩니다. 이 벤트는 타임스탬프와 원시 텍스트가 있는 결과입니다. 일반적으로 이벤트는 다음과 같은 로그 파일의 레코드입니다. 173.26.34.223 - - [01/Jul/2009:12:05:27 -0700] "GET /trade/app?action=logout HTTP/1.1" 200 2953 |
column | field | Splunk의 필드는 검색에서 동적으로 반환됩니다. 다시 말해 검색마다 다른 필드 집합 이 반환될 수 있습니다. 원시 기본 데이터에서 더 많은 필드를 추출하도록 Splunk를 설정한 후 동일한 검색을 수행하면 이전 검색보다 더 많은 필드를 반환합니다. Splunk의 필드는 데이터 유형과 관련이 없습니다. |
데이터베이스/스 키마 | 인덱스/앱 | Splunk에서 인덱스는 데이터를 수집한 것으로, 데이터베이스에 테이블을 수집하는 것과 유사합니다. 해당 데이터의 도메인 정보, 데이터 추출 방법, 실행할 보고서 등이 Splunk 앱에 저장됩니다. |
아래 예에서는 Splunk의 “source” 필드 값을 “테이블”의 프록시로 사용합니다. Splunk에서 “source”는 특정 데이터의 출처 가 되는 파일, 스트림 또는 입력으로, /var/log/messages 또는 UDP:514를 예로 들 수 있습니다. 다른 언어로 변환할 경우 원래 언어에서 사용되는 관용적인 표현으로 인해 변환에 시간이 오래 걸리는 경우가 많습니다. 아래 에 제시된 Splunk 검색 예 중 일부는 더 간결하게 작성할 수 있지만 유사성과 명확성을 위해 테이블 및 필드 이름을 SQL과 동일하게 유지했습니다. 또한 사용자 인터페이스에서 더 편리한 방법을 이용할 수 있기 때문에 컬럼을 추출하는 데 FIELDS 명령어를 거의 사용하지 않으며 검색어 사이에 “AND” 연산자가 포함되어 있기 때문에 부울 검색에 “AND”를 사용할 필요가 없습니다.
SQL 명령어 | SQL 예제 | Splunk 예제 |
---|---|---|
SELECT * | SELECT * FROM mytable | source=mytable |
WHERE | SELECT * FROM mytable WHERE mycolumn=5 | source=mytable mycolumn=5 |
SELECT | SELECT mycolumn1, mycolumn2 FROM mytable | source=mytable | FIELDS mycolumn1, mycolumn2 |
AND/OR | SELECT * FROM mytable WHERE (mycolumn1="true" OR mycolumn2="red") AND mycolumn3="blue" | source=mytable AND (mycolumn1="true" OR mycolumn2="red") AND mycolumn3="blue" |
AS (alias) | SELECT mycolumn AS column_alias FROM mytable | source=mytable | RENAME mycolumn as column_alias | FIELDS column_alias |
BET WEEN | SELECT * FROM mytable WHERE mycolumn BETWEEN 1 AND 5 | source=mytable mycolumn>=1 mycolumn<=5 |
GROUP BY | SELECT mycolumn, avg(mycolumn) FROM mytable WHERE mycolumn=value GROUP BY mycolumn | source=mytable mycolumn=value | STATS avg(mycolumn) BY mycolumn | FIELDS mycolumn, avg(mycolumn) |
H A V IN G | SELECT mycolumn, avg(mycolumn) FROM mytable WHERE mycolumn=value GROUP BY mycolumn HAVING avg(mycolumn)=value | source=mytable mycolumn=value | STATS avg(mycolumn) BY mycolumn | SEARCH avg(mycolumn)=value | FIELDS mycolumn, avg(mycolumn) |
LIKE | SELECT * FROM mytable WHERE mycolumn LIKE "%some text%" | source=mytable mycolumn="*some text*" 참고: Splunk에서 가장 일반적으로 사용되는 검 색 방법은 실제로 SQL에서는 거의 불가능한 모 든 필드에서 하위 문자열을 검색하는 방법입니 다.다음은 "some text"가 포함된 모든 행을 반 환하는 검색입니다. source=mytable "some text" |
ORDER BY | SELECT * FROM mytable ORDER BY mycolumn desc | source=mytable | SORT -mycolumn |
SELECT DISTINCT | SELECT DISTINCT mycolumn1, mycolumn2 FROM mytable | source=mytable | DEDUP mycolumn1 | FIELDS mycolumn1, mycolumn2 |
SELECT TOP | SELECT TOP 5 mycolumn1, mycolumn2 FROM mytable | source=mytable | TOP mycolumn1, mycolumn2 |
INNER JOIN | SELECT * FROM mytable1 INNER JOIN mytable2 ON mytable1.mycolumn=mytable2.mycolumn | source=mytable1 | JOIN type=inner mycolumn [ SEARCH source=mytable2 ] 참고: 다음과 같은 두 가지 조인 방법이 더 있습 니다. lookup 명령어를 사용하여 외부 테이블 의 필드 추가: ... | LOOKUP myvaluelookup mycolumn OUTPUT myoutputcolumn 하위 검색 사용: source=mytable1 [ SEARCH source=mytable2 mycolumn2=myvalue |FIELDSmycolumn2 ] |
LEFT (OUTER) JOIN | SELECT * FROM mytable1 LEFT JOIN mytable2 ON mytable1.mycolumn=mytable2.mycolumn | source=mytable1 | JOIN type=left mycolumn [ SEARCH source=mytable2 ] |
SELECT INTO | SELECT * INTO new_mytable IN mydb2 FROM old_mytable | source=old_mytable | EVAL source=new_mytable | COLLECT index=mydb2 참고: COLLECT는 일반적으로 많은 비용을 들 여 계산되는 필드를 향후에 보다 신속하게 액세 스할 수 있도록 Splunk로 다시 저장하는 데 사 용됩니다. 이 예는 일반적이지 않지만 SQL 명령 어와 비교하기 위해 제공되었습니다. source 이 름은 orig_source로 바뀝니다. |
TRUNCATETABLE | TRUNCATE TABLE mytable | source=mytable | DELETE |
INSERT INTO | INSERT INTO mytable VALUES (value1, value2, value3,....) | 참고: SELECT INTO를 참조하십시오.개별 레 코드는 검색 언어를 통해 추가되지 않지만 필요 한 경우 API를 통해 추가할 수 있습니다. |
UNION | SELECT mycolumn FROM mytable1 UNION SELECT mycolumn FROM mytable2 | source=mytable1 | APPEND [ SEARCH source=mytable2] | DEDUP mycolumn |
UNIONALL | SELECT * FROM mytable1 UNION ALL SELECT * FROM mytable2 | source=mytable1 | APPEND [ SEARCH source=mytable2] |
DELETE | DELETE FROM mytable WHERE mycolumn=5 | source=mytable1 mycolumn=5 | DELETE |
UPDATE | UPDATE mytable SET column1=value, column2=value,... WHERE some_column=some_value | 참고: Splunk에서 레코드를 업데이트할 경우 몇 가지 고려할 점이 있습니다. 첫째, Splunk는 항 상 가장 최근의 결과를 먼저 반환하므로 새 값을 Splunk에 추가할 수 있고(INSERT INTO 참조) 이전 값을 삭제하는 것에 대해서는 신경쓸 필요 가 없습니다. 둘째, 검색 시 항상 중복된 결과를 제거하여 가장 최근의 값만 사용되도록 할 수 있 습니다(SELECT DISTINCT 참조).마지막으로, 이전 레코드를 실제로 삭제할 수 있습니다 (DELETE 참조). |
sourcetype=acc* | stats count
sourcetype=acc* earliest=-1d-1h latest=-10m
source=iris.json
sourcetype=access_combined