- 불필요한 추측 제거
- 근본적 해결책만 명시 (볼륨 마운트 추가)
- 현재 상태 업데이트 (헬스체크 실패)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
201 lines
5.5 KiB
Markdown
201 lines
5.5 KiB
Markdown
# OpenSearch 로그 시스템 구축
|
|
|
|
## 작성일: 2025-09-14
|
|
## 작성자: admin
|
|
## 환경: Ubuntu 22.04, 51123 서버, Docker Compose
|
|
|
|
## 요구사항 분석
|
|
|
|
### 목적
|
|
- 51123/51124 서버 로그 중앙집중식 관리
|
|
- 실시간 로그 검색 및 분석
|
|
- 시각화 대시보드 제공
|
|
|
|
### 솔루션 비교
|
|
| 항목 | OpenSearch | Loki+Grafana | Vector+ClickHouse |
|
|
|------|------------|--------------|-------------------|
|
|
| 메모리 | 2-4GB | 512MB-1GB | 1-2GB |
|
|
| 검색성능 | 풀텍스트 최강 | 라벨 기반 | SQL 지원 |
|
|
| Docker 통합 | Fluentd 필요 | Promtail 자동 | Vector 자동 |
|
|
| 대시보드 | OpenSearch Dashboards | Grafana | Grafana 연동 |
|
|
|
|
**선택**: OpenSearch (복잡한 텍스트 검색 요구)
|
|
|
|
## 시스템 확인
|
|
|
|
### 리소스 현황
|
|
```bash
|
|
# 메모리: 29GB 총량, 23GB 가용
|
|
free -h
|
|
# HDD: 916GB 총량, 869GB 가용
|
|
df -h /mnt/hdd
|
|
# SSD: 228GB 총량, 158GB 가용 (27% 사용)
|
|
df -h /
|
|
```
|
|
|
|
### 로그 현황
|
|
- `/mnt/hdd/logs/`: 51124-server/, act_runner/, backup/, cleanup/, company-x/, nginx/
|
|
- 종료된 컨테이너: skill-slack (10일 전), rb10508_test (6주 전)
|
|
- 자동 정리: 매일 4시, 30일 보관
|
|
|
|
## Docker Compose 설정
|
|
|
|
```yaml
|
|
# /home/admin/opensearch/docker-compose.yml
|
|
version: '3'
|
|
services:
|
|
opensearch:
|
|
image: opensearchproject/opensearch:2.11.0
|
|
container_name: opensearch
|
|
environment:
|
|
- cluster.name=robeing-logs
|
|
- node.name=opensearch-node1
|
|
- discovery.type=single-node
|
|
- bootstrap.memory_lock=true
|
|
- "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g"
|
|
- DISABLE_SECURITY_PLUGIN=true # 개발환경
|
|
ulimits:
|
|
memlock:
|
|
soft: -1
|
|
hard: -1
|
|
volumes:
|
|
- /mnt/hdd/opensearch/data:/usr/share/opensearch/data
|
|
ports:
|
|
- 9200:9200
|
|
- 9600:9600
|
|
networks:
|
|
- opensearch-net
|
|
|
|
opensearch-dashboards:
|
|
image: opensearchproject/opensearch-dashboards:2.11.0
|
|
container_name: opensearch-dashboards
|
|
ports:
|
|
- 5601:5601
|
|
environment:
|
|
- OPENSEARCH_HOSTS=http://opensearch:9200
|
|
- DISABLE_SECURITY_DASHBOARDS_PLUGIN=true
|
|
networks:
|
|
- opensearch-net
|
|
|
|
fluentd:
|
|
build: ./fluentd
|
|
container_name: fluentd
|
|
volumes:
|
|
- /mnt/hdd/logs:/var/log/system:ro
|
|
- /var/lib/docker/containers:/var/lib/docker/containers:ro
|
|
- ./fluentd/fluent.conf:/fluentd/etc/fluent.conf
|
|
environment:
|
|
- OPENSEARCH_HOST=opensearch
|
|
- OPENSEARCH_PORT=9200
|
|
networks:
|
|
- opensearch-net
|
|
depends_on:
|
|
- opensearch
|
|
|
|
networks:
|
|
opensearch-net:
|
|
```
|
|
|
|
## Fluentd 설정
|
|
|
|
```ruby
|
|
# /home/admin/opensearch/fluentd/fluent.conf
|
|
<source>
|
|
@type tail
|
|
path /var/log/system/**/*.log
|
|
pos_file /fluentd/log/system.pos
|
|
tag system.logs
|
|
<parse>
|
|
@type multiline
|
|
format_firstline /^\d{4}-\d{2}-\d{2}/
|
|
format1 /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\s+(?<level>\w+)\s+(?<message>.*)/
|
|
</parse>
|
|
</source>
|
|
|
|
<match **>
|
|
@type opensearch
|
|
host "#{ENV['OPENSEARCH_HOST']}"
|
|
port "#{ENV['OPENSEARCH_PORT']}"
|
|
logstash_format true
|
|
logstash_prefix robeing
|
|
</match>
|
|
```
|
|
|
|
## 실행 및 검증
|
|
|
|
```bash
|
|
# 디렉토리 생성
|
|
mkdir -p /mnt/hdd/opensearch/data
|
|
chmod 777 /mnt/hdd/opensearch/data
|
|
|
|
# 실행
|
|
cd /home/admin/opensearch
|
|
docker compose up -d
|
|
|
|
# 상태 확인
|
|
curl -X GET "localhost:9200/_cluster/health?pretty"
|
|
```
|
|
|
|
## CI/CD 배포 문제 해결 (추가: happybell80)
|
|
|
|
### 발견된 문제들
|
|
|
|
#### 1. Password 파싱 오류
|
|
```
|
|
Parsing failed. Reason: Missing argument for option: p
|
|
```
|
|
|
|
**원인**: bash -c 내부에서 변수 이스케이프 문제
|
|
- `${OP_PASS}`를 호스트가 먼저 해석하려 해서 빈 값이 됨
|
|
- `\${OP_PASS}`로 이스케이프 필요
|
|
|
|
#### 2. 인증서 파일 누락으로 컨테이너 재시작
|
|
**원인**: docker-compose.yaml에 볼륨 마운트 없음
|
|
```yaml
|
|
# 현재 (문제)
|
|
volumes:
|
|
- /var/lib/opensearch:/usr/share/opensearch/data
|
|
|
|
# 수정 필요
|
|
volumes:
|
|
- /var/lib/opensearch:/usr/share/opensearch/data
|
|
- ./certs:/usr/share/opensearch/config/certs:ro
|
|
- ./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml:ro
|
|
```
|
|
|
|
#### 3. Gitea Secrets 한계
|
|
- Secrets는 CI/CD Actions 실행 시에만 사용 가능
|
|
- 서버에서 직접 `docker compose up` 시 사용 불가
|
|
- Actions가 생성한 파일을 컨테이너에 마운트 필요
|
|
|
|
|
|
## 현재 상태 (2025-09-14 최종 확인)
|
|
|
|
### 헬스체크 실패 상황
|
|
- **컨테이너 상태**: 계속 재시작 중 (Restarting)
|
|
- **포트 9200**: 리스닝 중이지만 응답 없음
|
|
- **원인**: `/usr/share/opensearch/config/certs/root.pem` 인증서 파일 없음
|
|
- **Actions 배포**: 성공으로 표시되지만 실제 컨테이너는 실패
|
|
|
|
### 문제 확인
|
|
- Actions는 `docker compose up -d` 실행 후 종료 (백그라운드 실행)
|
|
- 컨테이너 상태를 확인하지 않아 "성공"으로 표시
|
|
- 실제로는 인증서 누락으로 컨테이너 재시작 반복
|
|
|
|
### 근본적 해결책
|
|
|
|
**docker-compose.yaml에 볼륨 마운트 추가 필수**
|
|
```yaml
|
|
volumes:
|
|
- /var/lib/opensearch:/usr/share/opensearch/data
|
|
- ./certs:/usr/share/opensearch/config/certs:ro
|
|
- ./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml:ro
|
|
```
|
|
|
|
Git Actions가 생성한 인증서와 비밀번호 파일을 컨테이너가 읽을 수 있도록 마운트해야 함.
|
|
현재 데이터 볼륨만 마운트되어 있어서 인증서를 찾지 못해 실패.
|
|
|
|
## 다음 단계
|
|
1. 인덱스 라이프사이클 정책 설정 (30일 보관)
|
|
2. 기존 로그 마이그레이션 스크립트 작성
|
|
3. 알림 규칙 설정 (에러 임계값) |