1. 문제점

물리 서버가 클라우드로 바뀌면서 오토스케일링 등의 이유로 서비스 IP가 동적으로 바뀌는 일이 잦아졌다.

Client 나 API 게이트웨이가 서버의 IP, port 를 이용하여 서비스를 찾아야하기에 동적으로 바뀐 서비스 IP를 찾을 수 있는 방법이 필요해졌고, 그 필요에 의해 나오게 된 것이 Service Discovery이다.

사실 DNS와 유사하다.

각 instance 의 정보를 보관해야하기때문에 항상 업데이트된정보가 요구되므로 고가용성이 필요하다.


2. Service Discovery

Service Discovery 에는 2가지 방법이 있다.

  • Client-Side 방식 : 서비스 IP를 클라이언트가 찾는 방식, 즉 클라이언트가 Service Registry에 위치를 물어봐서 직접 서비스 인스턴스를 찾아간다.
  • Server-Side 방식 : 서비스 IP를 서버가 찾는 방식, 즉 Load Balancer로 던지고 Load Balancer가 포워드한다.

이 둘은 장단점이 있으므로 아래에서 조금더 자세히 다뤄본다.


3. Client-Side Service Discovery

 

위그림처럼 Client가 Service Registry 에서 직접 서비스의 IP를 찾고 로드 밸런싱한다.

각각의 Service instance는 자신의 IP를 Service Registry에 저장하며 (서비스가 시작될 때 registry에 저장하고 인스턴스가 종료되면 registry에 저장된 정보가 삭제됨), registry 는 해당 IP 를 지속적으로 체크하여 정상인지 확인을 한다.

Client가 Service Registry에 저장된 정보를 이용하여 하나의 Instance 에 접속하는 방식으로 로드밸런싱이 가능하다.

  • 장점 : Discovery 를 Client 가 직접 하기때문에 로드밸런싱 방식을 서비스에 맞게 각자 구현할 수 있다.
  • 단점 : 서비스마다 구현하므로 종속성이 있어 차후 추가 개발시 어려울 수 있다.  

4. Server-Side Service Discovery

Client가 요청을 보내면 LB가 받은 후 Service Registry 에서 Service Instance 의 IP 정보를 찾는 방식이다.

Client-Side 와 동일하게 각 Service Instance 는 IP 정보를 Service Registry 에 저장해놓는다.

LB가 Registry에 저장된 정보를 이용하여 수행가능한 Instance 에게 요청을 라우팅해주는 방식으로 로드밸런싱된다.

  • 장점 : Client 에 디스커버리 로직을 구현할 필요가 없다.
  • 단점 : LB 에  장애가 발생시 시스템 전체가 안될 수 있으므로 관리가 필요하다.

5. Service Discovery 솔루션

솔루션 언어 방식
Zookeeper Java 구성 정보 유지, 이름 지정, 분산 동기화 제공 및 그룹 서비스 제공을위한 중앙 집중식 서비스이며 Apache 재단의 오픈소스이다. 고가용성을 위하여 앙상블을 사용하고, 카프카 지원, 고성능, 간단한 생성 등의 장점이 있다.
Doozer Go Doozer 는 일관된 분산 데이터 저장소이다. ZooKeeper와 달리 Doozerd는 in-memory 방식으로 실행된다. Paxos 알고리즘을 사용하여 peer간의 현재상태의 consensus 를 도출한다.
Etcd Go Container Linux 클러스터에 대한 공유 구성 및 서비스 검색을 제공하여 시스템 클러스터에 데이터를 저장하는 안정적인 방법을 제공하는 분산 키 값 저장소이다. GitHub에서 오픈 소스 프로젝트로 제공된다. Kubernetes는 etcd 위에 구축되며 전체 클러스터에서 Kubernetes가 사용하는 데이터의 저장 및 복제를 처리한다.
Airbnb SmartStack Ruby 에어 비앤비의 서비스 검색 솔루션이다. Nerve는 ZooKeeper와 Synapse를 사용하여 IP 및 포트를 제공 한 다음 해당 정보를 읽고 로컬 HAProxy 프로세스를 구성하여 각 시스템의 로컬 요청을 적절한 서비스로 라우팅한다.
Netflix Eureka Java Netflix의 중간 계층,로드 밸런싱 및 검색 서비스이다. Eureka 서버는 service registry 이다. AWS의 각 가용 영역에서 하나의 Eureka 서버를 실행하여 클러스터를 구성하는 것이 좋다.
SkyDNS Go RAFT 프로토콜을 사용하며 HTTP 및 DNS를 통한 클라이언트 API를 제공한다. Etcd 및 Spotify의 DNS 모델과 일부 유사하며 실제로 Etcd, go-raft 와 동일한 RAFT 구현을 사용한다.
Consul   확장성이 뛰어나고 가용성이 뛰어난 분산 제품으로 HashiCorp Company 가 개발한 분산형 서비스이다.