Docker Swarm Monitoring Stack

All-in-one monitoring stack for unified application and hardware observability

Jul 2022

Docker Swarm Monitoring Stack

TL;DR

  • Docker Swarm μœ„μ—μ„œ λ™μž‘ν•˜λŠ” μ˜¬μΈμ› λͺ¨λ‹ˆν„°λ§ μŠ€νƒμž…λ‹ˆλ‹€.
  • ELK Stack을 μ‚¬μš©ν•˜μ—¬ 둜그λ₯Ό μˆ˜μ§‘Β·μ •μ œΒ·μ €μž₯Β·μ‹œκ°ν™”ν•˜κ³  Prometheus와 Grafanaλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜λ“œμ›¨μ–΄Β·μ»¨ν…Œμ΄λ„ˆ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘Β·μ‹œκ°ν™”ν•©λ‹ˆλ‹€.
  • Kubernetes λ„μž…μ΄ μ–΄λ €μš΄ ν™˜κ²½μ—μ„œ Docker ν™˜κ²½κ³Ό ν†΅ν•©λœ Self-hosting λͺ¨λ‹ˆν„°λ§ μŠ€νƒμ„ ꡬ좕할 수 μžˆλ„λ‘ μ„€κ³„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • 사내 μ‹œμŠ€ν…œ ꡬ좕 κ²½ν—˜μ„ λ°”νƒ•μœΌλ‘œ μ˜€ν”ˆ μ†ŒμŠ€ μŠ€νƒμ„ λΉŒλ“œν•˜μ—¬ κ³΅κ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€.


기획

λ°°κ²½

이 ν”„λ‘œμ νŠΈλŠ” μ œκ°€ μ‚¬λ‚΄μ—μ„œ λ‹΄λ‹Ήν•˜λ˜ μ„œλ‘œ λ‹€λ₯Έ 성격을 κ°€μ§„ 두 μ„œλΉ„μŠ€μ˜ 톡합 λͺ¨λ‹ˆν„°λ§μ„ μœ„ν•˜μ—¬ κ°œλ°œν•œ Observability μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

첫 번째 μ„œλΉ„μŠ€λŠ” μ›”κ°„ 20만 건 μ΄μƒμ˜ νŠΈλžœμž­μ…˜ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μ„œλΉ„μŠ€λ‘œ, 처리 κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ μ²˜λ¦¬κ°€ 쀑단될 경우 큰 λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” ν¬λ¦¬ν‹°μ»¬ν•œ 데이터듀을 μ²˜λ¦¬ν•˜λ―€λ‘œ μ•ˆμ •μ μΈ μš΄μ˜μ„ μœ„ν•˜μ—¬ 데이터 νŒŒμ΄ν”„λΌμΈμ˜ 건전성을 ν™•μΈν•˜κ³  데이터 이상이 μ—†λŠ”μ§€ 확인할 수 μžˆλŠ” 체계가 ν•„μš”ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

두 번째 μ„œλΉ„μŠ€λŠ” 일간 100만 건 μ΄μƒμ˜ 쑰회 νŠΈλž˜ν”½μ΄ λ°œμƒν•˜λŠ” κ³ λΆ€ν•˜ μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. 그렇기에 μ„œλΉ„μŠ€μ˜ μ•ˆμ •μ„±μ„ λͺ¨λ‹ˆν„°λ§ν•  ν•„μš”μ„±μ΄ μ‘΄μž¬ν•˜μ˜€κ³ , λ™μ‹œμ— νŠΈλž˜ν”½μ„ λΆ„μ„ν•˜μ—¬ 도메인 κ΄€μ μ˜ 데이터듀을 뽑아내고 이λ₯Ό ν†΅ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ μΈμ‚¬μ΄νŠΈλ₯Ό μ–»λŠ” 것에 λŒ€ν•œ μˆ˜μš”κ°€ μ‘΄μž¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같은 μˆ˜μš”λ₯Ό λ§Œμ‘±ν•˜κΈ° μœ„ν•˜μ—¬ μ„œλ²„μ™€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜κ³  도메인적 데이터λ₯Ό μˆ˜μ§‘ν•  수 μžˆλŠ” 톡합 Observability μ‹œμŠ€ν…œμ΄ ν•„μš”ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ ν•˜κΈ° λͺ©ν‘œ λ¬Έλ‹¨μ—μ„œ μ„€λͺ…ν•˜λ“― μ‹œμ€‘μ—λŠ” 제 μš”κ΅¬ 사항듀을 λͺ¨λ‘ λ§Œμ‘±μ‹œν‚€λ©΄μ„œ κ°„νŽΈν•˜κ²Œ μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μžˆλŠ” 도ꡬ가 μ‘΄μž¬ν•˜μ§€ μ•Šμ•˜κ³ , 사내 μ‹œμŠ€ν…œμ„ μ„±κ³΅μ μœΌλ‘œ κ΅¬μΆ•ν•œ κ²½ν—˜μ„ ν† λŒ€λ‘œ 직접 μ˜€ν”ˆ μ†ŒμŠ€ μŠ€νƒμ„ κ΅¬μΆ•ν•˜μ—¬ κ³΅κ°œν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ©ν‘œ

1. λ„κ΅¬μ˜ νŒŒνŽΈν™” ν•΄κ²°

μ‹œμ€‘μ—λŠ” ν›Œλ₯­ν•œ μ˜€ν”ˆ μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ 도ꡬ듀이 λ§Žμ•˜μ§€λ§Œ κ·Έ 도ꡬ듀을 κ°„νŽΈν•˜κ²Œ ν†΅ν•©ν•˜κ³  μΌκ΄„μ μœΌλ‘œ 관리할 수 μžˆλŠ” λ„κ΅¬λŠ” λ“œλ¬Όμ—ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, 각각의 도ꡬ듀을 Self-hosting 및 μ—°κ²°ν•˜μ—¬ κΈ°μ‘΄ 인프라에 ν†΅ν•©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§Žμ€ 인프라적 λ…Έν•˜μš°μ™€ μž‘μ—…λŸ‰μ„ μš”κ΅¬ν•˜μ˜€κΈ°μ— μ „λ¬Έ 지식 μ—†μ΄λŠ” λ„μž…μ΄ μ–΄λ €μ› μŠ΅λ‹ˆλ‹€.

2. μ»¨ν…Œμ΄λ„ˆ ν™˜κ²½κ³Ό μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ λŒ€μ‘

