본문 중간의 쿠팡 추천 상품 구매시 쿠팡 파트너스에서 일정액의 수수료를 제공받습니다.

PostgreSQL 클라이언트에서 여러 호스트를 지정할 때 load_balance_hosts는 접속 후보를 어떤 순서로 시도할지 정하는 libpq 옵션입니다. 이름 때문에 쿼리를 여러 서버로 나누는 기능처럼 보일 수 있지만, 공식 문서 기준으로는 연결이 성공한 뒤에는 그 연결의 모든 쿼리가 같은 서버로 전송됩니다.
결론부터 말하면 여러 PostgreSQL 서버 후보가 있고, 새 연결이 여러 곳으로 자연스럽게 퍼지길 원할 때만 load_balance_hosts=random을 검토하면 됩니다. 단일 연결 안에서 읽기 요청을 분산하거나 장애 조치 정책을 완성하는 옵션은 아니므로 target_session_attrs, 커넥션 풀, 애플리케이션 재시도 정책과 역할을 분리해서 봐야 합니다.
load_balance_hosts는 무엇을 바꾸나
libpq는 host, hostaddr, port에 쉼표로 구분한 여러 후보를 받을 수 있습니다. 기본 동작에서는 후보가 적힌 순서대로 접속을 시도하고, 한 호스트명이 여러 주소로 해석되면 DNS나 hosts 파일에서 받은 주소 순서대로 시도합니다. 연결이 성공하면 남은 후보는 더 이상 시도하지 않습니다.
load_balance_hosts=random은 이 후보 순서를 무작위로 섞습니다. 그래서 여러 프로세스나 여러 애플리케이션 인스턴스가 동시에 새 연결을 열 때, 모든 연결이 첫 번째 호스트에 몰리는 현상을 줄이는 데 사용할 수 있습니다.

사용 전제는 다중 host 또는 다중 주소다
이 옵션은 후보가 하나뿐이면 실질적인 이점이 거의 없습니다. PostgreSQL 공식 문서는 이 옵션이 여러 host 이름을 지정했거나, 하나의 DNS 레코드가 여러 IP를 반환하는 상황에서 주로 쓰인다고 설명합니다.
postgresql://app@example-a:5432,example-b:5432/service?load_balance_hosts=random
host=example-a,example-b port=5432 dbname=service load_balance_hosts=random
키워드/값 형식에서는 host, hostaddr, port가 쉼표 목록을 받을 수 있습니다. 여러 값을 함께 쓰는 경우 각 위치가 서로 대응해야 하며, 예외적으로 포트가 하나만 지정되면 모든 호스트에 같은 포트가 적용됩니다.
disable과 random 차이
| 값 | 동작 | 적합한 상황 |
|---|---|---|
disable |
기본값. host는 입력 순서대로, 주소는 해석된 순서대로 시도한다. | 우선순위가 분명한 primary 후보, 순차 failover 의도가 있는 설정 |
random |
host와 주소 후보를 무작위 순서로 시도한다. | 여러 새 연결을 여러 서버로 퍼뜨리고 싶은 설정 |
random은 통계적으로 분산을 기대하는 방식입니다. 공식 문서는 무작위 특성상 완전히 균등한 분포를 보장하지 않으며, 호스트별 주소 개수가 다르면 연결 수가 기울 수 있다고 설명합니다. 같은 호스트명을 목록에 여러 번 넣으면 더 큰 서버에 더 많은 연결이 가도록 의도적으로 가중치를 줄 수도 있습니다.

