docker 환경에서 elasticsearch와 logstash를 이용해 mysql 데이터 연동하기

BaeBae·2023년 5월 4일
0

검색엔진

목록 보기
7/7
post-thumbnail

지난번까지 가상 환경을 깔아서 elasticsearch를 실행해보았다!
이번 시간엔 가상 환경이 아닌 docker 환경에서 구동해보려고 한다!

elasticsearch와 logstash 설치 및 설정과 mysql db의 데이터를 가져와보는 것까지의 과정을 정리해보았다 ㅎㅎ

🔎 1. Elasticsearch 다운 및 설정

1. Docker 버전 elasticsearch 다운로드

sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.1

2. 실행

sudo docker run -it -d --rm --network elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.12.1

3. 확인

curl http://{서버주소}:9200

🔎 2. Jdk 다운 및 설치

# search
apt search openjdk-11

# install
sudo apt-get install openjdk-11-jdk

# 설치확인
java --version

# 설치된 자바 패키지 리스트 확인
update-java-alternatives -l 
#/usr/lib/jvm/java-1.11.0-openjdk-amd64 이 리스트업됨.

# 환경설정하기
export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

# 환경설정확인
echo $PATH

🔎 3. logstash 다운로드 & 볼륨 설정

1. Docker 버전 logstash 다운로드

sudo docker pull docker.elastic.co/logstash/logstash:7.12.1

2. docker에 logstash 볼륨 생성

sudo docker volume create logstash

3. 실행

# 실행
# -d 는 컨테이너를 background에서 실행 시켜준다.
# -v 는 docker volume의 logstash를 /usr/share/logstash와 연결해준다.
sudo docker run -p 9600:9600 -d -v logstash:/usr/share/logstash --name logstash docker.elastic.co/logstash/logstash:7.12.1

4. logstash 볼륨 위치

/var/lib/docker/volumes/볼륨명/_data

## 위치로 이동
cd /var/lib/docker/volumes/logstash/_data

🔎 4. MySQL Connector Java 다운 및 설치

1. 컨테이너 밖에서 설치

# 다운로드
sudo apt-get dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java_8.0.23-1ubuntu18.04_all.deb

# 파일 풀기
sudo dpkg -i mysql-connector-java_8.0.23-1ubuntu18.04_all.deb

# 경로 설정
usr/share/java/mysql-connector-java-8.0.23.jar

2. jar 파일 경로 설정

# root로 이동
sudo su

# jar 파일 복사
cv mysql-connector-java-8.0.23.jar /var/lib/docker/volumes/logstash/_data

exit

3. lib 설정 컨테이너로 접근

# logstash 컨테이너 접근
sudo docker exec -it logstash bash

# jar 이동 
mv mysql-connector-java-8.0.23.jar ../logstash/logstash-core/lib/jars/

🔎 5. logstash 설정

1. logstash 컨테이너 안에서 config 폴더 안에 logstash.yml 설정

# 컨테이너 안으로 들어가기
# 이미 컨테이너 안이라면 할 필요 없음
sudo docker exec -it logstash bash

# 파일 생성 및 열기
vi config/logstash.yml

# 파일 작성
i

# 파일 내용 예시
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: [ "http://{서버 주소}:9200" ]
path.data: 'jdbc:mysql://{서버주소}:3306/churest''

# 작성 종료
Esc

# 저장하고 닫기
:wq

2. pipeline 폴더 안에 logstash.conf 파일 설정

# 파일 열기
vi pipeline/logstash.conf

# 파일 작성
i

# 파일 내용 예시
input{
    jdbc{
        clean_run => true
        jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-java-8.0.23.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://k8a505.p.ssafy.io:3306/churest"
        jdbc_user => "{DB id}"
        jdbc_password => "{DB 비밀번호}"
        jdbc_paging_enabled => true
        tracking_column => "unix_ts_in_secs"
        use_column_value => true
        tracking_column_type => "numeric"
        statement => "SELECT *, UNIX_TIMESTAMP(modified_time) AS unix_ts_in_secs FROM member WHERE (UNIX_TIMESTAMP(modified_time) > :sql_last_value AND modified_time < NOW()) ORDER BY modified_time ASC"
        schedule => "/5 * * * * *"
        last_run_metadata_path => "/usr/share/logstash/.logstash_jdbc_last_run"
    }
}

filter {
  mutate {
    copy => {"member_id" => "[@metadata][member_id]"}
    remove_field => ["member_id", "@version", "unix_ts_in_secs"]
  }
}

output {

stdout {}
elasticsearch {
    hosts => "http://{서버 주소}:9200"
    index => "churest"
    document_id => "%{[@metadata][member_id]}"
  }
}



# 작성 종료
Esc

# 저장하고 닫기
:wq

3.실행

bin/logstash -f pipeline/logstash.conf

드디어드디어디드어!!
명령어 하나하나 제대로 되는 게 없어서 애를 먹었는데 드디어 제대로 실행되기 시작한다 ㅜㅜ
너무 뿌듯함 그 잡채!!
다음엔 nori를 깔아서 reindex 해봐야겠다 ㅎㅎ


참고 자료
profile
Data가 좋은 Web 개발자

0개의 댓글