회사 시스템에 zookeeper를 사용하여서 알아보는겸 찾아보았습니다. zookeeper란 분산 시스템을 위한 오픈소스 분산 코디네이션 서비스입니다.
여기서 '분산 시스템'이란 복수의 컴퓨터가 네트워크를 통해 통신하며 하나의 목적을 위해서 서로 간에 상호작용하는 걸 의미합니다.
분산 시스템을 구성할 경우 나타나는 문제는
- 분산된 시스템 간에 정보를 어떻게 공유할 것인가
- 클러스터에 있는 서버들의 상태를 어떻게 체크 할 것인가
- 분산된 서버들 간에 동기화를 위한 락을 어떻게 처리할 것인가
입니다. 이 문제를 해결하는 시스템을 코디네이션 시스템이라고 합니다.
CAP
Consistency(일관성)은 모든 노드가 같은 순간에 같은 데이터를 볼 수 있다는 것, Availability(가용성)은 성공, 실패 여부와 상관없이 요청에 대한 결과를 반환할 수 있다는 것, Partition-tolerance(분할 내성)은 메세지 전달이 실패하거나 일부 시스템에 문제가 생기더라도 전체 시스템이 원활하게 동작할 수 있음을 의미합니다.
주키퍼의 경우 CAP 중 시스템의 일관성과 가용성을 극대화합니다(CA)
Zookeeper Service는 'Ensemble'이라고 불리는 Host들의 집합들을 통해서 복제되며, 서버들의 복제된 그룹을 'Quorum'이라고 부릅니다.
Ensemble : 3 대 이상의 주키퍼 서버를 하나의 클러스터로 구성한 ha 아키텍처
LeaderServer : Ensemble 안에 유일한 리더 서버가 선출되어 존재하며, 클라이언트의 요청을 받은 서버는 해당 요청을 리더 서버에 전달하고, 리더 서버는 모든 팔로워 서버에게 클라이언트 요청이 전달되도록 보장합니다.
Follower Server : Ensemble 안에 한 대의 리더 서버를 제외한 나머지 서버로서, 리더 서버와 메세지를 주고받으면서 Znode의 데이터를 동기화하고 리더 서버에 문제가 생기면 내부적으로 새로운 리더를 선출하는 역할을 수행합니다.
- Client Port : 클러스터에서 운영할 어플리케이션에 Zookeeper로 접속하기 위한 포트를 의미합니다.
- Qourum Port : 클러스터내의 Zookeeper 서버간에 통신을 위한 포트를 의미합니다.
- Leader election Port : 클러스터내의 Zookeeper 서버간에 Leader를 선출하기 위한 통신 포트를 의미합니다.
znode는 데이터를 저장할 수 있는 디렉토리 구조를 제공하며, 디렉토리와 비슷한 구조로 byte[] 형태의 정보를 저장합니다.
주키퍼는 이 Znode를 이용해서 데이터를 트리로 관리합니다.
클라이언트가 znode에 watch를 걸어놓으면 해당 znode가 변경되었을 때 클라이언트로 callback 호출을 날려서 클라이언트에 해당 znode가 변경되었음을 알려주고 해당 watcher는 삭제됩니다.
npm install node-zookeeper-client
createClient메소드를 사용해서 클라이언트를 인스턴스화합니다.
- connectionString : 접속할 주키퍼 서비스의 hostname과 port를 문자열 형식으로 넣어줍니다.
- options : {
sessionTimeout : 기본 값은 30초, 클라이언트로부터 응답이 없을 때 세션이 끊어졌음을 설정하는 시간입니다.
spinDelay : 각 연결 시도간 지연을 설정합니다.
retries: 재시도횟수를 설정합니다.
}
자식 node들의 리스트를 얻습니다.
znode의 데이터를 불러옵니다
znode에 data를 설정합니다.
znode를 삭제합니다.
znode가 있는 지 확인합니다.
https://yooloo.tistory.com/102?category=991463
https://tjsdud4634.tistory.com/1
https://brunch.co.kr/@timevoyage/77