Macan

Apache ZooKeeper 본문

Open Source/Zookeeper

Apache ZooKeeper

Macan 2017. 11. 22. 15:13

ZooKeeper 란 ?



ZooKeeper는 구성 정보를 유지 관리하고 이름을 지정하며 분산 동기화를 제공하고 그룹 서비스를 제공하는 중앙 집중식 서비스 (분산 코디네이터) 이다.


"분산 시스템"이란 복수의 컴퓨터가 네트워크를 통해 통신하며 하나의 목적을 위해 서로 간에 상호작용하는 것을 말한다.

다수의 컴퓨터가 마치 하나인 것처럼 동작하는 시스템인것이다.

분산 시스템을 구성할때 고려해야 할 사항들은 네트워크의 신뢰성, 지연, 대역폭, 안정성, 토폴로지에 대한 고려, 전송 비용, 네트워크 유형 등을 고려해야 하며 분산 서버들 간의 정보 공유, 동기화 분산 서버들의 상태 확인등 또한 필요하다.


분산 컴퓨팅에서 "코디네이션"의 예는 그룹 멤버쉽(Group Membership),  잠금제어(Locking),  공급/구독(Publisher / Subscriber), 리더선정(Leader Election), 동기화(Synchronization) 등이 될 수 있는데 이런 역할을 수행하는 것이 바로 ZooKeeper 이다.


Zookeeper는 클러스터 구성원 간의 데이터 공유를 위한 데이터 스토리지(영속/임시 데이터), 클러스터 멤버쉽 관리를 통한 데이터 변경 통지(Watch), 마스터 및 분산 락 등에 활용되는 시퀀스 노드 등을 제공한다. 이를 통해서 다음에 활용할 수 있다.

1) 설정 관리 (Configuration Management)

2) 분산 클러스터 관리 (Distributed Cluster Management)

3) 명명 서비스 (Naming Service: e.g. DNS)

4) 분산 동기화 (Distributed Synchronization : locks, barriers, queues)

5) 분산 서비스에서 리더 선출 (Leader election in a distributed system)

6) 중앙집중형 신뢰성 있는 데이터 저장소 (Centralized and highly reliable data registry)

Zookeeper는 중앙화된 분산 코디네이터 클러스터라 볼 수 있다.


ZooKeeper는 n개의 서버로 단일 주키퍼 클러스터를 구성하며 이를 서버 앙상블이라고 한다. 클라이언트는 앙상블에 속한 서버에 연결하여 서비스를 사용할 수 있다. 



위의 그림은 ZooKeeper 아키텍쳐 이다.

ZooKeeper 서비스는 복수의 서버에 복제되며, 모든 서버는 데이터 카피본을 저장하고 있다.

리더는 구동 시 ZooKeeper 내부 알고리즘에 의해 자동 선정되며 Followers 서버들은 클라이언트로부터 받은 모든 업데이트 이벤트를 리더에게 전달한다.  클라이언트는 모든 주키퍼 서버에서 읽을 수 있으며, 리더를 통해 쓸 수 있고 과반수 서버의 승인이 필요하다.


아래의 내용은 Naber D2 에서 발췌한 글이다.


ZooKeeper 서버는 일반적으로 3대 이상을 사용하며 서버 수는 주로 홀수로 구성한다. 서버 간의 데이터 불일치가 발생하면 데이터 보정이 필요한데 이때 과반수의 룰을 적용하기 때문에 서버를 홀수로 구성하는 것이 데이터 정합성 측면에서 유리하다.

그리고 ZooKeeper서버는 Leader와 Follower로 구성되어 있다. 서버들끼리 자동으로 Leader를 선정하여 모든 데이터 저장을 주도한다. 


클라이언트에서 Server(Follower)로 데이터 저장을 시도할 때 Server(Follower) -> Server(Leader) -> 나머지 Server(Follower)로 데이터를 전달하는 구조이고, 모든 서버에 동일한 데이터가 저장된 후 클라이언트에게 성공/실패 여부를 알려주는 동기 방식으로 작동한다. 즉, 모든 서버는 동일한 데이터를 각각 가지고 있고, 클라이언트가 어떤 서버에 연결되어 데이터를 가져가더라도 동일한 데이터를 가져가게 된다.

사용/운영 시 몇 가지 주의 사항이 있다. 개발에 급급한 나머지 ZooKeeper를 캐시 용도로 사용해 서비스를 오픈했다가 장애가 발생한 사례도 종종 있다고 한다. 데이터의 변경이 자주 발생하는 서비스에서 ZooKeeper를 데이터 저장소로 사용하는 것은 추천하지 않는다. ZooKeeper에서 추천하는 Read : Write 비율은 10 : 1 이상이다.

그리고 ZooKeeper 서버가 제대로 실행되지 않을 때가 있는데, 대부분 서버간의 데이터 불일치로 인한 데이터 동기화 실패가 그 원인이다. 주로 베타 테스트 후 운영 직전에 ZooKeeper 서버를 증설해서 사용하는데, 이럴 때 기존에 테스트했던 서버와 신규로 투입한 서버의 데이터 차이로 인해 이런 현상이 종종 발생한다. 이때는 데이터를 초기화한 후 서버를 실행하면 된다.

그리고 마지막으로, zoo.cfg라는 설정(configuration) 파일의 ZooKeeper 서버 목록을 꼼꼼히 확인해야 한다. 서버 목록이 정확히 맞지 않아도 서버가 실행되긴 하지만, 로그 파일을 확인하면 ZooKeeper 서버가 지속적으로 재시작할 때도 있고 데이터를 엉뚱한 곳에 저장하기도 한다.


Comments