도ꡬ듀을 κ°„νŽΈν•˜κ²Œ μ„€μΉ˜ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ Docker μ»¨ν…Œμ΄λ„ˆ ν™˜κ²½ μœ„μ— κ΅¬μΆ•ν•˜κΈ°λ‘œ κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ‹œμŠ€ν…œ μ•ˆμ •μ„±κ³Ό μˆ˜ν‰ ν™•μž₯의 νŽΈλ¦¬μ„±μ„ μœ„ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ κΈ°μˆ μ„ μΆ”κ°€λ‘œ λ„μž…ν•˜λ €κ³  ν•˜μ˜€μœΌλ‚˜, 사내 인프라 사정상 Kubernetesλ₯Ό λ„μž…ν•˜κΈ° μ–΄λ €μš΄ ν™˜κ²½μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 그렇기에 κΈ°λ³Έ Docker ν™˜κ²½κ³Ό μ‰½κ²Œ ν†΅ν•©λ˜λŠ” λ™μ‹œμ— μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜μ΄ κ°€λŠ₯ν•œ λŒ€μ•ˆμ΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

3. 둜그 데이터 처리 λŒ€μ‘

μ‹œμŠ€ν…œμ€ κΈ°μ‘΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΉ λ₯΄κ²Œ ν†΅ν•©ν•˜λŠ” ν•œνŽΈ λ‹€μ–‘ν•œ 도메인 데이터λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν–ˆλŠ”λ°, 이λ₯Ό μœ„ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 둜그λ₯Ό 뢄석할 수 μžˆλŠ” μ‹œμŠ€ν…œμ΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

λΆ„λ‹Ή λͺ‡ GBμ”© μŒ“μ΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그λ₯Ό λΆ„μ„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€λŸ‰μ˜ 둜그 νŠΈλž˜ν”½μ„ μ•ˆμ •μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆμ–΄μ•Ό ν•˜κ³ , 둜그λ₯Ό μ˜¬λ°”λ₯Έ ν˜•νƒœμ˜ λ°μ΄ν„°λ‘œ μ •μ œν•  수 μžˆμ–΄μ•Ό ν•˜λ©°, 데이터λ₯Ό λΉ λ₯΄κ³  효율적으둜 μ μž¬ν•˜κ³  μ‘°νšŒν•  수 μžˆμ–΄μ•Ό ν•˜κ³ , μ‹œκ°ν™”κ°€ 쉽고 κ°„νŽΈν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.


개발

기술 μŠ€νƒ

Application Tech Stack

1. Docker Swarm

Docker Swarm은 이 λͺ¨λ‹ˆν„°λ§ μŠ€νƒ 전체λ₯Ό κ΅¬λ™ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ λ ˆμ΄μ–΄μž…λ‹ˆλ‹€.

μœ„μ—μ„œ μ–ΈκΈ‰ν•˜μ˜€λ“― 사내 인프라 사정상 Kubernetes λ„μž…μ΄ μ–΄λ €μš΄ ν™˜κ²½μ΄μ—ˆκΈ° λ•Œλ¬Έμ—, κΈ°μ‘΄ Docker ν™˜κ²½κ³Ό μ‰½κ²Œ ν†΅ν•©λ˜λ©΄μ„œ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜μ΄ κ°€λŠ₯ν•œ λŒ€μ•ˆμ΄ ν•„μš”ν•˜μ˜€μŠ΅λ‹ˆλ‹€. Docker 엔진에 ν¬ν•¨λœ Docker Swarm은 ν•™μŠ΅ 뢀담이 μƒλŒ€μ μœΌλ‘œ μ μ—ˆκ³ , 자체적인 μˆ˜ν‰ ν™•μž₯κ³Ό μ„œλΉ„μŠ€ 배치 μ œμ–΄ κΈ°λŠ₯λ§ŒμœΌλ‘œλ„ λͺ©ν‘œν•œ 운영 μ•ˆμ •μ„±μ„ λ§Œμ‘±μ‹œν‚¬ 수 μžˆμ–΄ 이λ₯Ό μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2. ELK Stack

ELK Stack(Elasticsearch, Logstash, Kibana, Filebeat)은 둜그 λ°μ΄ν„°μ˜ μˆ˜μ§‘Β·μ •μ œΒ·μ €μž₯Β·μ‘°νšŒΒ·μ‹œκ°ν™”κΉŒμ§€ μ΄μ–΄μ§€λŠ” νŒŒμ΄ν”„λΌμΈμ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

μƒμˆ ν•˜μ˜€λ“― κ°„νŽΈν•œ ꡬ좕, λŒ€μš©λŸ‰ 둜그 νŠΈλž˜ν”½ 처리, 둜그의 μ •ν˜•ν™”Β·μ •μ œ, λΉ λ₯Έ 적재·쑰회, μ‰¬μš΄ μ‹œκ°ν™”λ₯Ό λͺ¨λ‘ λ§Œμ‘±ν•  수 μžˆλŠ” κ²€μ¦λœ 쑰합이 ν•„μš”ν•˜μ˜€κ³ , μ˜€ν”ˆ μ†ŒμŠ€ 기반 Self-hostingκ³Ό 자유둜운 μ»€μŠ€ν„°λ§ˆμ΄μ§•μ΄ κ°€λŠ₯ν•˜λ©° λ‹€λ₯Έ μŠ€νƒκ³Όμ˜ 연동을 직접 μ§€μ›ν•˜λŠ” ELK Stack을 μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2.1. Nginx

NginxλŠ” Elasticsearch의 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. Swarm λ‚΄μ—μ„œ ElasticsearchλŠ” λ…Έλ“œλ³„λ‘œ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€κ°€ ν΄λŸ¬μŠ€ν„°λ§λœ ν˜•νƒœλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— Swarm μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” 단일 μ§„μž…μ μ΄ ν•„μš”ν•©λ‹ˆλ‹€. λ˜ν•œ, μ™ΈλΆ€ μ§„μž…μ μ— λŒ€ν•œ μ ‘κ·Ό μ œμ–΄μ™€ λ³΄μ•ˆ 정책을 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. Nginxλ₯Ό λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ‘œ μ„€μ •ν•¨μœΌλ‘œμ¨ 두 쑰건을 λͺ¨λ‘ λ§Œμ‘±μ‹œν‚¬ 수 μžˆμ–΄ Nginxλ₯Ό μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2.2. Elastic Agent / Fleet

