
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으로 바꿔주는 것
- 전자는 localhost로의 접속만 허용한다는 뜻이기 때문에 다른 프로그램에서 접근하려면 막힌다. 로컬말고 서버에서 돌릴 때 주로 겪는 문제인듯.
- 후자는 모든 ip에서의 접속을 허용한다는 뜻.
- 내 문제는 이게 아니었다
2. Jdbc 버전 다른 걸로 다운해보기
- Mysql이랑 버전 호환 안 되는 거 쓰면 그럴 수도 있다고 봤다
- 3~4개 정도 시도해봤는데 다 실패
3. Logstash.conf파일 이것저것 수정
- 이 경우는 주로 db url을 잘못 설정했을 때의 해결책으로 자주봤다. Host명이 틀렸거나, 유저 혹은 비번이 틀렸거나, db port가 틀렸거나 혹은 명시를 안 했거나.
- 문법이 틀렸나해서 스케줄이나 쿼리문, 특히 metadata로 쓰이는 id설정, created_at과 updated_at의 timestamp 형식 수정도 해보았다.
- 이 부분은 확실친 않지만 es의 인덱스를 생성할 때 created updated 매핑 설정을 mysql에서 설정해둔 시간 형식과 일치시킨 것도 도움이 되지않았을까 싶다
- 나의 주된 문제는 어쨌든 이게 아니라서..
4. logstash와 mysql이 같은 네트워크에 있는지 확인
- 발생한 이유
- 나는 도커를 사용한다. 결론적으로 말하면 두 컨테이너의 네트워크가 달라서 서로를 찾지 못했던 것. 그래서 연결이 안 된 것. 같은 네트워크로 맞춰주니 해결됐다.
- 설정이 그렇게 된 이유
- 원래 플젝A에서 포크떠서 플젝B에서 작업 중이었다. 이때 A에서 작업할 때 올려놨던 컨테이너 중 일부는 중지 및 삭제했고, 일부는 중지조차 안 시키고 계속 가동중이었다. 이 상황에서 B에서 작업을 시작했고 아까 중지했던 컨테이너까지 다시 올려서 작업했다.
- 컨테이너가 새로 생성되면 네트워크를 지정을 하게 된다. 별 다른 설정이 없으면 디폴트 네트워크로 지정이 되는데, 이게 현재 플젝명_default 이렇게 새로 생성되어 지정된다. 나는 A에서 B로 옮길 때 플젝명도 바꿔서 작업하고 있었다. 그래서 A의 네트워크는 플젝명_default였고 B의 네트워크는 플젝명_personal_default였다.
- 도커 사용 중이고 나같은 오류가 뜬다면 두 컨테이너의 네트워크가 동일한지 확인해보자!
- 이걸 왜 늦게 알게 되었냐면, 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에 바로 날려보자
- 만약 결과값이 없다면 쿼리가 잘못 작성되었거나
- DB의 시간대 때문일 것이다
2. MySQL과 ElasticSearch, Logstash 시간대 설정
당연하지만 시간대가 안 맞으면 NOW()를 날렸을 때 얻는 값이 각 DB마다 다를 것이고 이게 updated_at과 어긋나면 당연히 작동이 안 되다. 나는 서울로 통일했다.
-
MySQL
- SELECT NOW() AS
current_time, @@global.time_zone AS global_time_zone, @@session.time_zone AS session_time_zone;
- 위 쿼리를 날려 현재 DB 시간 설정을 본다

- 나는 저 쿼리를 한국기준 오후에 보냈는데 current_time이 저렇게 떴다. 여기서 SYSTEM의 시간 설정을 따른다고 하는데 여기서 SYSTEM은 운영체제를 말하고 운영체제의 시간대를 따르고 있다는 뜻이다. 나는 도커를 사용하기 때문에 시간대가 UTC로 설정이 되어있는 것 같다.
- 만약 도커를 사용하지 않고 그냥 MySQL을 사용한다면
SET GLOBAL time_zone = 'Asia/Seoul';
이 쿼리를 날려 해결할 수 있을 것이다.
- 하지만 나처럼 도커 위의 MySQL이라면 컨테이너 실행시에 환경변수를 추가해주면 된다.
나는 docker-compose파일에
environment: -TZ=Asia/Seoul
이라는 설정을 추가하고 컨테이너와 이미지를 모두 삭제한 뒤 재실행했다.
-
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을 명시해주면 된다.
