요즘에는 많이 사용하는 어플리케이션은 아니지만 종종 L3DSR을 간편하게 구현하기 위해서 LVS ldirectord를 이용한 LB(Load Balancing)구성을 하는 경우가 있다.

주로 오래된 시스템을 LVS 밸런싱 서버로 사용하곤 했는데 최근에 RHEL/CentOS 6 기준으로 설정하다보니 특이한 증상이 발견되어서 이에 대해서 간단히 해결책을 정리해 본다.

환경

OS: RHEL/CentOS 6.x
Package:
  - heartbeat: 3.0.4-2.el6
  - ldirectord: 3.9.6-1.fc22.x86_64

참고로, ldirectord의 경우 RHEL/CentOS 6부터 기본 패키지에서 빠졌기 때문에 fedora core 22 버전의 패키지를 사용하면 된다

증상

ldirectord를 이용해서 L3DSR 밸런싱을 구성하여 웹 서비스를 동작시켰는데 해당 서버들의 응답속도가 300ms 이상 느려지는 현상이 발생 하였다. 구형 장비보다 더 높은 사양과 비교적 더 최근 버전을 사용하는데 서비스 할 수 없을 만큼 속도가 나오지 않았다.

심지어 노드간의 균형이 맞지 않는 증상은 Bonus.

  • 응답속도의 지연: 100ms 이상. 심하면 500ms도 넘어간다. (미쳤다)
  • 노드 불균형: 스케줄러를 rr(round robin)로 설정했는데 응답속도의 지연이 발생하다보니 불균형 발생.

해결

해당 증상을 일으키는 요인은 Redhat이 권장하지 않는 패키지를 설치한 내가 잘못이다. 좀더 끝까지 파고들지는 못했으나 노드에 오고가는 패킷을 보니 재전송이 빈번하게 발생하는 것을 보았고 이 증상을 바탕으로 문서들을 검색해 본 결과 이 글에서 보여지는 증상과 꽤나 유사해서 GRO(generic-receive-offload)를 꺼봤더니 해결.

  • GRO는 RHEL/CentOS 6에서 소개된 기능으로 LRO (Large Receive Offload)와 유사한 형태로 들어오는(inbound) 트래픽을 보다 CPU 리소스 소모 없이 처리하는 기법이다.

따라서, 아래와 같이 설정하면 된다

# GRO 끄기
$ sudo ethtool -K eth0 gro off

# 부팅 때 마다 적용
echo "ethtool -K eth0 gro off" >> /etc/rc.local

결론

지금까지 heartbeat+ldirectord 환경을 운영하면서 다양한 증상을 겪어보았는데 이제는 ldirectord를 떠나보내 줄 때가 된 것 같다. 말도 많고 탈도 많은 ldirectord를 떠나보내고 KeepalivedHAProxy, Pen 등을 사용하도록 하자. (돈이 많으신 분은 네트워크 밸런서를 구매하시고)

그래도, 습관이 어디 가겠냐만…