Elastic AgentλŠ” Beats μ œν’ˆκ΅°μ„ ν†΅ν•©ν•œ 단일 μ—μ΄μ „νŠΈλ‘œ, λŒ€μƒ μ„œλ²„μ— μ„€μΉ˜λ˜μ–΄ λ©”νŠΈλ¦­(APM, 둜그, ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­)을 톡합 μˆ˜μ§‘ν•©λ‹ˆλ‹€. 쀑앙 μ •μ±… μ„œλ²„μΈ Fleetκ³Ό μ—°λ™λ˜μ–΄, μ„œλ²„λ³„ μˆ˜μ§‘ 정책을 일일이 μˆ˜μ •ν•  ν•„μš” 없이 Kibanaλ₯Ό 톡해 μ›κ²©μœΌλ‘œ 톡합 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ ELK Stack μƒνƒœκ³„λŠ” Beats μ œν’ˆκ΅°μ„ λ„˜μ–΄ Elastic Agent + Fleet μ•„ν‚€ν…μ²˜λ₯Ό μ°¨μ„ΈλŒ€ ν‘œμ€€μœΌλ‘œ μ±„νƒν•˜λŠ” 좔세이며, 이에 λ°œλ§žμΆ”μ–΄ λ³Έ ν”„λ‘œμ νŠΈμ—μ„œλ„ μ΅œμ‹  μ•„ν‚€ν…μ²˜ 지원을 μΆ”κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2.3. ElastAlert

ElastAlertλŠ” Elasticsearch 인덱슀λ₯Ό 주기적으둜 μ‘°νšŒν•˜μ—¬ κ·œμΉ™(λΉˆλ„, νŒ¨ν„΄ λ“±)에 μΌμΉ˜ν•˜λŠ” 데이터가 μžˆλŠ”μ§€ κ²€μ‚¬ν•˜κ³ , 쑰건이 좩쑱되면 μ—°κ²°λœ μ™ΈλΆ€ μ±„λ„λ‘œ μ•Œλ¦Όμ„ λ°œμ†‘ν•©λ‹ˆλ‹€. 데이터 기반의 μ‹€μ‹œκ°„ μ•Œλ¦Όμ„ κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Elasticsearch에도 자체 μ•Œλ¦Ό κΈ°λŠ₯이 μ‘΄μž¬ν•˜λ‚˜, 유료 μ„œλΉ„μŠ€λ₯Ό κ΅¬λ…ν•΄μ•Όλ§Œ μ΄μš©ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ•Œλ¦Ό κΈ°λŠ₯의 μ˜€ν”ˆ μ†ŒμŠ€ λŒ€μ•ˆμœΌλ‘œμ„œ ElastAlertλ₯Ό ν†΅ν•©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

3. Kafka & Zookeeper

KafkaλŠ” Filebeat와 Logstash μ‚¬μ΄μ—μ„œ λ©”μ‹œμ§€ λ²„νΌμ΄μž 이벀트 νŒŒμ΄ν”„λΌμΈ 역할을 ν•©λ‹ˆλ‹€. 둜그λ₯Ό ν† ν”½ λ‹¨μœ„λ‘œ λ°›μ•„ λ‘μ—ˆλ‹€κ°€ Logstashκ°€ μ†ŒλΉ„ν•˜λ„λ‘ ν•˜μ—¬ μˆ˜μ§‘λΆ€μ™€ μ μž¬λΆ€λ₯Ό λΆ„λ¦¬ν•˜κ³ , νŠΈλž˜ν”½μ΄ 급증해도 νŒŒμ΄ν”„λΌμΈμ΄ λŠκΈ°μ§€ μ•Šλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ZookeeperλŠ” λΆ„μ‚° μ½”λ””λ„€μ΄μ…˜ μ„œλΉ„μŠ€λ‘œ, ν΄λŸ¬μŠ€ν„°λ§λœ Kafka λΈŒλ‘œμ»€λ“€μ˜ μƒνƒœλ₯Ό ν™•μΈν•˜μ—¬ μž₯μ•  λ°œμƒ μ‹œ Failoverλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

λ‹€λŸ‰μ˜ 둜그 데이터λ₯Ό 버퍼 없이 Logstash둜 μ „μ†‘ν•˜μž μ„œλ²„ λΆ€ν•˜κ°€ 심해져, 쀑간에 버퍼 역할을 ν•  데이터 νŒŒμ΄ν”„λΌμΈμ΄ ν•„μš”ν•˜μ˜€κ³  ν•΄κ²°μ±…μœΌλ‘œ Kafkaλ₯Ό λ„μž…ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ꡬ체적인 λ°°κ²½κ³Ό ν•΄κ²° 과정은 μ•„λž˜ νŠΈλŸ¬λΈ”μŠˆνŒ… μ„Ήμ…˜μ—μ„œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

4. Prometheus & Grafana

PrometheusλŠ” Docker Swarm λ…Έλ“œ μ„œλ²„λ“€μ— μ„€μΉ˜ν•œ Node Exporter, cAdvisorλ₯Ό 톡해 ν•˜λ“œμ›¨μ–΄ 및 μ»¨ν…Œμ΄λ„ˆ μ‹œμŠ€ν…œ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜μ—¬ μ €μž₯ν•˜κ³ , GrafanaλŠ” μ €μž₯된 λ©”νŠΈλ¦­μ„ μ‘°νšŒν•˜μ—¬ μ„œλ²„μ™€ μ»¨ν…Œμ΄λ„ˆμ˜ λ¦¬μ†ŒμŠ€ ν˜„ν™©μ„ μ‹œκ°ν™”ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€.

μƒμˆ ν•˜μ˜€λ“― μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œκ·Έμ™€ μ„œλ²„ ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­μ„ λ‘˜ λ‹€ λͺ¨λ‹ˆν„°λ§ν•  ν•„μš”κ°€ μžˆμ—ˆμœΌλ‚˜, 주둜 λ¬Έμ„œ λ‹¨μœ„ 인덱싱을 ν†΅ν•œ 도메인적 λ§₯락 뢄석에 νŠΉν™”λœ ELK Stackμ—μ„œ μ‹œκ³„μ—΄ 기반의 ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­μ„ 같이 μ²˜λ¦¬ν•˜λŠ” 경우 λ¦¬μ†ŒμŠ€λ₯Ό λΉ„νš¨μœ¨μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•˜μ—¬ λ©”νŠΈλ¦­ 집계에 μ΅œμ ν™”λœ κ²½λŸ‰ν™” μŠ€νƒμ΄ ν•„μš”ν•˜μ˜€κ³ , 결둠적으둜 Prometheus와 Grafanaλ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ꡬ체적인 λ°°κ²½κ³Ό ν•΄κ²° 과정은 μ•„λž˜ νŠΈλŸ¬λΈ”μŠˆνŒ… μ„Ήμ…˜μ—μ„œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

