본문 바로가기
Observability/Logs

[ELK] Logstash - Postgresql 연결 실패 (Docker Network)

by dev_ss 2023. 2. 24.

도커를 이용하여 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과 같은 방식으로 네트워크를 이용해야 한다.

반응형