비교
Zookeeper
장점
가장 오래 된 프로젝트
가장 신뢰성 높음
기술적으로 완성도 높음
많은 큰 회사들이 이미 사용하고 있음 (우리 회사, 특히 우리 팀 포함)
파일 시스템과 비슷해서 이해하기 쉬운 데이터 저장 구조
풍부한 기능 보유
단점
자바 기반으로 경쟁자들에 비해 무겁고 많은 자원을 필요로 함
복잡함
사용 용도에 따라 필요한 기능보다 불필요한 기능이 더 많은 경우가 존재
서비스 및 클라이언트 모두에게 무거운 dependency가 얹어짐
동적으로 노드를 확장하기 어려움
구버전에서는 무조건 주키퍼를 재시작해야만 했음
3.5.0 이후 버전부터는 동적 확장 가능
그러나 2016년 11월 기준으로 3.5.0이 아직 stable 버전이 아님
primitive 값만 저장 가능
Etcd
장점
설치, 배포 및 사용이 쉬움
신뢰성 있는 데이터 저장, 제공
훌륭한 문서를 가짐
가볍고 간단함
꼭 필요한 서드파티들의 조합으로 작게 시스템 구축 가능
Raft 알고리즘
단점
주키퍼에 비해서 상대적으로 짧은 기간동안 검증됨
첫 릴리즈가 2014년
primitive 값만 저장 가능
Consul
장점
gossip + Raft 알고리즘
Service discovery 시스템을 자체적으로 내장
DNS, HTTP 인터페이스 선택 사용
multiple datacenters 지원
손 쉬운 노드 추가
자체적인 UI 제공
서비스 단위로 데이터 저장 가능
단점
etcd보다도 짧은 역사를 가짐
Eureka
고민거리
CP vs AP (CAP 이론)
Eureka 문서를 보다보면 Service discovery 측면에서는 CP보단 AP가 낫다는 말을 여러 번 찾아볼 수 있다. service discovery는 잘못된 정보가 섞여있을 수 있더라도 어쨌든 데이터를 받는게 아예 못받는 것 보다는 낫다는 주장인데... 예를 들어 Zookeeper의 경우 Split brain 이 발생하면 나눠진 partition 중 quorum 만큼의 갯수를 충족하지 못한 partition에 속한 node의 client들은 모두 zookeeper connection을 잃어버리고 당연히 service discovery도 불가능하게 되는건 사실이다. 그렇게 되면 그 클라이언트들은 모두 서비스를 정상적으로 이용할 수 없게 되는 셈이다.
한편 좀 더 고민해보면 client에선 connection이 끊어지면 설정에 있는 다른 zookeeper 주소로 연결을 시도할 것이고 그 중에 정상 partition에 속한 서버가 있다면 정상적으로 서비스 이용이 가능할 것이라는 생각도 든다. 이 상황에서 문제점은 클라이언트가 살아있는 서버를 찾아서 접속하는데 걸리는 시간만큼 시간이 더 소요될 수 있다는 것과 config에 다른 주소가 저장되어있지 않은 상황이라면 클라이언트가 서비스를 정상적으로 이용할 수 없다는 것이고, 장점은 언제나 정확한 현재 서비스 상태를 제공받을 수 있다는 것이다.
양쪽 다 일장일단이 있어 어느 것이 정답이라고 딱 잘라 말하기가 쉽지 않다.
Last updated