[Server] 우분투 환경에 Kafka, ELK 서버 구축하기

Sungjin Cho·2024년 11월 4일

Server

목록 보기
6/8
post-thumbnail

Java 설치

sudo apt update
sudo apt install openjdk-17-jdk -y
java -version

ElasticSearch 설치

  1. Elasticsearch 저장소 추가 및 설치
sudo apt install curl

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic-archive-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch
  1. Elasticsearch 설정 (/etc/elasticsearch/elasticsearch.yml)
sudo nano /etc/elasticsearch/elasticsearch.yml

network.host 주석 제거 및 ip 변경

network.host: 0.0.0.0 
  1. 방화벽 설정
sudo ufw allow 9200
sudo ufw status

elasticsearch에서 사용되는 9200 포트를 열어준다.

  1. Elasticsearch 서비스 시작 및 자동 실행 설정
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
  1. Elasticsearch 서버 실행 확인
curl -X GET "http://localhost:9200"

트러블 슈팅
→ 위 명령어 입력 시 서버 응답으로 empty reply 이 response 된다.

로그 확인 결과 ssl 관련 문제

curl -X GET "https://localhost:9200" -k

이렇게 했을 때 security_exception, 401 에러 발생했음

elastic search 는 install 하면 elastic 이라는 user가 자동으로 생성되고 비밀번호가 존재함

요청을 보낼때 elastic 유저와 비밀번호를 명시해서 호출해서 에러 해결했음

비밀번호를 모른다면

sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

해당 파일을 통해서 비밀번호를 초기화하면서 화면에 비밀번호를 보여줌

최종적으로

curl -u elastic:c6SVlTVh3dyrA8lIKqSM -X GET "https://localhost:9200" -k

명령어를 실행했을 때 올바른 서버 응답을 불러왔음

같은 네트워크의 다른 PC에서 접속하는 테스트

url: https://172.30.1.13:9200/

접속 시에 사용자 이름과 비밀번호 입력하는 화면이 나온다

사용자 이름: elastic

비밀번호: 위에서 확인된 비밀번호

다른 PC에서 접속 성공

Logstash 설치

  1. Logstash 설치
sudo apt install logstash
  1. Logstash 설정 파일 생성 및 Kafka 플러그인 설정
sudo nano /etc/logstash/conf.d/logstash.conf
input {
  kafka {
    bootstrap_servers => "localhost:9092"  # Kafka 브로커 주소
    topics => ["your-topic-name"]          # Kafka 토픽 이름
    group_id => "logstash_consumer_group"  # Kafka 컨슈머 그룹 ID
  }
}

filter {
  # 필요한 필터 추가 (예: grok, mutate 등)
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "kafka-log-%{+YYYY.MM.dd}"   # 인덱스 패턴
  }
  stdout { codec => rubydebug }
}
  • bootstrap_servers: Kafka 브로커 주소 (IP 주소 또는 호스트 이름과 포트).
  • topics: Logstash가 구독할 Kafka 토픽 이름.
  • group_id: Logstash의 Kafka 컨슈머 그룹 ID.
  1. Logstash 서비스 시작 및 자동 실행 설정
sudo systemctl enable logstash
sudo systemctl start logstash

Kibana 설치

  1. kibana 설치
sudo apt install kibana
  1. kibana 설정 파일 수정
sudo nano /etc/kibana/kibana.yml
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
  1. kibana 서비스 시작 및 자동 실행 설정
sudo systemctl enable kibana
sudo systemctl start kibana

같은 네트워크의 다른 PC에서 ip로 접속 성공

실행중인 PC에서는 localhost로 접속 가능

Kafka 설치

Zookeeper 설치

Kafka는 Zookeeper를 사용하여 클러스터 관리를 한다.

Kafka는 Java가 필요하기 때문에 jdk 없으면 설치

sudo apt update
sudo apt install openjdk-17-jdk -y
java -version
  1. Zookeeper 설치 및 시작
sudo apt install zookeeperd -y
  1. 실행 확인
systemctl status zookeeper

Kafka 다운로드 및 설치

  1. kafka 설치
wget https://downloads.apache.org/kafka/3.8.1/kafka-3.8.1-src.tgz
tar -xzf kafka_3.8.1-src.tgz
sudo mv kafka_3.8.1-src /usr/local/kafka
  1. kafak 환경변수 설정
echo 'export PATH=$PATH:/usr/local/kafka/bin' >> ~/.bashrc
source ~/.bashrc
  1. kafka 설정 파일 수정
sudo nano /usr/local/kafka/config/server.properties
broker.id=0
log.dirs=/usr/local/kafka/logs  # 로그 저장 위치
zookeeper.connect=localhost:2181
listeners=PLAINTEXT://:9092
  • broker.id: 각 Kafka 브로커에 고유하게 설정되는 ID입니다.
  • log.dirs: Kafka 데이터가 저장될 디렉터리입니다.
  • zookeeper.connect: Zookeeper의 주소입니다. 기본적으로 로컬에서 실행되므로 localhost:2181로 설정합니다.
  • listeners: Kafka가 수신할 네트워크 인터페이스와 포트입니다. 기본 포트는 9092입니다.
  1. Kafka 서버 시작
# Kafka 서버 시작
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

위 명령어 입력했을 때 “Classpath is empty. Please build the project first e.g. by running ‘./gradlew jar -PscalaVersion=2.13.14’ 라는 문구 나옴

java 설치되어 있으면 /usr/local/kafka 경로에서 gradlew 실행

./gradlew jar -PscalaVersion=2.13.14

gradle 실행 시에 jdk 8로 잡혀 있으면 지원하지 않는다고 에러 발생함

11 이상 설치 후 JAVA_PATH 환경변수 설정을 해준다.

echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" ~/.bashrc
echo "export PATH=\$JAVA_HOME/bin:\$PATH" ~/.bashrc

변경 적용

source ~/.bashrc

JAVA_HOME 잡아준 자바의 버전으로 바뀌었는지 확인

java -version

gradle 실행 (/usr/local/kafka 경로에서 실행)

./gradlew jar -PscalaVersion=2.13.14

Kafka 실행

/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
  1. Kafka 서버 확인

    1. 테스트용 토픽 생성
    kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
    

    b. 테스트 메시지 전송 및 수신: 두 개의 터미널을 열고, 하나는 메시지를 produce하고 다른 하나는 consume 하도록 설정합니다.

    Producer (터미널 1)

    kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
    

    메시지 입력하고 엔터 눌러서 kafka 서버에 전송

    Consumer (터미널 2)

    kafka-console-consumer.sh --topic test-topic --bootstrap-server localhost:9092 --from-beginning
    

    Producer 터미널에서 입력해서 전송한 메시지가 Consumer 터미널에서 보이는지 확인

최종 서버 세팅 정리

  • Java (기반 환경)
    • OpenJDK 17 설치
  • Elasticsearch
    • 포트: 9200
    • 외부 접속 가능 (0.0.0.0으로 설정)
    • HTTPS 사용
    • 인증 필요 (elastic 사용자)
  • Logstash
    • Kafka의 데이터를 Elasticsearch로 전송하는 파이프라인
    • 설정: Kafka(input) → Elasticsearch(output)
  • Kibana
    • 포트: 5601
    • 외부 접속 가능 (0.0.0.0으로 설정)
    • Elasticsearch와 연동
  • Kafka & Zookeeper
    • Kafka 포트: 9092
    • Zookeeper 포트: 2181
    • Kafka 버전: 3.8.1

0개의 댓글