target_session_attrs와 같이 볼 때
target_session_attrs는 연결이 허용될 서버의 성격을 고르는 옵션입니다. 예를 들어 read-write는 기본적으로 쓰기 트랜잭션을 받을 수 있는 세션을 요구하고, standby는 hot standby 상태인 서버를 요구합니다. load_balance_hosts는 후보 순서를 섞고, target_session_attrs는 연결된 후보가 요구 조건에 맞는지 판단한다고 나누어 이해하면 됩니다.
host=pg-a,pg-b,pg-c dbname=service target_session_attrs=standby load_balance_hosts=random
이 조합은 standby 후보들 사이에서 새 연결을 분산하려는 경우에 의미가 있습니다. 반대로 반드시 특정 primary를 먼저 시도해야 하는 설정이라면 random은 의도와 맞지 않을 수 있습니다.
환경변수로도 지정할 수 있다
PostgreSQL libpq 환경변수 목록에는 PGLOADBALANCEHOSTS가 있으며, 이 값은 load_balance_hosts 연결 파라미터와 같은 역할을 합니다. 단순 스크립트나 운영 환경에서 기본값을 주고 싶을 때 사용할 수 있지만, 애플리케이션별 정책이 다르면 연결 문자열 안에 명시하는 편이 더 읽기 쉽습니다.
PGLOADBALANCEHOSTS=random
PGTARGETSESSIONATTRS=standby
주의할 점
load_balance_hosts=random은 연결 시점 옵션입니다. 이미 열린 하나의 연결에서 쿼리마다 서버를 바꾸지 않고, 서버 상태를 계속 모니터링해서 자동으로 새 연결을 옮기는 기능도 아닙니다. 연결이 끊긴 뒤 다시 연결을 열 때는 그 시점의 후보 순서와 조건에 따라 다시 선택됩니다.
또 인증 실패가 발생하면 남은 호스트를 계속 시도하지 않는다는 다중 host 규칙도 중요합니다. 네트워크 연결 실패와 달리, 인증 자체가 틀린 경우에는 다른 후보로 넘어가 문제를 숨기는 방식으로 동작하지 않습니다.

선택 기준
- 후보 목록에 명확한 우선순위가 있으면 기본값인
disable을 유지한다. - 여러 애플리케이션 인스턴스가 새 연결을 자주 만들고 후보 서버가 동등하면
random을 검토한다. - read-only 또는 standby 같은 서버 성격까지 제한해야 하면
target_session_attrs와 함께 쓴다. - 장기 연결이 많은 서비스라면 커넥션 풀의 재사용 방식까지 같이 확인한다.
자주 묻는 질문
load_balance_hosts=random이면 쿼리가 여러 서버로 나뉘나
아닙니다. 연결이 성공한 뒤에는 그 연결에서 실행하는 모든 쿼리가 같은 서버로 전송됩니다. 이 옵션은 새 연결을 만들 때 후보를 시도하는 순서를 바꾸는 기능입니다.
단일 DNS 이름이 여러 IP를 반환해도 의미가 있나
의미가 있을 수 있습니다. 공식 문서는 하나의 호스트명이 여러 네트워크 주소로 해석되는 경우에도 후보 주소를 시도한다고 설명하며, random은 이런 주소 후보의 순서에도 영향을 줍니다.
항상 random이 더 좋은가
그렇지 않습니다. 첫 번째 호스트를 우선 사용하고 장애 시에만 다음 후보로 넘어가려는 설정에서는 기본 순서가 더 명확합니다. 후보 서버가 같은 역할을 하고 새 연결을 분산하려는 목적일 때 random이 맞습니다.
정리
load_balance_hosts는 PostgreSQL 서버가 아니라 libpq 클라이언트가 접속 후보를 고르는 방식입니다. 기본값은 순차 시도이고, random은 여러 호스트나 여러 주소 후보를 무작위 순서로 시도합니다.
실무에서는 “연결 후보를 퍼뜨릴 것인가”와 “어떤 성격의 서버만 허용할 것인가”를 나누어 결정하면 됩니다. 전자는 load_balance_hosts, 후자는 target_session_attrs가 담당하고, 쿼리 단위 분산이나 장애 조치 정책은 별도의 연결 관리 설계로 다루는 편이 안전합니다.
'프로그래밍 > 서버, DBMS' 카테고리의 다른 글
| PostgreSQL sslcertmode 기준 정리 (0) | 2026.08.12 |
|---|---|
| PostgreSQL require_auth 기준 정리 (1) | 2026.08.08 |
| PostgreSQL gssencmode 기준 정리 (0) | 2026.07.29 |
| PostgreSQL sslrootcert 기준 정리 (0) | 2026.07.27 |
| PostgreSQL sslnegotiation 기준 정리 (0) | 2026.07.22 |





