도커를 이용하여 PostgreSQL을 Build 후 해당 DB의 데이터를
Logstash를 이용하여 Elasticsearch와 연동하는 과정에서 생긴 에러이다.
[ERROR][logstash.inputs.jdbc ][main][01b8fcd4a63cf0b14c82113572d5c31371649609a57c0007cc38eb353a2e434e] Unable to connect to database. Tried 1 times {:error_message=>"Java::OrgPostgresqlUtil::PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections."}
에러내용은 db에 연결이 거부되었다는 것이고 아래 conf 파일에서 IP를
127.0.0.1이나 0.0.0.0을 사용해보기도 했고, 외부 아이피를 입력도 해보았으나 실패했다.
# logstash.conf
input {
jdbc {
jdbc_connection_string => "jdbc:postgresql://{IP 주소}/{Database 이름}"
jdbc_user => "{DB 유저 이름}"
jdbc_password => "{DB 비밀번호}"
jdbc_driver_class => "org.postgresql.Driver"
# Docker build 시 복사한 드라이버 주소
jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/postgresql-42.5.4.jar"
statement => "{실행할 SQL 구문}"
# 스케줄러
schedule => "* * * * *"
}
}
# filter{}
output {
elasticsearch {
hosts => "http://elasticsearch:9200"
index => "{인덱스 이름}"
document_id => "%{id}"
doc_as_upsert => true
}
}
해당 DB는 GCP 인스턴스 상에서 구동했으며,
내 컴퓨터에서 GCP 아이피를 이용하여
pgadmin 연결이 잘 되었기에 도커 때문에 발생하는 일이라고 판단했다.
그리고 도커에서 해당 컨테이너의 네트워크를 확인하여 배정받은 내부 IP 주소를
conf에 입력 후 Build를 하여 문제를 해결할 수 있었다.
아래의 명령문을 통해서 컨테이너의 네트워크 정보를 확인
# 사용중인 네트워크 확인
$ docker network ls
# 네트워크의 세부정보 확인
$ docker network inspect {네트워크 ID}
# 네트워크 세부 정보
[
{
"Name": "-",
"Id": "91cfd8e4116cfcedcee046b1899959688bb2c6fd9dbe1e18af865657f7ebb72b",
"Created": "2023-02-22T07:59:31.661814819Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "192.168.208.0/20",
"Gateway": "192.168.208.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"1dad0d41eb7806be7c13d7cc6fe880b2d83873bbdb169ac2576711e0253e0273": {
"Name": "celery-beat",
"EndpointID": "-",
"MacAddress": "-",
"IPv4Address": "192.168.208.6/20",
"IPv6Address": ""
},
"31f9061d6d8925863b701bcf110bad85d68b32dcc472e68fe767b6cffa382ab2": {
"Name": "celery-worker",
"EndpointID": "-",
"MacAddress": "-",
"IPv4Address": "192.168.208.5/20",
"IPv6Address": ""
},
"8c6bb8a72a525457498adc688be18b823f01c63efc08187ba92a7636dd22339a": {
"Name": "pgdb",
"EndpointID": "-",
"MacAddress": "-",
"IPv4Address": "192.168.208.3/20",
"IPv6Address": ""
},
"a91b55af3ebff4ea7c52e59bbe947399a162f46b12727655bd876f3a5c53d9eb": {
"Name": "django",
"EndpointID": "-",
"MacAddress": "-",
"IPv4Address": "192.168.208.4/20",
"IPv6Address": ""
},
"c48142e77cbc0ab2c1efdaf75b3e9d9218ff8afe46bb6e882be5d3caa2e706a2": {
"Name": "rabbitmq",
"EndpointID": "-",
"MacAddress": "-",
"IPv4Address": "192.168.208.2/20",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "-",
"com.docker.compose.version": "2.16.0"
}
}
]
위 정보에서 pgdb가 가지고 있는 IP주소를 이용하여 logstash.conf를 작성하여 해결
✽ DB와 ELK Stack이 전부 같은 네트워크를 이용하고 있어야 하고, DB의 IP는 해당 네트워크를 기반으로 작성해야 한다.
+ 추가적으로 컨테이너 내부 배정 IP는 동적으로 변하는 IP기 때문에, 추천되는 방식이 아니고,
-> 192.168.208.4:8000라는 서비스를 이용시, django:8000과 같은 방식으로 네트워크를 이용해야 한다.
반응형
'Observability > Elastic' 카테고리의 다른 글
[Elastic APM] APM Index 날짜 별 관리 (0) | 2024.06.04 |
---|---|
[ELK/EFK] 로그 수집 - Filebeat / Logstash / Fluentd / Fluent-bit (0) | 2024.03.20 |
[ELK] Kubernetes 환경에서 Elasticsearch / Kibana 설치 (0) | 2024.02.21 |
[ELK] Elasticsearch (0) | 2024.01.14 |