개요
회사의 빅데이터 장비 시스템( Linux+GPU+Docker ) 서버의 metric data를 쌓고 관리하기 위해 모니터링 툴을 도입하는 과제를 부여받았다! 서버 내에 ES 에 클러스터 5개가 docker와 NVIDIA GPU를 사용하여 운영되고 있었고, ELK Stack(ES + Kibana + Logstash)를 이용해 Filebeat가 이미 운용되고 있는 환경이었다.
모니터링 기술 선택 고민
모니터링 기술로 크게 두 가지 스택을 논의하였다.
1. Grafana + Prometeus
2. MetricBeat(ELK) ✅
두 스택을 비교하자면 프로메테우스+Grafana는 Metric data(서버의 상태를 측정한 항목이나 지표) 모니터링 및 시각화에, ELK 스택은 로그 데이터의 수집, 분석 및 시각화에 조금 더 중점을 두고 있다. 하지만 우리 회사의 경우 이미 ELK를 사용하고 있어 여기에 Metricbeat를 추가하는 것이 더 운영하기 쉬울 것 같아 ELK를 사용하기로 하였다!
간단한 시스템 구성도
보안상의 이슈가 큰 회사이므로 조심해서 기술적인 것들만 풀어 써볼 예정이다.
시스템 구성도는 간단하게 아래와 같다.
ELK란?
간단히 설명해보자면, 데이터를 수집하고 저장하고 처리하는 툴이다.
프로그램 실행 과정에서 나오게 되는 로그나, 서버를 사용하면서 GPU가 어디에 얼마만큼 사용되는지를 데이터로 추출해 보기 쉽게 확인할 수 있도록 도와준다.
ELK → ElasticSearch +Logstash + Kibana
ELK Stack → +Beats (FileBeat, PacketBeat, MetricBeat)
- Elastic Search
- 데이터 저장, 검색엔진 (분산환경을 지원한다.)
- Scale Out 가능!
- Indexing 형태로 데이터를 적재하도록 구현되어 있다 (여기에서 indexing은 DB에서 사용하는 개념이 아니라 ES->cluster->index->shard->key-value의 개념!)
- 도커 기반의 환경이므로 엘라스틱서치를 설치할 환경에 도커를 설치한 후 다운로드한 도커 이미지를 복사하여 사용하면 된다
- HTTP Restful API를 사용하며 데이터 또한 JSON 형태로 저장한다
- 검색엔진으로 많이 사용하는데, 쇼핑몰이나 SNS에서 검색을 빠르게 하고 싶을 때 기본 DB(RDS)가 아닌 이 ES를 사용하는 경우가 많은 것 같다. (여러 활용 사례들을 파악하자!)
- Logstash
- 데이터 수집
- 간단하면서도 다양한 조회, 변환, 등록 설정을 제공
- ex) “INFO”로 제공되는 로그를 ‘info’로 소문자 변환하고 싶다면 가능
- 구성
- Input Plugin
- Filter Plugin(데이터 정제 및 필터)—가공
- Output Plugin(데이터 저장할 곳. Elastic Search로 결과를 전송할 것이다.)
- Beats
- 데이터 전송 역할을 하는 플랫폼
- Logstash와 다르게 경량 플랫폼이므로 각 역할에 해당하는 단순한 전송 기능만을 수행한다. PacketBeat, FileBeat(주로 로그 데이터), MetricBeat(주로 모니터링 데이터)
- Kibana
- ES의 시각화 담당
- Map, Dashboard, Monitoring …
- 시계열(@timestamp 를 사용해 시간별 데이터) 데이터를 보는 것에 유리하다. 추가로 시간별+ 카테고리(도커 이미지 별)별로 자료를 볼 수도 있어서 아주 굿!
서버 환경에서의 구현
위에서 설명한 것과 같이 우리회사에는 이미 Elastic, Kibana, Logstash, Filebeat 로 로그데이터를 받아오고 있었고, 나는 Metricbeat만 추가한 환경임을 주의하자!
1. metricbeat 다운로드 (이 때 버전도 잘 고려해 다운받자. ES version 에 맞추어 확인 후 다운받는 것이 중요하다.)
wget <https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.12.1-linux-x86_64.tar.gz>
2. 압축 풀기
tar xzvf metricbeat-7.12.1-linux-x86_64.tar.gz
3. 다운받은 것에 있는 metricbeat.yml 파일 편집 (metric 파일의 경우 sudo 명령어를 사용해야 편집 권한을 얻을 수 있다.)
sudo chown root:root /{metricbeat 다운받은 경로}/modules.d/system.yml
sudo nano /etc/metricbeat/metricbeat.yml # sudo 명령어로 편집권한 얻기)
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
reload.period: 10s
setup.template.settings:
index.number_of_shards: 1
index.codec: best_compression
setup.template.name: "metric-hello-test"
setup.template.pattern: "metric-hello-test-*"
setup.template.overwrite: false
setup.template.enabled: false
setup.ilm.enabled: auto
setup.ilm.policy_name: "my_policy"
setup.kibana:
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
#
output.elasticsearch:
hosts: ["https://[kibana ip주소]:9200"]
protocol: "https"
username: "elastic"
password: "비밀번호"
index: "metric-hello-test-{+YYYY.MM.dd}"
ssl.verification_mode: none
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
fields: {local: "IDC", zone: "Security", device: "server", product: "Linux"}
4. metricbeat 시작
sudo chown root metricbeat.yml
sudo ./metricbeat -e
5. 다음과 같이 metricbeat가 데이터를 전송해주면 성공이다 !
root@******:/home/*****/metricbeat-7.12.1-linux-x86_64# sudo ./metricbeat -e
{"log.level":"info","@timestamp":"2023-08-31T17:11:27.180+0900","log.origin":***
{"log.level":"info","@timestamp":"2023-08-31T17:11:27.182+0900","log.origin":***
{"log.level":"info","@timestamp":"2023-08-31T17:11:27.208+0900","log.logger":***
6. 인덱스 패턴 생성
kibana에서 인덱스를 사용하기 위해서는 먼저 인덱스 패턴을 생성해야 한다. 우리가 위에서 지정한 인덱스패턴은 hellometrics이니 이에 알맞는 인덱스 패턴을 생성할 수 있다.
1. Kibana에서 Management 메뉴 클릭
2. Index Patterns 메뉴 클릭
3. [Create index pattern] 버튼 클릭
4. Index pattern에 Kibana에서 확인하기 위한 인덱스 패턴 입력 - 나의 경우 hello* 로 입력했다.
5. [Next step] 버튼 클릭
6. Configure Settings 내용을 확인한 후 [Create index pattern] 버튼 클릭
7. Index Pattern 생성 완료!
8. kibana Discover 메뉴에서 해당 인덱스를 검색하면 클러스터에 저장되는 data가 잘 도출됨을 확인할 수 있다.
트러블 슈팅
2023-09-01T14:13:06.878+0900 ERROR instance/beat.go:971 Exiting: resource 'metricbeat-7.12.1' exists, but it is not an alias
아래 4번을 실행한 후에 로그를 확인해보니 "INFO" 가 아닌 "ERROR" 가 뜨며 제대로 실행되지 않는 현상이 발생했다 🧐
해당 오류는 레퍼런스에서 참고해 해결할 수 있다.
1. alias 확인
https://{IP URL}:9200/_alias?pretty를 확인해보면 alias 목록을 확인해볼 수 있다.
"metricbeat-2023.07.03-000001" : {
"aliases" : {
"metricbeat" : {
"is_write_index" : true
}
}
},
"metricbeat-7.12.1" : {
"aliases" : { }
},
나는 위에 있는 metricbeat-2023.07.03-000001 alias를 아래의 것으로 옮기고 싶다.
우리는 해당 PUT, DELETE 요청을 elastic > Dev Tools 에서 간편하게 수행할 수 있다.
2. 기존에 있던 metricbeat를 삭제하고 다시 alias를 할당하여 index을 추가한다.
DELETE metricbeat-7.12.1
PUT metricbeat-7.12.1-2023.09.01-000001
{
"aliases": {
"metricbeat-7.12.1": {
"is_write_index": true
}
}
}
3. 로그에 이제 잘 뜨게 된다 !
2023-09-01T16:04:36.135+0900 INFO cfgfile/reload.go:224 Loading of config files completed.
'BackEnd > DEVOPS' 카테고리의 다른 글
[CD|Cloud RUN] Google Cloud Run으로 지속적 배포 구현하기 (2) | 2024.01.03 |
---|---|
[Serverless|Cloud RUN] Google Cloud Run으로 JAVA WAR 파일 배포하기 (2) | 2024.01.02 |
[Kafka] Kafka 이론 및 실습(Window10 Local 환경) (0) | 2023.08.11 |
[DEVOPOS | AWS | SPRING] application.yml 파일 환경변수 외부주입 - aws env 파일/intellij configuration (1) | 2023.06.09 |
[DevOps] Docker+Docker_compose+Github_Actions (5) | 2023.03.24 |