Splunk 배포방식
Splunk의 주요 컴포넌트는 검색을 담당하는 Search Head, 수집을 담당하는 Fowarder, 저장을 담당하는 Indexer가 존재합니다. 이 컴포넌트들을 어떤 형태로 배포하는지에 따라 다음과 같이 Splunk의 배포방식을 구분합니다.
Standalone
Splunk의 모든 기능과 컴포넌트가 단일 인스턴스에 모두 존재하는 가장 간소화 된 형태입니다. 주로 PoC를 위한 테스트나 개인적인 학습 용도로 사용합니다. Splunk를 설치하면 만나게 될 가장 기본적인 설정입니다.
Basic
Standalone과 비슷한 설정이지만 Splunk Server와 Forwarder로 데이터 저장과 수집이 구분된 형태입니다. Forwarder는 데이터 소스에 위치하여 데이터를 수집하고 Splunk Server에 전송합니다. Splunk Server는 데이터를 저장하며, Forwarder의 설정을 관리합니다.
Multi-Instance
Splunk는 분산 환경 Clustering을 통해 검색과 저장 성능이 크게 향상 될 수 있습니다. Multi-Instance 배포방식은 Splunk의 주요 컴포넌트가 모두 구분된 형태로 가장 효율적인 아키텍쳐입니다. 검색을 담당하는 Search Head, 저장을 담당하는 Indexer, 수집을 담당하는 Fowarder가 각각 다른 인스턴스에 위치하여 서로 연결되어 있는 형태입니다. 이 외에도 Indexer Clustering을 관리하는 Cluster Master(CM)이 존재할 수 있습니다.
Search Head Clustering
- Search Head들을 그룹화하여 검색을 위한 중앙 리소스를 형성하는 것
Deployer
- 다른 클러스터 App이나 설정값을 배포하는 인스턴스
- 클러스터 외에 위치하여 각 Indexer들에 설정값이나 App을 업데이트 하는 역할
Search Peers
- Search Head Cluster 내 Indexer들로 각 Indexer들은 독립적임
Load Balancer
- User와 Cluster Member들 사이에 존재하는 third-party 소프트웨어로 User는 Search Head Cluseter에 하나의 인터페이스를 통해 접근할 수 있음
- 하나의 Indexer가 Captain 역할을 하며 클러스터 내 다양한 활동을 총괄함
- 각 Indexer들은 Search Request,Schedule Jobs, Replicate Artifacts, Update Configurations, Coordinate other activities등을 수행하기 위해 서로 상호작용 할 수 있음
Captain
- 기본적으로 Search Header Cluster내 동적으로 선정되며, 동작하지 않는 경우 사용자가 임의로 고정할 수도 있음
- Scheduling Jobs을 현재 작업량에 따라 각 Indexer들에게 할당
- 일괄적인 App 배포와 Search Head Member들을 관리하기 위한 Deployer가 필요
- 최소 3개의 Search Head가 있어야 Cluster 구성 가능
Indexer Clustering
- 데이터 손실을 예방하기 위해 데이터를 복제 후 분산 저장
- 여러 Indexer들을 관리함으로써 가용성 향상 도모
Cluster Master(CM)
데이터를 저장하지 않고, Peer Indexer의 작업 조정하는 역할을 합니다.
Peer Indexer
Fowarder로부터 데이터를 수신받아 Bucket에 저장하며, Indexer끼리 Clustering을 이룹니다. Indexer Cluster 내 모든 Peer Indexer들은 모두 CM과 연결되어 있으며, 각 Peer Indexer들은 복제 포트를 통해 서로 통신하여 데이터를 복제합니다.
데이터 흐름도
이번 포스팅에서 다뤄볼 아키텍쳐는 Multi-Instance 분산 환경입니다. 컴퓨터 리소스가 한정된 관계로 분산환경에 이해를 돕기 위해 최소한의 인스턴스 수로 구성하였습니다.
데이터는 TA App을 통해 해당 인스턴스의 리소스 데이터를 수집합니다. Search Head는 Forwarder로 데이터를 보내고 Forwarder는 다시 Indexer로 해당 데이터를 보냅니다.
데이터를 전달받은 Indexer는 Bucket에 저장하며, Cluster Master를 매개로 연결된 Indexer Cluster에서 다른 Peer에게 정의된 Replication Factor만큼 자신의 Bucket을 복제합니다. 이때 각 Indexer는 복제 포트(8080)을 통해 서로 상호작용 하게 됩니다.
Deployer는 Search Head Clustering의 설정을 담당하며, 각 Search Head에 Job을 분배합니다. 최종적으로 사용자가 Search Head에서 SPL을 통해 모든 인스턴스의 데이터가 저장된 Indexer Cluster에 저장된 데이터를 조회할 수 있게 됩니다.
Splunk 분산환경 구축
분산환경 구축을 위해 Search Head(2), Indexer(3), Forwarder(1), Deployer(1), Cluster Master(1) 총 8대의 PC가 필요합니다.
인스턴스 구성
인스턴스 구성을 위해 Google Cloud Platform(GCP) VM을 이용해 8개 대의 PC를 구성 하겠습니다. 참고로 GCP는 한 리전에 최대 8개 VM 인스턴스까지 생성 가능합니다. 같은 리전에서 생성된 VM 인스턴스는 같은 대역폭의 내부 IP를 할당받기 때문에 별도의 네트워크 설정이 필요 없습니다.
그럼 먼저 공통적인 설치와 환경설정은 하나의 인스턴스에서 진행합니다. 이후 해당 인스턴스를 머신 이미지로 만들어 나머지 7개의 복제 인스턴스를 만든 후 분산환경을 설정하는 순으로 진행됩니다.
각 VM 인스턴스의 OS는 Ubuntu 18.04.5, 사양은 n1-standard-1 (vCPUs: 1, RAM: 3.75GB)로 통일 하겠습니다.
- n1-standard-1 (vCPUs: 1, RAM: 3.75GB) * 8 예상 청구 비용
참고로 n1-standart-1은 9개의 인스턴스를 약 26시간 사용했을 때 $14.30 가량 청구 금액이 예상됩니다. 하지만 GCP에서는 신규 가입자에게 1년 안에 사용이 가능한 $300 크레딧을 제공하고 있으니 추가로 비용을 지불할 일은 없으니 안심하고 사용해도 됩니다!
GCP는 추가 비용이 청구될 경우 미리 등록된 결제 수단으로 청구되는 결제 시스템으로 운영되고 있습니다. 따라서 GCP를 최초 활성화 할 때 비용이 청구될 카드를 먼저 등록하는 과정이 있으니 참고하시길 바랍니다. 이 글에서는 회원가입 과정은 생략하도록 하겠습니다.
1.GCP 계정 활성화
- GCP를 최초 활성화 한 후 프로젝트를 생성하면 다음과 같은 대시보드를 확인하실 수 있습니다.
2.VM 인스턴스 생성
-
좌측 상단의 햄버거 버튼에서 컴퓨팅 - Compute Engine - 가상머신 - VM 인스턴스 - 만들기에서 새로운 인스턴스를 생성합니다.
-
인스턴스 세부설정은 아래와 같이 설정합니다.
- 리전 : asia-northeast3(서울)
- 머신구성
- 시리즈 : N1
- 머신 유형 : n1-standard-1(vCPU 1개, 3.75GB 메모리)
- 부팅 디스크 : Ubuntu 18.04 LTS
- 방화벽 : HTTP(S) 트래픽 허용
- 약 1 - 2분 후 인스턴스 생성이 완료됩니다.
3.방화벽 규칙 설정
VM 인스턴스는 기본적으로 GCP VPC에 의해 네트워크가 완전 격리되어 있습니다. 분산환경 구축을 위해서는 여러 인스턴스가 서로 통신할 수 있어야 하므로 필요한 네트워크 대역과 포트를 허용 해주어야 합니다.
Splunk에서 사용하는 포트는 다음과 같습니다. 이 중에서 통신을 하는 데 사용되는 포트는 8089
, 9997
, 8080
입니다. 또한 Web에 접근하기 위해서는 8000
포트도 개방되어야 합니다.
- 방화벽 규칙 설정은 햄버거 버튼 - 네트워킹 - VPC 네트워크 - 방화벽 - 방화벽 규칙 만들기에서 아래와 같이 설정합니다.
- 대상 : 네트워크의 모든 인스턴스
- 소스 IP 범위 : 0.0.0.0/0
- 프로토콜 및 포트 : 지정된 프로토콜 및 포트
- tcp : 8089, 9997, 8080, 8000
4.Splunk 설치
이번 포스팅에서는 Splunk 제품 중에서도 Splunk Enterprise으로 진행합니다. Splunk가 유상 솔루션이긴 하지만 60일 체험판을 제공하고 있습니다. 단, 다운로드를 위해 Splunk 홈페이지 회원가입이 요구됩니다. 이는 이후에 Splunk App을 설치할 때에도 필요하니 가입해두시는 편이 좋습니다.
- VM 인스턴스에서 새로 생성한 인스턴스의 연결 - SSH를 통해 접속합니다.
- 원활한 설치를 위해 root 계정을 활성화 합니다.
$ sudo passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
$ su
Password:
root@splunk:/home/$USER
- 아래 명령어로 Splunk Enterprise를 다운로드 합니다.
- Release는 2021.01.24 기준
8.1.1
입니다.
- Release는 2021.01.24 기준
$
$ wget -O /opt/splunk.tgz https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.1.1&product=splunk&filename=splunk-8.1.1-08187535c166-Linux-x86_64.tgz&wget=true
종종 http, https 접근에 대한 방화벽 규칙을 허용 해도 VM 인스턴스에서
wget
이나curl
을 명령어로 위 주소에 대한 다운로드 파일을 받아오지 못하는 문제가 있습니다. 원인을 아시는 분은 댓글 남겨주시길 바랍니다.🙏
- 위 방법이 안 될 경우, 로컬에서 설치 파일을 받아
scp
명령어로 넘겨주는 방법으로 대체합니다.- 로컬에서 Splunk에서 로그인 후 Products - Splunk Enterprise - Free Trial - Linux에서 .tgz 설치 파일을 다운 받습니다.
- VM 인스턴스에서 다음 명령어로 ssh key pair를 생성합니다.
- 해당 과정은 root 계정으로 진행합니다.
- 생성한 keyfile01(Private Key)는 복사하여 로컬에 저장합니다.
# VM 인스턴스
$ ssh-keygen -t rsa -f ~/.ssh/keyfile01 -C root
$ chmod 400 ~/.ssh/keyfile01
$ cat ~/.ssh/keyfile01.pub >> authorized_keys
# 로컬 (~/.ssh 에 keyfile01(Private Key) 저장 후 진행)
$ scp splunk-8.1.1-08187535c166-Linux-x86_64.tar root@xxx.xxx.xxx.xxx:/opt
- 해당 압축 파일을 아래 명령어로 압축 해제 해줍니다.
$ cd /opt
$ tar -xvzf splunk-8.1.1-08187535c166-Linux-x86_64.tar
- Splunk 설치 파일은 압축이 해제된 폴더 내 splunk/bin 위치에 있습니다.
$ cd splunk/bin
$ ./splunk start --accept-license
This appears to be your first time running this version of Splunk.
Splunk software must create an administrator account during startup. Otherwise, you cannot log in.
Create credentials for the administrator account.
Characters do not appear on the screen when you type in credentials.
Please enter an administrator username: <admin>
Password must contain at least:
* 8 total printable ASCII character(s).
Please enter a new password: <Password>
Please confirm new password: <Password>
Waiting for web server at http://127.0.0.1:8000 to be available..... Done
마침내 Splunk 서버 설치를 완료했습니다. 이전에 방화벽 규칙 중에 Web Port에 해당하는 8000을 허용 해두었으므로, 이제 해당 VM 인스턴스의 외부 IP:8000
로 Splunk 서버에 접근할 수 있습니다.
5.데이터 수집 설정
Splunk 분산 환경이 제대로 동작하는지 확인하기 위해 테스트로 각 인스턴스의 리소스 데이터를 수집 해보겠습니다. Splunk에서 Linux 혹은 Unix 계열의 OS에서 리소스 데이터를 수집하는 방법은 Splunk App for Unix and Linux와 Splunk Add-on for Unix and Linux를 이용하는 것입니다.
- 앱 - 추가 앱 찾기 - nix 검색
- Splunk Add-on for Unix and Linux와 Splunk App for Unix and Linux를 설치합니다.
- 설치 시 splunk 홈페이지의 계정이 필요합니다.
- 모두 설치 후 나중에 다시 시작을 합니다.
- VM 인스턴스 CLI 환경에서 App의 수집 정보를 아래와 같이 설정합니다.
- Splunk 내 App들은
/splunk/etc/apps
내에 위치합니다. - 혹시 Vi 편집기가 낯선 분들은 Vi 사용법 완벽 가이드를 참고하세요.
- App의 default 디렉토리에는 기본 설정 관련 각종
.conf
파일이 위치합니다. - App의 local 디렉토리는 default와 동일하게
.conf
파일이 위치할 수 있으며, default 보다 우선 적용 대상에 속합니다. 그래서 일반적으로 default의.conf
파일은 그대로 유지하고, 수정이 필요한 부분은 local에 복사하여 수정합니다. .conf
파일은[]
스탠자를 기준으로 설정이 구분됩니다.- [default] 스탠자는
.conf
파일 내 공통적으로 적용할 설정값을 정의합니다.- 저장할 기본 index를
index = ubuntu
로 설정합니다.- 해당 인덱스가 없으면 수집하지 않습니다.
- 저장할 기본 index를
inputs.conf
에서는 기본적으로 모든 수집 옵션이 비활성화 되어 있으므로, 필요한 수집 옵션만 활성화합니다.- disabled = 1 -> 0
- [default] 스탠자는
- Splunk 내 App들은
$ mkdir /opt/splunk/etc/apps/Splunk_TA_nix/local
$ cp /opt/splunk/etc/apps/Splunk_TA_nix/defualt/inputs.conf /opt/splunk/etc/apps/Splunk_TA_nix/local/
$ vi /opt/splunk/etc/apps/Splunk_TA_nix/local/inputs.conf
- 수집할 데이터가 저장될 인덱스를 생성합니다.
- 설정 - 데이터 - 인덱스 - 새로 만들기인덱스에서 ubutu 인덱스 저장
- App 및 인덱스 설정 동기화를 위해 서버를 재시작 합니다.
- 설정 - 시스템 - 서버 컨트롤 - Splunk 다시 시작
- Search & Report App에서 아래 명령어로 데이터 수집 현황을 확인합니다.
여기까지 Host의 리소스 데이터를 수집하는 Standalone Splunk Server 설정이 완료 됐습니다.
6.VM 인스턴스 복제
GCP에서는 스냅샷 기능처럼 현재 상태를 이미지로 만드는 머신 이미지 기능을 제공합니다. 이제 공통적인 설정은 마무리 됐으니 이 VM 인스턴스의 상태를 머신 이미지로 만들고, 이를 이용해 나머지 7개의 VM 인스턴스를 생성 해보겠습니다.
- 해당 VM 인스턴스의 메뉴 - 새 머신 이미지에서 머신 이미지를 생성합니다.
- Compute Engine - 가상 머신 - VM 인스턴스 - 인스턴스 만들기 - 머신 이미지의 새 VM 인스턴스에서 새로 생성한 머신 이미지를 이용해 새 인스턴스를 생성합니다.
- NGD(
노가다) Method로 나머지 7개의 인스턴스를 생성합니다.
- NGD(
분산환경 설정
Splunk 분산환경 구축을 위해 각 인스턴스에 임의로 Splunk 서버를 다음과 같이 지정하겠습니다.
Splunk 서버 | VM 인스턴스 | 역할 |
---|---|---|
Cluster Master(CM) | splunk0 | Indexer Cluster에서 Peer Indexer 관리 |
Indexer | splunk1/splunk2/splunk3 | 데이터를 Forwarder에서 전달받아 저장하고, Search Head로부터 SPL로 데이터 조회 요청을 처리 |
Forwarder | splunk4 | 데이터 수집 후 Indexer에게 전달 |
Deployer | splunk5 | Search Head에 대한 설정과 App 정보를 일괄 배포 및 관리 |
Search Head | splunk6/splunk7 | SPL문을 통해 Indexer에 데이터 조회 요청 |
먼저 8개 서버 모두 일괄적으로 Splunk Server가 부팅 시 자동시작 되도록 설정하겠습니다. 참고로 Mac은 Iterm2나 Windows는 MobaXterm과 같은 툴을 이용하시면 멀티 세션관리하는 데 수월합니다. 이번 글에서는 Mac의 Iterm2를 기준으로 설명하겠습니다.
Iterm2에서 Command + d
는 Split 세션을 생성합니다. 이때 Option + Command + i
키를 누르면 다중 입력을 활성화합니다. 이점 참고하여 멀티 세션에서 동일한 작업을 해야할 때 요긴하게 사용하시길 바랍니다 :)
# Local
$ ssh -i ~/.ssh/keyfile01 root@<VM 인스턴스 외부IP>
# 각 VM 인스턴스
$ /opt/splunk/bin/./splunk stop
$ /opt/splunk/bin/./splunk start --accept-license
$ /opt/splunk/bin/./splunk enable boot-start
또한 각 서버의 역할을 명시하기 위해 다음과 같이 Splunk 서버의 별칭을 정의합니다.
- 설정 - 시스템 - 서버 설정 - 일반 설정에서 Splunk 서버 이름 및 기본 호스트 이름을 각 Splunk 서버 역할에 맞게 수정
- VM 인스턴스에서 아래 명령어로 모든 Splunk Server Restart
$ /opt/splunk/bin/./splunk restart
1.Search Head -> Forwarder
먼저 Search Head에서 수집중인 리소스 데이터를 Forwarder에 전달 하겠습니다. 여기서 반드시 아셔야 할 것은 원래 Search Head는 원래 오롯이 Indexer의 데이터를 조회하는 역할이지만 이번 글에서는 적은 수의 VM 인스턴스로 분산환경을 구축 하다보니 Universal Forwarder의 역할도 수행하는 것입니다.
- Forwarder에서는 설정 - 데이터 - 전달 및 수신 - 데이터 수신 - 수신 설정 - 새 수신 포트에서 9997 수신포트 추가
- 각 Search Head에서 설정 - 데이터 - 전달 및 수신 - 데이터 전달 - 전달 설정 - 새 전달 호스트를 통해 Forwarder를 추가
- IP는 해당 VM 인스턴스(Forwarder:splunk4)의 내부 IP 사용
- Port는 수신 포트 9997
- Forwarder에서 Search & Reporting 앱을 통해 리소스 데이터를 수집중인
Ubuntu
라는 Index를 조회하여 수집 현황 확인- Forwarder, Search Head 1, 2 데이터 모두 조회 가능
2.Forwarder -> Indexer
Forwarder는 수집한 데이터를 각 Indexer에 전달하고, Indexer는 전달받은 데이터를 Bucket에 저장합니다. 이전 방법과 동일하지만 이번에는 Forwarder가 각 Indexer에 데이터를 전달하고, 각 Indexer는 수신합니다.
- 각 Indexer에서 설정 - 데이터 - 전달 및 수신 - 데이터 수신 - 수신 설정 - 새 수신 포트에서 9997 수신포트 추가
- Forwarder에서 설정 - 데이터 - 전달 및 수신 - 데이터 전달 - 전달 설정 - 새 전달 호스트를 통해 각 Indexer 추가
- IP는 해당 VM 인스턴스(Indexer:splunk1~3)의 내부 IP 사용
- Port는 수신 포트 9997
3. Cluster Master <-> Indexers
데이터 저장 안정성과 검색 효율성을 위한 인덱서 클러스터링을 활성화하기 위하여 Cluster Master 즉, 마스터 노드로 활성화 합니다. 각 Indexer들은 CM의 피어 노드로 활성화 합니다.
- Cluster Master에서 설정 - 분산 환경 - 인덱서 클러스터링 - 인덱서 클러스터링 활성화 - 마스터 노드 선택
- 보안키 설정 후 마스터 노드 활성화 후 재시작
- 각 Indexer에서 설정 - 분산 환경 인덱서 클러스터링 - 인덱서 클러스터링 활성화 - 피어 노드 선택
- 마스터 URI : Cluster Master의 내부 IP
- 피어 복제 포트 : 8080
- 보안키 : 마스터 노드 활성화 시 설정한 보안키
- 클러스터 레이블 : cm
- 피어노드 활성화 후 재시작
- 각 Search Head에서 설정 - 분산 환경 인덱서 클러스터링 - 인덱서 클러스터링 활성화 - 검색 헤드 노드 선택
- 마스터 URI : Cluster Master의 내부 IP
- 보안키 : 마스터 노드 활성화 시 설정한 보안키
- 검색 헤드 노드 활성화 후 재시작
작성중입니다 . . . 🚧
댓글 남기기