4.1. Node Exporter & cAdvisor

Node ExporterλŠ” 각 Swarm λ…Έλ“œ λ‹¨μœ„μ˜ μ‹œμŠ€ν…œ λ©”νŠΈλ¦­(CPU, λ©”λͺ¨λ¦¬, λ„€νŠΈμ›Œν¬ μ‚¬μš©λŸ‰ λ“±)을 μˆ˜μ§‘ν•˜μ—¬ Prometheus둜 μ „μ†‘ν•©λ‹ˆλ‹€. Prometheus μƒνƒœκ³„μ˜ 곡식 Exporter이기에 μ—°λ™μ˜ νŽΈλ¦¬μ„±μ„ κ³ λ €ν•˜μ—¬ μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

cAdvisorλŠ” 각 λ…Έλ“œμ—μ„œ λ™μž‘ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ λ‹¨μœ„μ˜ μ‹œμŠ€ν…œ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜μ—¬ Prometheus둜 μ „μ†‘ν•©λ‹ˆλ‹€. Node Exporterκ°€ μ„œλ²„ μ „μ²΄μ˜ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” λ™μ‹œμ— cAdvisorκ°€ μ„œλΉ„μŠ€(μ»¨ν…Œμ΄λ„ˆ)별 λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜μ—¬ μ„œλ²„ λ‹¨μœ„μ˜ μŠ€μΌ€μΌλ§ νŒλ‹¨κ³Ό μ»¨ν…Œμ΄λ„ˆ λ‹¨μœ„μ˜ λ¦¬μ†ŒμŠ€ μ‚¬μš© 좔적 λͺ¨λ‘λ₯Ό ν•  수 μžˆλ„λ‘ μ„€κ³„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


μ•„ν‚€ν…μ²˜

Application Architecture Diagram

μ•„ν‚€ν…μ²˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„, 데이터 버퍼 μ„œλ²„, 둜그 λͺ¨λ‹ˆν„° μ„œλ²„, λ…Έλ“œ λͺ¨λ‹ˆν„° μ„œλ²„λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„

λͺ¨λ‹ˆν„°λ§μ˜ λŒ€μƒμ΄ λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μΈμŠ€ν„΄μŠ€κ°€ λ™μž‘ν•˜λŠ” μ„œλ²„μž…λ‹ˆλ‹€. 각 μ„œλ²„μ—λŠ” Filebeat와 Elastic Agentκ°€ μ„€μΉ˜λ©λ‹ˆλ‹€.

FilebeatλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μƒμ„±ν•˜λŠ” 둜그 νŒŒμΌμ„ 읽고, 메타 데이터λ₯Ό μΆ”κ°€ν•˜μ—¬ Kafka의 μ§€μ •λœ Topic으둜 μ „μ†‘ν•©λ‹ˆλ‹€. μ΄λ•Œ, FilebeatλŠ” Kafka의 λΆ€ν•˜ 상황을 보고 둜그 νŒŒμΌμ„ μ½λŠ” 속도λ₯Ό μ‘°μ ˆν•˜μ—¬ λ„€νŠΈμ›Œν¬ κ³ΌλΆ€ν•˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

Elastic AgentλŠ” Filebeatλ₯Ό λΉ„λ‘―ν•œ Beats μ‹œλ¦¬μ¦ˆλ₯Ό ν†΅ν•©ν•œ μ°¨μ„ΈλŒ€ λ©”νŠΈλ¦­ μˆ˜μ§‘ μ—μ΄μ „νŠΈλ‘œ, 쀑앙 μ •μ±… μ„œλ²„ Fleet의 정책에 λ§žμΆ”μ–΄ 데이터λ₯Ό μˆ˜μ§‘ 및 μ „μ†‘ν•©λ‹ˆλ‹€. λ³Έ ν”„λ‘œμ νŠΈμ—μ„œλŠ” Fleet μ„œλ²„λ₯Ό μŠ€νƒμ— μΆ”κ°€ν•˜μ—¬ Elastic Agent μ•„ν‚€ν…μ²˜λ‘œμ˜ μ „ν™˜μ„ μ§€μ›ν•˜κ³  μžˆμœΌλ‚˜, κΈ°λ³Έ 둜그 μˆ˜μ§‘κΈ°λ‘œλŠ” Filebeatλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

2. 데이터 버퍼 μ„œλ²„

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ™€ 둜그 λͺ¨λ‹ˆν„° μ„œλ²„ μ‚¬μ΄μ—μ„œ 처리 λΆ€ν•˜λ₯Ό μ‘°μ ˆν•˜λŠ” 데이터 버퍼 역할을 ν•˜λŠ” μ„œλ²„λ‘œ, Kafka와 Zookeeperκ°€ λ°°μΉ˜λ©λ‹ˆλ‹€.

KafkaλŠ” Filebeatμ—μ„œ μ „λ‹¬ν•œ 둜그 데이터λ₯Ό μ†‘μ‹ ν•˜μ—¬ Topic별 λ©”μ‹œμ§€λ‘œμ„œ λΆ„λ₯˜ 및 μ €μž₯ν•˜κ³ , Consumer - Logstashκ°€ 데이터λ₯Ό μš”μ²­ν•  μ‹œ μ „λ‹¬ν•΄μ£ΌλŠ” 데이터 버퍼 역할을 ν•©λ‹ˆλ‹€.

