HA 를 위한 N+ 서버간 상태정보 복제 방안
상기 제목과 같이 HA (Hight Availability) 구성된 시스템간 상태 정보 복제를 효과적으로 하는 방안을 생각중인데요.
첫번째로는, 멀티캐스트를 이용하는 방법입니다.
각 서버들은 특정 멀티캐스트 그룹에 Join 하고 sender 및 receiver 가 되어 상태정보를 주고 받는데.
이를 구현해놓은 프로젝트로는 http://www.jboss.org/infinispan 를 예로 들 수 있겠습니다.
infinispan 은 신뢰성 있는 UDP 통신을 할 수 있도록 구조가 갖춰져 있는데요.
현재 서버가 netty 기반이라서..실제로는 netty API 를 이용해서 간단히 구현하고자 합니다.
헌데, 여기서 두가지 생각이 듭니다.
첫째. UDP 패킷을 1450byte 가량 이하의 크기로 보낸다고 하였을때
- 패킷 loss
- 패킷 순서 바뀜
의 가능성이 얼마나 될까요?
만약, 가능성이 충분히 존재한다면.. 결국 신뢰성 있는 UDP 통신이 되도록 ACK 구조와, 재전송, 조립 구조등을 갖춰야 할텐데요.
둘째. 그렇다면 굳이 UDP 기반으로 갈 필요 없이 persistance TCP 접속을 이용해서 상태 정보 주고받는것과 성능상 그리 큰 차이 안나지 않을까요.
물론, 서버가 수백, 수천대라면 멀티캐스팅 기반 복제가 훌륭한 방안이겠지만.. 만약 서버가 많아도 5대 미만 정도라면?
가장 적절한 상황을 생각해본다면..
LAN 환경에서 1450 byte 이하의 UDP 패킷이 순서는 바뀔 수 있지만 로스는 없다고 가정해봤을때.
상태 정보를 1450byte 크기로 분할하고 헤더에 상태정보ID, 전체 chunk 갯수, chunk 인덱스 3개 항목을 넣고 바디에 분할된 상태정보를 넣어서.
멀티캐스팅으로 보내기만 하고. 받은 쪽에서는 조립은 하되 ACK 는 안하는걸로 하는건데요.
이렇게 했을때 충분히 안정적이다고 생각할 수 있을까요?
ACK 까지 들어가면 로직이 훨씬 복잡해지고 timeout 처리와 재전송, 중복 판단 등.. 여러가지 고려되어야 하고 그럴바에야 그냥 TCP 기반으로 접속해놓고 주고받아도 서버 몇대 기반에서는 큰 차이 없을것 같다는 생각도 드네요.
댓글 달기