HiveServer2 고가용성(HA) 아키텍처 구축
Cloudera 환경에서 여러 HiveServer2로 클라이언트 연결을 분산하기 위해 HAProxy를 사용했습니다. 클라이언트는 공통 주소에 접속하고, HAProxy가 뒤의 HiveServer2 인스턴스로 연결하는 구성입니다.
아래 내용은 당시 설정을 정리한 것으로 호스트명은 예시로 바꿨습니다. 연결을 분산하는 것과 실행 중인 쿼리를 장애 후 이어가는 것은 다른 문제라는 점도 함께 봐야 합니다.
HAProxy 설치와 TCP 연결 분산
HAProxy를 실행할 서버에 패키지를 설치하고 설정 파일을 엽니다.
yum install haproxy
vi /etc/haproxy/haproxy.cfg당시 사용한 TCP 연결 설정은 다음과 같습니다. 프런트 포트는 10001, 각 HiveServer2의 포트는 10000입니다.
listen hiveserver2 :10001
log 127.0.0.1:514 local2
mode tcp
option tcplog
balance source
timeout client 5m
timeout server 5m
server hiveserver2_1 hs2-1.example.internal:10000
server hiveserver2_2 hs2-2.example.internal:10000balance source는 출발지 IP를 기준으로 서버를 선택하는 해시 방식입니다. 라운드로빈과는 다릅니다. 여러 사용자가 같은 클라이언트 서버에서 접속하면 같은 출발지 IP로 묶일 수 있으므로 접속 분포도 함께 확인해야 합니다.
위 예시는 당시 사용한 HiveServer2 TCP 전송을 위한 것입니다. 모든 Hive JDBC 연결이 TCP 프록시 구성만 사용하는 것은 아닙니다. 전송 모드와 사용 중인 HAProxy 버전에 맞는 구문도 확인해야 합니다.
rsyslog 로그 설정
연결 오류를 확인할 수 있도록 HAProxy 로그를 파일에 남겼습니다. 위 설정에서 사용하는 local2를 rsyslog 출력과 연결합니다.
vi /etc/rsyslog.d/haproxy.conflocal2.* /var/log/haproxy.logservice rsyslog restart프록시 로그가 있으면 어느 연결에서 문제가 있었는지 확인할 수 있습니다. 쿼리 자체의 실행 오류와 프록시 연결 오류는 HiveServer2 로그와 함께 비교해야 합니다.
Cloudera Manager와 클라이언트 설정
Cloudera Manager에서 HiveServer2 역할을 여러 서버에 추가하고, Hive의 Load Balancer 설정에 HAProxy의 호스트와 포트를 지정했습니다. 클라이언트 JDBC 연결도 개별 서버 대신 공통 주소를 사용하도록 바꿨습니다.
hs2-proxy.example.internal:10001이 구성은 접속 주소를 공통화하고 여러 인스턴스로 연결을 나누는 부분입니다. 기존 세션과 실행 중 쿼리가 다른 서버로 자동 이전되는 것은 아닙니다. 위 설정에는 별도의 상태 검사와 HAProxy 자체의 이중화도 포함하지 않았습니다.
통계 화면을 사용할 때는 관리용 접근 범위와 인증 설정을 별도로 정해야 합니다. 당시 기록에 있던 기본 계정 예시는 공개용 설정에서 제외했습니다.