ZookeeperλŠ” Kafka ν΄λŸ¬μŠ€ν„°μ˜ 메타데이터λ₯Ό κ΄€λ¦¬ν•˜κ³ , λΈŒλ‘œμ»€λ“€μ˜ μƒνƒœλ₯Ό μ½”λ””λ„€μ΄μ…˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. λ³Έ ν”„λ‘œμ νŠΈμ—μ„œλŠ” κ΅¬μ„±μ˜ νŽΈμ˜μ„±μ„ κ³ λ €ν•˜μ—¬ ν΄λŸ¬μŠ€ν„°λ§μ„ μ„€μ •ν•˜μ§€ μ•Šμ•˜μœΌλ©°, μ°¨ν›„ λ³„λ„λ‘œ ν™•μž₯ν•  수 μžˆλ„λ‘ Docker Compose둜 묢은 단일 Kafka와 Zookeeperλ₯Ό μ‚¬μš©ν•˜λ„λ‘ κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

3. 둜그 λͺ¨λ‹ˆν„° μ„œλ²„

둜그 λ°μ΄ν„°μ˜ μˆ˜μ§‘Β·μ •μ œΒ·μ €μž₯Β·μ‘°νšŒΒ·μ‹œκ°ν™”λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ„œλ²„μž…λ‹ˆλ‹€. 데이터 처리λ₯Ό λ‹΄λ‹Ήν•˜λŠ” ELK Stack, Nginx, Fleet λ“±μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

ELK Stack은 Logstash, Elasticsearch, Kibana둜 κ΅¬μ„±λ©λ‹ˆλ‹€.

LogstashλŠ” Kafkaμ—μ„œ 둜그 데이터λ₯Ό κ°€μ Έμ˜¨ λ’€ μ •ν•΄μ§„ ν˜•μ‹μ— 맞게 κ°€κ³΅ν•˜μ—¬ Elasticsearch에 μ „λ‹¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. μ—¬λŸ¬ Topic을 톡해 λ“€μ–΄μ˜€λŠ” λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μœ μ—°ν•œ Scale-out이 ν•„μš”ν•˜λ―€λ‘œ μ—¬λŸ¬ λ…Έλ“œλ₯Ό μ μœ ν•˜λŠ” ν˜•νƒœλ‘œ κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ElasticsearchλŠ” 둜그 데이터λ₯Ό λ¬Έμ„œ ν˜•μ‹μœΌλ‘œ μ €μž₯ 및 μΈλ±μ‹±ν•˜μ—¬ 데이터 μ†ŒμŠ€μ— μ œκ³΅ν•©λ‹ˆλ‹€. Logstash와 λ§ˆμ°¬κ°€μ§€λ‘œ μœ μ—°ν•œ Scale-out 지원을 μœ„ν•˜μ—¬ ν΄λŸ¬μŠ€ν„°λ§μ„ μ§€μ›ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ˜ν•œ, Nginxλ₯Ό λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ‘œ λ‘ μœΌλ‘œμ¨ μ™ΈλΆ€ 접근에 λŒ€ν•œ 단일 μ§„μž…μ μ„ μ œκ³΅ν•¨κ³Ό λ™μ‹œμ— λ³΄μ•ˆμ„ κ°–μΆœ 수 μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Fleet은 μ•žμ„œ μ΄μ•ΌκΈ°ν•œ Elastic Agent의 쀑앙 ν†΅μ œ μ„œλ²„λ‘œ μˆ˜μ§‘ 정책을 일괄 κ΄€λ¦¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. Elastic Agent 기반 μ•„ν‚€ν…μ²˜λ‘œμ˜ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ§€μ›ν•˜κΈ° μœ„ν•˜μ—¬ μΆ”κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

KibanaλŠ” Elasticsearch에 μΈλ±μ‹±λ˜μ–΄ μžˆλŠ” 둜그 데이터λ₯Ό μ‹œκ°ν™”ν•˜κ³  UIλ₯Ό 톡해 ELK Stack을 톡합 관리할 수 있게 ν•©λ‹ˆλ‹€.

4. λ…Έλ“œ λͺ¨λ‹ˆν„° μ„œλ²„

ν•˜λ“œμ›¨μ–΄ 및 μ»¨ν…Œμ΄λ„ˆ λ©”νŠΈλ¦­μ˜ μˆ˜μ§‘Β·μ €μž₯Β·μ‹œκ°ν™”λ₯Ό λ‹΄λ‹Ήν•˜λŠ” μ„œλ²„μž…λ‹ˆλ‹€.

각 Swarm λ…Έλ“œμ— μ„€μΉ˜λœ Node ExporterλŠ” 호슀트(μ„œλ²„)의 μ‹œμŠ€ν…œ λ©”νŠΈλ¦­μ„, cAdvisorλŠ” μ»¨ν…Œμ΄λ„ˆμ˜ λ¦¬μ†ŒμŠ€ μ‚¬μš© λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜μ—¬ Prometheusμ—κ²Œ μ „μ†‘ν•©λ‹ˆλ‹€. μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆ μΈμŠ€ν„΄μŠ€κ°€ ν•¨κ»˜ λ™μž‘ν•˜λŠ” λ³Έ ν”„λ‘œμ νŠΈμ˜ μ•„ν‚€ν…μ²˜ 상, μ„œλ²„ ν•˜λ“œμ›¨μ–΄μ™€ λ³„κ°œλ‘œ μ»¨ν…Œμ΄λ„ˆλ³„ λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰λ„ λͺ¨λ‹ˆν„°λ§ν•  ν•„μš”λ₯Ό λŠκΌˆκΈ°μ— λ„μž…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

PrometheusλŠ” μ‹œκ³„μ—΄ ν˜•μ‹μ˜ λ…Έλ“œ λͺ¨λ‹ˆν„°λ§ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ 및 μ €μž₯ν•©λ‹ˆλ‹€. Node Exporter, cAdvisorλ₯Ό λΉ„λ‘―ν•œ μ„œλΉ„μŠ€λ“€μ˜ μ—”λ“œν¬μΈνŠΈμ—μ„œ λ©”νŠΈλ¦­μ„ 가져와 μ‹œκ³„μ—΄ 데이터 μ²˜λ¦¬μ— μ΅œμ ν™”λœ λ°©μ‹μœΌλ‘œ μ••μΆ• 및 μ €μž₯ν•©λ‹ˆλ‹€.

GrafanaλŠ” Prometheus에 μ €μž₯된 μ‹œκ³„μ—΄ λ©”νŠΈλ¦­ 데이터λ₯Ό λŒ€μ‹œλ³΄λ“œ ν˜•νƒœλ‘œ μ‹œκ°ν™”ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€.


νŠΈλŸ¬λΈ” μŠˆνŒ…

