개요
마이크로서비스 아키텍처 환경에서 효율적인 로그 수집, 저장, 분석을 위한 ELK(Elasticsearch, Logstash, Kibana) 스택 기반 로깅 시스템을 구축한다.
Apache Kafka를 메시지 큐로 활용하여 대용량 로그 데이터를 안정적으로 처리하고, Kafka Connect를 통해 Elasticsearch에 자동으로 인덱싱한다.
시스템은 ZooKeeper, Kafka, Elasticsearch, Kibana, Kafka Connect로 구성되며, 각 마이크로서비스에서 발생하는 로그를 실시간으로 수집하여 중앙화된 모니터링 환경을 제공한다.
Docker 컨테이너 기반으로 구성하여 확장성과 유지보수성을 확보하고, 개발 및 운영 환경에서 일관된 로깅 인프라를 제공한다.
로깅 시스템 구성 요소:
- ZooKeeper: Kafka 클러스터 코디네이션 (포트 2181)
- Apache Kafka: 로그 메시지 큐 (포트 9092)
- Elasticsearch: 로그 데이터 저장 및 검색 (포트 9200, 9300)
- Kibana: 로그 데이터 시각화 및 대시보드 (포트 5601)
- Kafka Connect: Kafka와 Elasticsearch 연동 (포트 8084)
마이크로서비스 → Kafka Producer → Kafka Topic → Kafka Connect → Elasticsearch → Kibana
Kibana-Discover
Kibana-Dashboard
backEnd/log-init/docker-compose.yml
version: '3.8'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.3.0
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
volumes:
- zookeeper-data:/var/lib/zookeeper/data
- zookeeper-logs:/var/lib/zookeeper/log
networks:
- logging-network
- app-network
kafka:
image: confluentinc/cp-kafka:7.3.0
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
volumes:
- kafka-data:/var/lib/kafka/data
networks:
- logging-network
- app-network
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.9
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- bootstrap.memory_lock=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
networks:
- logging-network
- app-network
kibana:
image: docker.elastic.co/kibana/kibana:7.17.9
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
volumes:
- kibana-data:/usr/share/kibana/data
networks:
- logging-network
kafka-connect:
image: confluentinc/cp-kafka-connect:7.3.0
container_name: kafka-connect
depends_on:
- kafka
- elasticsearch
ports:
- "8084:8083"
environment:
CONNECT_REST_ADVERTISED_HOST_NAME: "kafka-connect"
CONNECT_BOOTSTRAP_SERVERS: kafka:29092
CONNECT_REST_PORT: 8083
CONNECT_GROUP_ID: "kafka-connect-group"
CONNECT_CONFIG_STORAGE_TOPIC: "connect-configs"
CONNECT_OFFSET_STORAGE_TOPIC: "connect-offsets"
CONNECT_STATUS_STORAGE_TOPIC: "connect-status"
CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
CONNECT_KEY_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
CONNECT_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
CONNECT_INTERNAL_KEY_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
CONNECT_INTERNAL_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components"
CONNECT_LOG4J_ROOT_LOGLEVEL: INFO
volumes:
- kafka-connect-data:/kafka-connect
command:
- bash
- -c
- |
echo "Installing connector plugins"
confluent-hub install --no-prompt confluentinc/kafka-connect-elasticsearch:14.0.6
#
echo "Launching Kafka Connect worker"
/etc/confluent/docker/run
networks:
- logging-network
- app-network
networks:
logging-network:
driver: bridge
app-network:
external: true
name: s12p31a102_app-network
volumes:
zookeeper-data:
zookeeper-logs:
kafka-data:
elasticsearch-data:
kibana-data:
kafka-connect-data:
ELK 스택과 Kafka 기반 로깅 시스템의 전체 구성이다.
ZooKeeper는 Kafka 클러스터의 메타데이터를 관리하고, Kafka는 로그 메시지를 큐잉한다.
Elasticsearch는 로그 데이터를 저장하고 검색 기능을 제공하며, Kibana는 시각화 대시보드를 제공한다.
Kafka Connect는 Kafka 토픽의 데이터를 Elasticsearch로 자동 전송하는 커넥터 역할을 수행한다.
모든 서비스는 영속성을 위한 볼륨을 가지며, 네트워크를 통해 마이크로서비스들과 연동된다.
networks부분을 보면 app-network를 external로 세팅을 하였으며, name은 마이크로서비스의 docker와 동일하게 세팅해 주었다.
backEnd/log-init/elastic-sink-connector.sh
curl -X DELETE http://localhost:8084/connectors/elasticsearch-sink
curl -X POST http://localhost:8084/connectors -H "Content-Type: application/json" -d '{
"name": "elasticsearch-sink",
"config": {
"connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
"topics": "http-logs",
"connection.url": "http://elasticsearch:9200",
"key.ignore": "true",
"schema.ignore": "true",
"behavior.on.null.values": "ignore",
"behavior.on.malformed.documents": "warn",
"tasks.max": "1",
"key.converter": "org.apache.kafka.connect.storage.StringConverter",
"value.converter": "org.apache.kafka.connect.json.JsonConverter",
"value.converter.schemas.enable": "false"
}
}'
curl -X GET http://localhost:8084/connectors/elasticsearch-sink/status
curl -X GET "http://localhost:9200/_cat/indices?v"
curl -X GET "http://localhost:9200/http-logs*/_search?pretty&size=1"
Kafka Connect를 통해 Elasticsearch Sink Connector를 설정하는 스크립트다.
http-logs 토픽의 메시지를 Elasticsearch에 자동으로 인덱싱하도록 구성한다.
JSON 형태의 로그 데이터를 스키마 없이 처리하고, 잘못된 형식의 문서는 경고 처리한다.
설정 완료 후 커넥터 상태, 인덱스 목록, 샘플 데이터를 확인하여 정상 동작을 검증한다.
'프로젝트 > [어플리케이션] 토닥' 카테고리의 다른 글
[토닥] 경계선 지능인을 위한 앱 서비스 CI/CD 파이프라인 구축 (1) | 2025.05.27 |
---|---|
[토닥] 경계선 지능인을 위한 앱 서비스 서버 초기 세팅 및 Redis 설정 (0) | 2025.05.27 |
[토닥] 경계선 지능인을 위한 앱 서비스 프로필 서비스 Profile-Service (1) | 2025.05.27 |
[토닥] 경계선 지능인을 위한 앱 서비스 관계 서비스 Relation-Service (1) | 2025.05.27 |
[토닥] 경계선 지능인을 위한 앱 서비스 인증 서비스 Auth-Service (0) | 2025.05.27 |