[Zookeeper]

Vorhandenheit ·2022년 8월 22일
0

Database

목록 보기
25/28

Zookeeper

회사 시스템에 zookeeper를 사용하여서 알아보는겸 찾아보았습니다. zookeeper란 분산 시스템을 위한 오픈소스 분산 코디네이션 서비스입니다.
여기서 '분산 시스템'이란 복수의 컴퓨터가 네트워크를 통해 통신하며 하나의 목적을 위해서 서로 간에 상호작용하는 걸 의미합니다.

분산 시스템을 구성할 경우 나타나는 문제는
- 분산된 시스템 간에 정보를 어떻게 공유할 것인가
- 클러스터에 있는 서버들의 상태를 어떻게 체크 할 것인가
- 분산된 서버들 간에 동기화를 위한 락을 어떻게 처리할 것인가
입니다. 이 문제를 해결하는 시스템을 코디네이션 시스템이라고 합니다.

CAP
Consistency(일관성)은 모든 노드가 같은 순간에 같은 데이터를 볼 수 있다는 것, Availability(가용성)은 성공, 실패 여부와 상관없이 요청에 대한 결과를 반환할 수 있다는 것, Partition-tolerance(분할 내성)은 메세지 전달이 실패하거나 일부 시스템에 문제가 생기더라도 전체 시스템이 원활하게 동작할 수 있음을 의미합니다.

주키퍼의 경우 CAP 중 시스템의 일관성과 가용성을 극대화합니다(CA)

2. 특징

  • 네임 스페이스를 통한 부하분사
  • 분산락이나 동화 문제 해결
  • 장애상황 판단 및 복구

3. 구성

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

znode는 데이터를 저장할 수 있는 디렉토리 구조를 제공하며, 디렉토리와 비슷한 구조로 byte[] 형태의 정보를 저장합니다.

  • Persistent Node : 노드에 데이터를 저장하면 일부러 삭제하지 않는 이상 삭제되지 않고 영구히 저장
  • Ephemeral Node : 노드를 생성한 클라이언트의 세션이 연결되어있을 경우만 유효, 클라이언트 연결이 끊어지는 순간에 삭제
  • Sequence Node : 노드를 생성할 떄 자동으로 Seqeuence 번호가 붙는 노드

주키퍼는 이 Znode를 이용해서 데이터를 트리로 관리합니다.

Watcher

클라이언트가 znode에 watch를 걸어놓으면 해당 znode가 변경되었을 때 클라이언트로 callback 호출을 날려서 클라이언트에 해당 znode가 변경되었음을 알려주고 해당 watcher는 삭제됩니다.

4. 사용

  • 모듈 설치
npm install node-zookeeper-client

가. createClient(connectionString, [options])

createClient메소드를 사용해서 클라이언트를 인스턴스화합니다.
- connectionString : 접속할 주키퍼 서비스의 hostname과 port를 문자열 형식으로 넣어줍니다.
- options : {
sessionTimeout : 기본 값은 30초, 클라이언트로부터 응답이 없을 때 세션이 끊어졌음을 설정하는 시간입니다.
spinDelay : 각 연결 시도간 지연을 설정합니다.
retries: 재시도횟수를 설정합니다.
}

나. getChildren(path, p[], callback)

자식 node들의 리스트를 얻습니다.

다. getData(paht, data, [version], callback

znode의 데이터를 불러옵니다

라. setData()

znode에 data를 설정합니다.

마. delete()

znode를 삭제합니다.

바. exists()

znode가 있는 지 확인합니다.

출처

https://yooloo.tistory.com/102?category=991463
https://tjsdud4634.tistory.com/1
https://brunch.co.kr/@timevoyage/77

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글