μ•žμ„œ μ΄μ•ΌκΈ°ν•˜μ˜€λ“―, λ³Έ ν”„λ‘œμ νŠΈ κ΅¬μΆ•μ—λŠ” λŒ€μš©λŸ‰μ˜ 둜그 데이터 처리 λ“± μ—¬λŸ¬ μ œμ•½ 사항이 λ”°λžμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜λŠ” κ³Όμ •μ—μ„œ μ–΄λ–€ λ¬Έμ œκ°€ λ°œμƒν–ˆκ³ , μ–΄λ–»κ²Œ ν’€μ–΄λƒˆλŠ”μ§€μ— λŒ€ν•œ κ²½ν—˜μ„ κ³΅μœ ν•˜κ² μŠ΅λ‹ˆλ‹€.

1. 둜그 데이터 처리 κ³ΌλΆ€ν•˜

μ•žμ„œ μ„€λͺ…ν•˜μ˜€λ“―, μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 둜그 λ°μ΄ν„°λŠ” λΆ„λ‹Ή λͺ‡λ°± MBμ—μ„œ λ§Žκ²ŒλŠ” GB에 λ‹¬ν•˜λŠ” 큰 μš©λŸ‰μ„ κ°€μ§„ λ°μ΄ν„°μ˜€μŠ΅λ‹ˆλ‹€.

첫 ꡬ좕 μ‹œ μ΄λŸ¬ν•œ λŒ€μš©λŸ‰ 데이터λ₯Ό λ³„λ„μ˜ 데이터 버퍼 없이 Filebeatμ—μ„œ Logstash둜 λ°”λ‘œ μ „μ†‘ν•˜μ˜€λŠ”λ°,
Logstash의 κ°€μš©λŸ‰μ„ λ„˜λŠ” 데이터듀을 μ§€μ†μ μœΌλ‘œ μ²˜λ¦¬ν•  수 μ—†μ—ˆκΈ°μ— 점점 μ„±λŠ₯이 μ €ν•˜λ˜μ—ˆκ³  κ²°κ΅­ κ³ΌλΆ€ν•˜λ‘œ μΈν•˜μ—¬ μ²˜λ¦¬κ°€ 멈좰 λ²„λ¦¬λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ°¨ν›„ 더 λ§Žμ€ μ„œλΉ„μŠ€λ‘œ ν™•μž₯ν•  κ³„νšμ΄ μžˆμ—ˆκΈ°μ— λ‹¨μˆœν•œ μ„œλ²„ Scale-outλ³΄λ‹€λŠ” 처리 λΆ€ν•˜μ˜ μ™„κΈ‰ 쑰절이 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•˜μ˜€κ³ , 둜그 νŒŒμ΄ν”„λΌμΈ 쀑간에 데이터 버퍼 역할을 해쀄 λ ˆμ΄μ–΄λ₯Ό λ„μž…ν•˜κΈ°λ‘œ κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

데이터 버퍼 선택 μ‹œ, 두 κ°€μ§€ 관점을 κ³ λ €ν–ˆμŠ΅λ‹ˆλ‹€.

첫 λ²ˆμ§ΈλŠ” 운영 μ•ˆμ •μ„±μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 둜그 λ°μ΄ν„°μ˜ λͺ¨λ“  흐름을 μ€‘κ°„μ—μ„œ μ œμ–΄ν•˜λŠ” μ€‘μš”ν•œ 역할이기에 μž₯μ•  λ°œμƒ μ‹œ Failoverκ°€ κ°€λŠ₯ν•΄μ•Ό ν–ˆμœΌλ©°, μΆ”κ°€ μˆ˜μš”κ°€ μš”κ΅¬λ  경우 μ–Έμ œλ“  Scale-outν•  수 μžˆμ–΄μ•Ό ν–ˆκ³ , 컨슈머의 λΆ€ν•˜μ— λ§žμΆ”μ–΄ 데이터λ₯Ό 전솑할 수 μžˆμ–΄μ•Ό ν–ˆκ³ , κΈ°μ‘΄ μ•„ν‚€ν…μ²˜μ™€ κ°„νŽΈν•˜κ²Œ 톡합할 수 μžˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

두 λ²ˆμ§ΈλŠ” 흐름 μ œμ–΄ κΈ°λŠ₯μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 각자 λ‹€λ₯Έ 처리 방식과 도메인적 λΆ„λ₯˜λ₯Ό μš”κ΅¬ν•˜λŠ” 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ, λͺ¨λ“  μ‚¬μš© 사둀에 λŒ€ν•œ λ²”μš©μ μΈ 필터링 λ°©μ‹λ³΄λ‹€λŠ” λΆ„λ₯˜λ³„λ‘œ κ·œμΉ™μ„ μ •ν•˜κ³ , 이에 따라 κ°œλ³„μ μœΌλ‘œ 데이터λ₯Ό μƒμ‚°ν•˜κ³  μ†ŒλΉ„ν•˜λŠ” 방식이 더 ν™•μž₯μ„± 있고 직관적인 방식이라고 μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 기쀀에 따라 데이터λ₯Ό λΆ„λ₯˜ν•˜κ³  생산 및 μ†ŒλΉ„ν•  수 μžˆλŠ” κΈ°λŠ₯이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬λŸ¬ 선택지듀을 κ³ λ €ν•œ κ²°κ³Ό, 두 κ°€μ§€ 관점을 λͺ¨λ‘ μΆ©μ‘±ν•  수 μžˆλŠ” Kafkaλ₯Ό μ„ νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

운영 μ•ˆμ •μ„± μΈ‘λ©΄

μš”κ΅¬ 사항 ν•΄κ²° 방식
Failover Replication ꡬ쑰둜 μž₯μ•  μ‹œμ—λ„ 데이터 μœ μ‹€ 없이 무쀑단 운영 κ°€λŠ₯
Scale-out νŠΈλž˜ν”½ 증가 μ‹œ 브둜컀 및 νŒŒν‹°μ…˜ ν™•μž₯을 ν†΅ν•œ Scale-out κ°€λŠ₯
컨슈머 λΆ€ν•˜ κ³ λ € μ»¨μŠˆλ¨Έκ°€ 처리 κ°€λŠ₯ν•œ 만큼 λ©”μ‹œμ§€λ₯Ό μ†ŒλΉ„ν•  수 μžˆλŠ” Pull λͺ¨λΈ
κΈ°μ‘΄ μ•„ν‚€ν…μ²˜ 톡합 지원 ELK Stack의 Kafka 연동 곡식 지원

