Logstash 구축 troubleshooting

PLC·2025년 2월 14일
0

Elastic

목록 보기
3/3
post-thumbnail


Trouble 1 - DB 연결 실패 (JDBC관련)

communications link failure\in\the last packet sent successfully to the server was 0 milliseconds ago. the driver has not received any packets from the server.”

exception when executing jdbc query {:exception=>sequel::databaseconnectionerror

DB에 연결이 안 된다는 오류다. 워낙 추상적이기 때문에 해결책은 여러가지가 있다. 여태까지 봤고, 시도한 걸 정리하자!


1. Mysql의 my.conf 파일을 열어 host가 127.0.0.1로 되어있다면 0.0.0.0으로 바꿔주는 것

  1. 전자는 localhost로의 접속만 허용한다는 뜻이기 때문에 다른 프로그램에서 접근하려면 막힌다. 로컬말고 서버에서 돌릴 때 주로 겪는 문제인듯.
  2. 후자는 모든 ip에서의 접속을 허용한다는 뜻.
  3. 내 문제는 이게 아니었다

2. Jdbc 버전 다른 걸로 다운해보기

  1. Mysql이랑 버전 호환 안 되는 거 쓰면 그럴 수도 있다고 봤다
  2. 3~4개 정도 시도해봤는데 다 실패

3. Logstash.conf파일 이것저것 수정

  1. 이 경우는 주로 db url을 잘못 설정했을 때의 해결책으로 자주봤다. Host명이 틀렸거나, 유저 혹은 비번이 틀렸거나, db port가 틀렸거나 혹은 명시를 안 했거나.
  2. 문법이 틀렸나해서 스케줄이나 쿼리문, 특히 metadata로 쓰이는 id설정, created_at과 updated_at의 timestamp 형식 수정도 해보았다.
    • 이 부분은 확실친 않지만 es의 인덱스를 생성할 때 created updated 매핑 설정을 mysql에서 설정해둔 시간 형식과 일치시킨 것도 도움이 되지않았을까 싶다
  3. 나의 주된 문제는 어쨌든 이게 아니라서..

4. logstash와 mysql이 같은 네트워크에 있는지 확인

  1. 발생한 이유
    • 나는 도커를 사용한다. 결론적으로 말하면 두 컨테이너의 네트워크가 달라서 서로를 찾지 못했던 것. 그래서 연결이 안 된 것. 같은 네트워크로 맞춰주니 해결됐다.
  2. 설정이 그렇게 된 이유
    • 원래 플젝A에서 포크떠서 플젝B에서 작업 중이었다. 이때 A에서 작업할 때 올려놨던 컨테이너 중 일부는 중지 및 삭제했고, 일부는 중지조차 안 시키고 계속 가동중이었다. 이 상황에서 B에서 작업을 시작했고 아까 중지했던 컨테이너까지 다시 올려서 작업했다.
    • 컨테이너가 새로 생성되면 네트워크를 지정을 하게 된다. 별 다른 설정이 없으면 디폴트 네트워크로 지정이 되는데, 이게 현재 플젝명_default 이렇게 새로 생성되어 지정된다. 나는 A에서 B로 옮길 때 플젝명도 바꿔서 작업하고 있었다. 그래서 A의 네트워크는 플젝명_default였고 B의 네트워크는 플젝명_personal_default였다.
  3. 도커 사용 중이고 나같은 오류가 뜬다면 두 컨테이너의 네트워크가 동일한지 확인해보자!
  4. 이걸 왜 늦게 알게 되었냐면, Intelli J에서 오른쪽 탭에서 DB 연결할 땐 문제가 없었기 때문에 MySQL쪽의 문제가 아니라 ES설정의 문제라고 생각하고 있었다. 지금 생각해보니 전혀 상관없는 일이었음을 ㅠㅡㅠ




Trouble 2 - DB 인증 문제

ctionException: Public Key Retrieval is not allowed", :cause=>"#<Java::JavaSql::SQLNonTransientConnectionException: Public Key Retrieval is not allowed>"}

jdbc_connection_string에 &useSSL=false 추가하면 해결된다.




Trouble 3 - 연결은 다 됐는데 ES에 업데이트가 안 됨

1. conf파일에 작성한 쿼리를 DB에 바로 날려보자

  1. 만약 결과값이 없다면 쿼리가 잘못 작성되었거나
  2. DB의 시간대 때문일 것이다

2. MySQL과 ElasticSearch, Logstash 시간대 설정

당연하지만 시간대가 안 맞으면 NOW()를 날렸을 때 얻는 값이 각 DB마다 다를 것이고 이게 updated_at과 어긋나면 당연히 작동이 안 되다. 나는 서울로 통일했다.

  1. MySQL

    • SELECT NOW() AS current_time, @@global.time_zone AS global_time_zone, @@session.time_zone AS session_time_zone;
    • 위 쿼리를 날려 현재 DB 시간 설정을 본다

    1. 나는 저 쿼리를 한국기준 오후에 보냈는데 current_time이 저렇게 떴다. 여기서 SYSTEM의 시간 설정을 따른다고 하는데 여기서 SYSTEM은 운영체제를 말하고 운영체제의 시간대를 따르고 있다는 뜻이다. 나는 도커를 사용하기 때문에 시간대가 UTC로 설정이 되어있는 것 같다.
    2. 만약 도커를 사용하지 않고 그냥 MySQL을 사용한다면
      SET GLOBAL time_zone = 'Asia/Seoul';
      이 쿼리를 날려 해결할 수 있을 것이다.
    3. 하지만 나처럼 도커 위의 MySQL이라면 컨테이너 실행시에 환경변수를 추가해주면 된다.
      나는 docker-compose파일에
      environment: -TZ=Asia/Seoul
      이라는 설정을 추가하고 컨테이너와 이미지를 모두 삭제한 뒤 재실행했다.
  2. ElasticSearch
    1. curl -X GET "localhost:9200/_nodes/settings?pretty” 를 터미널에서 날리거나
    2. GET /_cluster/settings?pretty 를 ES 콘솔에 직접 입력해서 시간을 확인해보자
    3. 나의 경우는 persistent settings 와 Transient settings 항목이 모두 비어있었기 때문에 기본값인 SYSTEM 시간대가 사용되고 있었을 것이다.
    4. 근데 하여튼 ES에서는 time_zone을 직접 수정하지 못하게 해놨으므로, logstash의 conf파일에서 filter부분에 time_zone을 명시해주면 된다.

profile
jusqu'au dernier silence

0개의 댓글