2023-05-15 15:18:49 [ALERT] (1) : parsing [/usr/local/etc/haproxy/haproxy.cfg:20] : 'server mongo1' : could not resolve address 'mongo1'. 2023-05-15 15:19:09 [ALERT] (1) : parsing [/usr/local/etc/haproxy/haproxy.cfg:21] : 'server mongo2' : could not resolve address 'mongo2'. 2023-05-15 15:19:29 [ALERT] (1) : parsing [/usr/local/etc/haproxy/haproxy.cfg:22] : 'server mongo3' : could not resolve address 'mongo3'. 2023-05-15 15:19:29 [ALERT] (1) : Failed to initialize server(s) addr.
haproxy 에러 내용
haproxy로 mongodb replica set을 위한 load balancer를 만드는 도중 위와 같은 오류를 만났습니다.
haproxy 에러 원인
server 뒤에는 hostname 등이 와야 하는데 mongo1을 통해서 해당 이름의 컨테이너에 접근할 수 없는 상태입니다.
이는 같은 networks 안에 넣어주지 않아서 그렇습니다. 따라서 container 이름으로 컨테이너를 찾을 수 없었습니다.
haproxy 해결 방법
다음과 같이 서버와 로드 밸런서를 같은 network에 넣어 줍시다.
# Use root/example as user/password credentials
version: "3.8"
services:
mongo1:
image: mongo
container_name: mongo1
restart: always
ports:
- "4001:27017"
environment:
- .env
volumes:
- ./mongo1:/data/db
- ./mongodb.conf:/etc/mongodb.conf
networks:
- mongo-net
command: mongod --config /etc/mongodb.conf
mongo2: 위와 동일
mongo3: 위와 동일
haproxy:
image: haproxy:2.4
restart: always
container_name: haproxy
ports:
- 3015:27017
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
networks:
- mongo-net
networks:
mongo-net:
driver: bridge
사용한 haproxy 설정 파일은 다음과 같습니다.
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend mongo_frontend
bind *:27017
mode tcp
option tcplog
default_backend mongo_backend
backend mongo_backend
mode tcp
balance roundrobin
server mongo1 mongo1:27017 check
server mongo2 mongo2:27017 check
server mongo3 mongo3:27017 check
만약 윈도우에서 설정 파일을 만들면 다음과 같은 오류가 날 수 있습니다.
parsing [/usr/local/etc/haproxy/haproxy.cfg:23]: Missing LF on last line, file might have been truncated at position 3.
그러면 docker등의 환경에서 vi 등으로 열어서 저장하여 Line Feed를 추가하도록 합니다.
참고 자료
댓글