흐름 μ œμ–΄ κΈ°λŠ₯ μΈ‘λ©΄

μš”κ΅¬ 사항 ν•΄κ²° 방식
데이터 생산 λΆ„λ₯˜ Topic λ‹¨μœ„ Producer 데이터 μˆ˜μ‹ 
데이터 μ†ŒλΉ„ λΆ„λ₯˜ Topic / 자체 κ·œμΉ™ 기반 Consumer λ©”μ‹œμ§€ μ†ŒλΉ„

Kafka λ„μž…μœΌλ‘œ Logstash에 κ°€ν•΄μ§€λŠ” λΆ€ν•˜κ°€ κ°€μš©λŸ‰μ„ λ„˜μ§€ μ•Šλ„λ‘ μ œν•œν•  수 μžˆμ—ˆκ³ , 도메인 κ·œμΉ™μ— 따라 Logstashλ₯Ό λΆ„λ₯˜ν•˜κ³ , μ‚¬μš©λŸ‰μ— 따라 ν™•μž₯ν•  수 있게 λ˜μ–΄ μ²˜λ¦¬λŸ‰μ— λ”°λ₯Έ μœ λ™μ μΈ ν™•μž₯이 κ°€λŠ₯ν•˜λ„λ‘ μ•„ν‚€ν…μ²˜λ₯Ό μž¬νŽΈν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

2. 무거운 ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­ 처리

μ•žμ„œ μ„€λͺ…ν•˜μ˜€λ“―, 이 μ‹œμŠ€ν…œμ€ 둜그 데이터와 μ„œλ²„(μ• ν”Œλ¦¬μΌ€μ΄μ…˜)의 μƒνƒœ(즉, ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­)λΌλŠ” 두 κ°€μ§€ μ’…λ₯˜μ˜ 데이터λ₯Ό λ‘˜ λ‹€ μ²˜λ¦¬ν•  수 μžˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. 첫 ꡬ좕 μ‹œμ—λŠ” Metricbeatμ—μ„œ ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­μ„ μˆ˜μ§‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ ELK Stackμ—μ„œ ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­κΉŒμ§€ μ „λΆ€ λ‹΄λ‹Ήν•˜μ˜€λŠ”λ°, 이럴 경우 두 κ°€μ§€ λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

첫 λ²ˆμ§ΈλŠ” 데이터 μ €μž₯ 방면의 λ¬Έμ œμž…λ‹ˆλ‹€. λ‹€λ₯Έ 성격을 κ°€μ§„ λ‘œκ·Έμ™€ ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­ 데이터가 같은 Elasticsearch ν΄λŸ¬μŠ€ν„°λ₯Ό κ³΅μœ ν•¨μ— λ”°λ₯Έ λ¦¬μ†ŒμŠ€ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λ‘œκ·ΈλŠ” 도메인/운영적 λΆ„λ₯˜μ— 따라 λ‹€μ–‘ν•œ μ €μž₯ 방식과 인덱싱 ν•„μš”μ„±μ„ 갖기에 μ΄λ²€νŠΈμ— λ”°λ₯Έ λ¬Έμ„œ λ‹¨μœ„ 처리(검색, ν•„ν„°, 집계)κ°€ ν•„μš”ν•œ 데이터인 반면, ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­μ€ λ‹Ήμ‹œ 상황을 λ‚˜νƒ€λ‚΄λŠ” λ‹¨μˆœ μ‹œκ³„μ—΄ 숫자 데이터이고, μš©λŸ‰μ΄ κ±°λŒ€ν•œ 데 λΉ„ν•˜μ—¬ λ°μ΄ν„°μ˜ 유효 기간이 κΈΈμ§€ μ•ŠκΈ°μ— μ‹œκ³„μ—΄ 집계 μ™Έμ˜ 뢀가적인 μ²˜λ¦¬κ°€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그런데, Elasticsearch ν™˜κ²½μ—μ„œλŠ” ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­λ„ λ‹€λ₯Έ 데이터듀과 λ™μΌν•˜κ²Œ λ¬Έμ„œ λ°©μ‹μœΌλ‘œ μ €μž₯ 및 μΈλ±μ‹±ν•˜κΈ°μ— 처리 μ˜€λ²„ν—€λ“œκ°€ 컀쑌고, 둜그 인덱싱 μ²˜λ¦¬λŸ‰μ„ μž μ‹ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 보쑴 기간이 κΈΈμ–΄μ§ˆμˆ˜λ‘ ν΄λŸ¬μŠ€ν„°μ˜ λΆ€ν•˜λŠ” 더 μ»€μ‘ŒκΈ°μ— ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­μ„ μž₯κΈ° μ €μž₯ν•˜κΈ° μ–΄λ €μ› μŠ΅λ‹ˆλ‹€.

두 λ²ˆμ§ΈλŠ” 데이터 μ‹œκ°ν™” 방면의 λ¬Έμ œμž…λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€λ₯Έ 성격을 κ°€μ§„ 데이터가 Kibanaλ₯Ό κ³΅μœ ν•¨μ— λ”°λ₯Έ λ¦¬μ†ŒμŠ€ λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  데이터λ₯Ό Kibanaμ—μ„œ μ‹œκ°ν™”ν•˜κΈ°μ— 짧은 κ΅¬κ°„μ˜ μ‹œκ³„μ—΄ 데이터λ₯Ό μ§€μ†μ μœΌλ‘œ 좜λ ₯ν•΄μ•Ό ν•˜λŠ” ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­κ³Ό 도메인/운영적 ν•„μš”μ— μ˜ν•˜μ—¬ 넓은 λ²”μœ„μ˜ μ—¬λŸ¬ ν˜•νƒœλ₯Ό κ°€μ§„ 데이터λ₯Ό 좜λ ₯ν•΄μ•Ό ν•˜λŠ” 둜그 λ°μ΄ν„°μ˜ μ‹œκ°ν™”κ°€ λ™μΌν•œ μžμ›μ„ κ³΅μœ ν•˜κ²Œ λ˜μ—ˆκ³ , ν•œμͺ½ νŠΈλž˜ν”½μ΄ λ§Žμ„ λ•Œ λ‹€λ₯Έ μͺ½ λŒ€μ‹œλ³΄λ“œ 응닡이 λŠλ €μ§€λŠ” ν˜„μƒμ΄ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ‹¨μˆœν•œ μ»΄ν“¨νŒ… μžμ› ν™•μž₯λ§ŒμœΌλ‘œλŠ” μ΄λŸ¬ν•œ 근본적인 데이터 성격 차이와 μ›Œν¬λ‘œλ“œ ν˜Όν•© 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. 그렇기에 κΈ°μ‘΄ ELK Stackμ—μ„œ ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­ 처리λ₯Ό λ³„λ„λ‘œ 뢄리해야 ν–ˆκ³ , μ‹œκ³„μ—΄ 데이터 μ²˜λ¦¬μ— μ΅œμ ν™”λœ κ²½λŸ‰ν™” λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ‹œκ°ν™” 도ꡬ가 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. 결과적으둜, Prometheus와 Grafanaλ₯Ό μ„ νƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

