개발/Infra

[Infra] Zookeeper

hojak99 2018. 9. 27. 15:05

Zookeeper

이번에 회사 CTO 님이 주키퍼를 회사 서버에 한 번 설치해보라고 하셔서 주키퍼에 대해서 알아보았다. 네이버 D2 에 아주 이해하기 쉽게 설명이 되어있다. 조금 길어서 필자는 간단하게 정리를 해보았다.

주키퍼란 쉽게 말해서 분산 처리 환경에서 사용 가능한 데이터 저장소 라고 말할 수 있다 - 네이버 D2(https://d2.naver.com/helloworld/294797)

활용

분산 서버 환경에서 다양하게 활용을 할 수 있는데 예를 들어 분산 서버 간의 정보 공유, 서버 투입/제거 시 이벤트 처리, 서버 모니터링, 시스템 관리, 분산 락 처리, 장애 상황 판단 등 다양한 분야에 활용 할 수 있다고 한다.

저장 구조

주키퍼는 데이터를 디렉토리에 저장한다. 그리고 데이터가 변경되면 클라이언트에게 어떤 노드가 변경됐는지 콜백을 통해 알려준다. (여기서 노드가 나오는데 조금 뒤에 설명을 하도록 하겠다) 그리고 데이터를 저장할 때 해당 세션이 유요한 동안 데이터가 저장되는 Ephemeral Node 가 존재하고, 데이터를 저장하는 순서에 따라 자동으로 sequence number 가 붙는 Sequence Node 가 존재한다.

주키퍼에서 데이터는 아래와 같은 디렉토리 구조로 데이터를 저장한다고 한다. 각각의 디렉토리노드를 znode 라고 명명하며, 한 번 설정되면 이름을 변경 할 수 없다. 그리고 데이터를 저장하는 기본 단위인 노드로 Persistent Node 와 Ephemeral NodeSequence Node 로 3가지가 있다.

directory

특징을 살펴보면 Persistent 를 유지하기 위해 트랜잭션 로그와 스냅샷 파일이 디스크에 저장되어 시스템을 재식자해도 데이터가 유지된다.

  • Persistent Node : 한 번 저장되고 나면 세션이 종료되도 삭제되지 않고 유지되는 노드.
  • Ephemeral Node : 특정 노드를 생성한 세션이 유요한 동안 그 노드의 데이터가 유요한 노드. 주키퍼 서버에 접속한 클라이언트가 특정 노드를 Ephemeral Node로 생성했다면 클라이언트와 서버 간 세션이 끊겼을 때 해당 노드는 자동으로 삭제된다. 이 기능으로 클라이언트가 동작하는지 알 수 있다.
  • Sequence Node 는 노드 생성 시 sequence number 가 자동으로 붙는 노드이다. 해당 기능을 이용해 분산 락 등을 구현할 수 있다고 한다.

서버 구성도

server

네이버 D2 에서는 "일반적으로 주키퍼 서버는 3대 이상을 사용하며 서버는 홀수로 구성한다" 라고 이야기를 했다. 이 이유는 서버 간의 데이터 불일치가 생겼을 때 데이터 보정이 필요한데 이 때 과반수의 룰을 이용해 적용하기 때문에 홀수로 구성하는 것이 데이터 정합성 측면에서 유리하다고 나와있다.

그리고 주키퍼 서버는 사진처럼 Leader 와 Follower 로 구성 돼 있는데 서버들끼리 자동으로 선정해 아래와 같이 Leader 가 모든 데이터 저장을 주도한다.

Server(Follower)  -->  Server(Leader)   -->   나머지 Server(Follower)

그리고 모든 서버에 동일한 데이터가 전달이 되면 클라이언트에게 성공/실패 여부를 알려주는 동기 방식으로 작동한다.

그리고 주키퍼를 사용하려면 읽기/쓰기 비율을 10:1 이상으로 해야한다고 한다.

반응형