데이터 μ €μž₯ μΈ‘λ©΄ - Prometheus

μš”κ΅¬ 사항 ν•΄κ²° 방식
μ‹œκ³„μ—΄ 데이터 μ €μž₯ μ΅œμ ν™” TSDB 기반의 μ‹œκ³„μ—΄ μ΅œμ ν™” μ“°κΈ° 방식과 μ••μΆ• μ•Œκ³ λ¦¬μ¦˜ 적용으둜 μƒ˜ν”Œλ‹Ή 평균 1.3 Byte μˆ˜μ€€μ˜ μ €μž₯ μš©λŸ‰ μ••μΆ•
인덱싱 μ˜€λ²„ν—€λ“œ 제거 Label 기반 닀차원 데이터 λͺ¨λΈ μ‚¬μš©μœΌλ‘œ I/O λ¦¬μ†ŒμŠ€ μ΅œμ†Œν™”
μž₯κΈ° 보쑴 λΆ€λ‹΄ μ™„ν™” JSON λ¬Έμ„œ λ‹¨μœ„κ°€ μ•„λ‹Œ λ‹¨μˆœ Float64 / Timestamp 수치 데이터 μœ„μ£Ό μ €μž₯으둜 λ””μŠ€ν¬ 및 μŠ€ν† λ¦¬μ§€ λΉ„μš© 절감

데이터 μ‹œκ°ν™” μΈ‘λ©΄ - Grafana

μš”κ΅¬ 사항 ν•΄κ²° 방식
μ‹œκ³„μ—΄ 쑰회 μ„±λŠ₯ μ΅œμ ν™” 수치 μ—°μ‚° & 집계에 νŠΉν™”λœ PromQL μ‚¬μš©μœΌλ‘œ 적은 λΆ€ν•˜λ‘œ λŒ€λŸ‰μ˜ λ©”νŠΈλ¦­ 데이터 μ‹€μ‹œκ°„ λ Œλ”λ§
동적 λŒ€μ‹œλ³΄λ“œ ꡬ성 ν˜ΈμŠ€νŠΈλ‚˜ μ»¨ν…Œμ΄λ„ˆκ°€ μˆ˜μ‹œλ‘œ λ³€κ²½λ˜λŠ” 동적 ν™˜κ²½μ—μ„œλ„ μœ μ—°ν•œ 데이터 필터링 및 μ‹œκ°ν™” κ°€λŠ₯

Prometheus & Grafana의 λ„μž…μ„ 톡해 λ‹€λ₯Έ 성격을 κ°€μ§„ 둜그 데이터와 ν•˜λ“œμ›¨μ–΄ λ©”νŠΈλ¦­μ„ 물리적으둜 뢄리할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 ELK Stack ν΄λŸ¬μŠ€ν„°μ˜ λΆ€ν•˜λ₯Ό κ²½κ°ν•˜κ³ , 각 λ°μ΄ν„°μ˜ 성격에 λ§žλŠ” μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ„€μ •ν•¨μœΌλ‘œμ¨ μ €μž₯ 및 μ‹œκ°ν™” λΉ„μš©μ„ μ ˆκ°ν•˜λŠ” λ™μ‹œμ— ν™•μž₯성을 높일 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.


κ²°κ³Ό

GitHub Repository Preview Image

λͺ¨λ‹ˆν„°λ§ μŠ€νƒμ„ κ΅¬μΆ•ν•˜μ—¬ μ„±κ³΅μ μœΌλ‘œ 사내 μ‹œμŠ€ν…œμ— λ„μž…ν•œ 이후, 운영 κ²½ν—˜μ„ ν† λŒ€λ‘œ λ²”μš©μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” μŠ€νƒμ„ κ΅¬μΆ•ν•˜μ—¬ μ˜€ν”ˆ μ†ŒμŠ€λ‘œ κ³΅κ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

곡개 이후, λͺ¨λ‹ˆν„°λ§μ— ν•„μš”ν•œ λ‹€μ–‘ν•œ μ‚¬μš© 사둀듀을 μ§€μ›ν•˜κΈ° μœ„ν•˜μ—¬ Self-hosting ν™˜κ²½μ„ μ§€μ›ν•˜λŠ” μ˜€ν”ˆ μ†ŒμŠ€ μŠ€νƒλ“€μ„ μ§€μ†μ μœΌλ‘œ ν†΅ν•©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


마치며

λœ»κΉŠμ€ 첫 μ˜€ν”ˆ μ†ŒμŠ€ 개발 κ²½ν—˜μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œ λ¬Έμ œμ μ„ μ°Ύμ•„λ‚΄κ³  ν•΄κ²°ν•˜μ—¬ κ³΅κ°œν•˜λŠ” κ³Όμ •μ—μ„œ λ²”μš©μ μœΌλ‘œ μ μš©ν•  수 μžˆλŠ” 문제 ν•΄κ²° 방식과 개발자 κ²½ν—˜ μ΅œμ ν™”μ— λŒ€ν•˜μ—¬ 많이 κ³ λ €ν•  수 μžˆμ—ˆκ³ , μ˜€ν”ˆ μ†ŒμŠ€ 개발의 λ§₯락에 λŒ€ν•΄μ„œλ„ 이해할 수 μžˆλŠ” κ²½ν—˜μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” μ•žμœΌλ‘œλ„ μ œκ°€ κ²ͺ은 λ¬Έμ œλ“€μ˜ ν•΄κ²° κ²½ν—˜μ„ κ³΅μœ ν•˜μ—¬ κΎΈμ€€νžˆ 개발자 μƒνƒœκ³„μ— κΈ°μ—¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.