책 소개
요약
우리가 매일 이용하는 수많은 응용프로그램은 대부분 분산 시스템하에서 운영되고 있다. 아파치 주키퍼(Apache ZooKeeper)는 핵심 분산 컴퓨팅 개념을 비롯해 견고한 분산 시스템을 쉽게 구성하기 위해 만들어졌다. 이 책은 이런 분산 시스템에 대한 배경지식과 함께 마스터-워커(master-worker) 예제를 통해 주키퍼 API 사용 방법, 와처(watcher) 사용 방법, 장애 처리 방법 등을 다룬다. 또한 주키퍼가 동작하는 과정을 이해할 수 있도록 내부 구조에 대한 설명을 제공해 효과적인 주키퍼 사용과 운영 방법에 대해 설명한다.
이 책에서 다루는 내용
코디네이션 기능 없이 동작하는 분산 애플리케이션을 구성하는 것은 어렵다. 이 책에서는 여러분이 애플리케이션의 로직에 집중할 수 있도록 아파치 주키퍼가 도움을 주는 분산 시스템 관리에 대한 실용적인 방법을 제시한다. 물론 주키퍼를 사용하더라도 코디네이션 작업을 구현하는 것은 쉽지 않다. 그렇지만 이 책에서는 여러분이 쉽게 이해할 수 있도록 훌륭한 예제를 제공하며, 주키퍼를 사용하면서 개발자와 관리자 모두가 인지해야 하는 주의사항에 대해 짚어준다.
주키퍼 컨트리뷰터인 플라비오 융케이라와 벤자민 리드는 분산 시스템의 원리에 대해 소개하고 주키퍼 프로그래밍 테크닉과 주키퍼 서버를 관리하는 데 필요한 정보를 세 개의 부로 나누어 제공한다.
- 주키퍼가 일반적인 코디네이션 작업을 해결하는 방법에 대한 학습
- 주키퍼 API의 자바와 C 구현 방법과 차이점 비교
- 주키퍼 상태 변화를 추적하고 상태 변화에 반응하는 메소드 사용
- 네트워크 장애, 애플리케이션 프로세스 장애, 주키퍼 자체의 장애를 처리하는 방법
- 주키퍼에서 어려운 부분인 동시성, 순서, 설정을 다루는 방법 학습
- 연결 관리를 위한 고수준 인터페이스인 큐레이터 사용
- 주키퍼의 내부 구조와 관리 도구에 익숙해짐
이 책의 대상 독자
이 책은 분산 시스템 개발자와 운영 환경에서 주키퍼를 사용하는 애플리케이션 관리자를 대상으로 한다. 기본적으로 자바에 대한 지식이 있는 것으로 가정한다. 이 책에서는 주키퍼를 효율적으로 사용할 수 있게 분산 시스템 원론에 대한 배경 지식을 제공하고자 한다.
이 책의 구성
1부는 아파치 주키퍼와 같은 시스템이 생겨난 배경을 이야기한다. 그리고 분산 시스템을 사용하는 데 필요한 분산 시스템의 필수 배경 지식에 대해 설명한다. ‘1장, 소개’에서는 주키퍼로 할 수 있는 일을 설명하고, 주키퍼로 목표를 달성하는 방법에 대해 설명한다. ‘2장, 주키퍼와 첫 만남’에서는 주키퍼의 기본 개념과 구성 요소에 대해 살펴본다. 명령 행에서 주키퍼를 사용해봄으로써 주키퍼로 할 수 있는 것에 대한 구체적인 아이디어를 얻는 방법을 설명한다.
2부는 라이브러리 호출과 프로그래머가 알고 있어야 하는 프로그래밍 테크닉에 대해 다룬다. 이 내용은 유용하지만 시스템 관리자들은 꼭 읽지 않아도 되며, 개발자들이 가장 많이 사용하는 자바 API에 초점을 맞춘다. 다른 언어를 사용하고 있다면 2부는 기본 테크닉과 기능에 대해 학습하는 용도로만 읽고 난 다음, 다른 언어로 구현해보는 것도 좋겠다. 아울러 C 언어 애플리케이션 개발자를 위한 C 언어 바인딩을 다루는 장도 추가적으로 제공한다. ‘3장, 주키퍼 API 시작’에서는 자바 API에 대해 소개한다. ‘4장, 상태 변경’에서는 주키퍼 상태 변경 사항을 추적하고 변경을 처리하는 방법에 대해 설명한다. ‘5장, 장애 처리’에서는 시스템이나 네트워크 문제를 복구하는 방법에 대해 보여준다. ‘6장, 주키퍼 사용자 위험 부담 원칙’에서는 문제 상황을 피하기 위한 다양한 중요 고려사항들에 대해 설명한다. ‘7장, C 클라이언트’에서는 자바가 아닌 모든 언어의 주키퍼 API 구현의 기본이 되는 C API에 대해 소개한다. 이 장은 자바 언어 외의 다른 언어를 사용하는 프로그래머에게 중요하다. ‘8장, 큐레이터: 주키퍼에 대한 고수준 API’에서는 주키퍼에 대한 고급 단계 API에서는 많이 사용하는 고수준의 추상화 인터페이스인 큐레이터에 대해 설명한다.
3부는 시스템 관리자를 위한 주키퍼 관련 내용을 설명한다. 특히 주키퍼 내부 구조를 설명하는 장은 프로그래머에게도 유익할 것이다. ‘9장, 주키퍼의 내부 구조’에서는 관리 작업에 영향을 주는 주키퍼 개발자들이 고민해서 선택한 몇 가지 선택 항목들에 대해 설명한다. ‘10장, 주키퍼 운영’에서는 주키퍼 설정 방법을 설명한다.
목차
목차
- 1부 주키퍼의 개념과 기본
- 1장 소개
- 주키퍼의 역할
- 주키퍼로 인해 달라진 것들
- 주키퍼의 역할이 아닌 일들
- 아파치 프로젝트
- 주키퍼를 이용한 분산 시스템 구성
- 예제: 마스터 워커 애플리케이션
- 마스터 결함
- 워커 결함
- 통신 결함
- 작업 요약
- 분산 코디네이션이 어려운 이유
- 주키퍼의 성공과 주의 사항
- 2장 주키퍼와 첫 만남
- 주키퍼 기본
- API 개요
- Znode의 다양한 모드
- 와치와 알림
- 버전
- 주키퍼 아키텍처
- 주키퍼 쿼럼
- 세션
- 주키퍼 시작하기
- 첫 번째 주키퍼 세션
- 상태와 세션의 생명주기
- 주키퍼 쿼럼
- 기본 요소 구현: 주키퍼를 이용한 락
- 마스터 워커 예제 구현
- 마스터 역할
- 워커, 작업, 할당
- 워커 역할
- 클라이언트 역할
- 결론
- 2부 주키퍼 프로그래밍
- 3장 주키퍼 API 시작
- 주키퍼 클래스패스 설정
- 주키퍼 세션 생성
- Watcher 구현
- Watcher 예제 실행
- 마스터십 획득
- 비동기로 마스터십 획득
- 메타데이터 설정
- 워커 등록
- 작업 큐
- 관리 클라이언트
- 결론
- 4장 상태 변경
- 일회성 트리거
- 일회성 이벤트 트리거를 놓칠 수 있을까?
- 와치를 설정하는 좀 더 구체적인 방법
- 공통 패턴
- 마스터-워커 예제
- 멤버십 변경
- 워커 목록 변경을 위한 마스터 대기
- 새로운 작업 할당을 위한 마스터 대기
- 새로운 작업 할당을 위한 워커 대기
- 작업 실행 결과를 위한 클라이언트 대기
- 또 다른 방법: 멀티옵
- 명시적인 캐시관리의 대안으로써 와치
- 순서 보장
- 쓰기 순서
- 읽기 순서
- 알림 순서
- 무리 효과와 와치의 확장성
- 결론
- 5장 장애 처리
- 복구 가능한 장애
- Disconnected 이벤트와 기존에 존재하던 와치
- 복구불능 장애
- 리더 선출과 외부 자원
- 결론
- 6장 주키퍼 사용자 위험 부담 원칙
- ACL 사용
- 내장된 인증 체계들
- SASL과 커베로스
- 새로운 체계 추가
- 세션 복구
- znode가 재생성되면 버전은 초기화된다
- sync 호출
- 순서 보장
- 연결이 끊겼을 때의 순서
- 동기 API와 멀티스레드 상황의 순서
- 동기와 비동기 호출이 섞여 있는 경우의 순서
- 데이터와 자식 수의 제한
- 주키퍼 서버 임베딩
- 결론
- 7장 C 클라이언트
- 개발 환경 설정
- 세션 시작
- 마스터 부트스트랩
- 리더십
- 태스크 할당
- 멀티스레드 대 싱글스레드 클라이언트
- 결론
- 8장 큐레이터: 주키퍼에 대한 고수준API
- 큐레이터 클라이언트
- 플루언트 API
- 리스너
- 큐레이터에서 상태 변경
- 몇 가지 특이사항
- 레시피
- 리더 래치
- 리더 선출
- 자식 캐시
- 결론
- 3부 주키퍼 관리
- 9장 주키퍼의 내부 구조
- 요청, 트랜잭션, 식별자
- 리더 선출
- 잽: 상태 변경사항 브로드캐스팅
- 옵저버
- 서버의 기본 구성
- 단독 서버
- 리더 서버
- 팔로워 서버와 옵저버 서버
- 로컬 저장소
- 로그와 디스크 사용
- 스냅샷
- 서버와 세션
- 서버와 와치
- 클라이언트
- 직렬화
- 결론
- 10장 주키퍼 운영
- 주키퍼 서버 설정
- 기본 설정
- 저장소 설정
- 네트워크 설정
- 클러스터 설정
- 인증과 권한 부여 옵션
- 안전하지 않은 옵션
- 로깅
- 전용 자원
- 주키퍼 앙상블 설정
- 과반수 규칙
- 설정 가능한 쿼럼
- 옵저버
- 재설정
- 클라이언트 연결 문자열 관리
- 쿼터
- 멀티테넌시
- 파일 시스템 레이아웃과 형식
- 트랜잭션 로그
- 스냅샷
- 에퍽 파일
- 저장된 주키퍼 데이터의 사용
- 포-레터 단어
- JMX 모니터링
- 원격 연결
- 도구
- 결론
도서 오류 신고
정오표
[ p31 2행 ]
발생했다 것을 -> 발생했다는 것을
[ p34 정확히 한 번과 최대 한 번의 의미(박스) 9행 ]
시맥틱 -> 시맨틱
[ p39 7행 ]
다른 개발자들은 -> 개발자들은
[ p42 ]
5행: 주키퍼 작업 -> 주키퍼 연산
아래에서 4행: /wokers -> /workers, znode는 부모 znode로 -> 부모 znode로 ('znode는' 삭제)
[ p43 ]
1행: znode는 워커가 실행할 -> 워커가 실행할 ('znode는' 삭제)
5행: znode는 워커에게 -> 워커에게 ('znode는' 삭제)
API 개요 3행: 주키퍼는 저장된 데이터를 저장 형식에 대해 분석하지 않는다. -> 주키퍼는 저장 내용에 대해서 관여하지 않는다.
[ p53 주키퍼 시작 4행 ]
맥 OS X 또는 다른 유닉스 라이크 시스템에서 -> 맥 OS X 등의 유니크 계열 시스템에서
[ p88 마스터십 획득 8행 ]
시도할 것 이다. -> 시도할 것이다.
[ p92 1행 ]
ConnectionLossException 처리한다. -> ConnectionLossException을 처리한다.
[ p93 2행 ]
인터럽션 -> 인터럽트
[ p94 3행 ]
로직을 개발한다 -> 로직을 넣는다.
[ p114 8행 ]
첫번 째부터 -> 첫 번째부터
[ p116 2행 ]
콜백 객체 구현하고 -> 콜백 객체를 구현하고
[ p137 ]
아래에서 10행: 태스크을 -> 태스크를
[ p145 아래에서 3행 ]
비동시 -> 비동기
[ p169 SASL과 커베로스 아래에서 1행 ]
SASLAuthentication Provider -> SASLAuthenticationProvider
[ p174 아래에서 12행 ]
Op1 작업 요청하게 된다. -> Op1 작업을 요청하게 된다.
[ p175 CONNECTIONLOSS 이벤트 발생 자체를 없애는 건 어떨까?(박스) 4행 ]
물어볼 수는 있지 않을까? 생각한다. -> 물어볼 수는 있지 않을까 생각한다.
[ p177 7행 ]
로그 메시지를 보여지게 되는 -> 로그 메시지를 보여주게 되는
[ p182 아래에서 2행 ]
ZOO_EXPIRED_SES SION_STATE -> ZOO_EXPIRED_SESSION_STATE
[ p185 1행 ]
비동기 호출로써 -> 비동기 호출로서
[ p201 ]
아래에서 7행: zookeep er_mt -> zookeeper_mt
[ p205 ]
아래에서 9행: CEATE -> CREATE
아래에서 6행 자바에서 실행자는 -> 실행자는 자바에서
아래에서 5행 객체로써 -> 객체로서
[ p206 리스너 1행 ]
매커니즘 -> 메커니즘
[ p224 요청, 트랜잭션, 식별자 1행 ]
주키퍼 서버는 읽기 요청은 요청을 -> 주키퍼 서버는 읽기 요청을
[ p225 8행 ]
트랙잭션 -> 트랜잭션
[ p231 그림 9.3 3번 ]
서버와 함꼐 -> 서버와 함께
[ p237 ]
1행: 뒤쳐져 -> 뒤처져
코드 들여다 보기 5행: LOOKING상태에서 -> LOOKING 상태에서
코드 들여다 보기 7행: SNAP에 대해 비교를 -> SNAP 비교를
[ p244 3행 ]
핵심 과정(Critical Path) -> 임계 경로(Critical Path)
[ p245 아래에서 3행 ]
스냅샷은 어떠한 반드시 -> 스냅샷은 어떠한
[ p250 ]
아래에서 3행: 주키퍼 코드 베이스는 -> 주키퍼 코드 베이스의
아래에서 1행: Jute 대체하는 -> Jute로 대체하는
[ p258 6행 ]
남기는 않는 -> 남기지 않는
[ p261 12행 ]
이 제한 동작하기 전까지 -> 이러한 제한 동작 전까지
[ p265 ]
2행: 리더 선출하는 동안 -> 리더를 선출하는 동안
인증과 권한 부여 옵션 5행: 클라이언트 모든 -> 클라이언트는 모든
[ p267 ]
새너티 검사 변경 4행: 목록을 반환 시도할 때 -> 목록을 반환하려 시도할 때
[ p270 아래에서 10행 ]
설정된 경우는 영향을 더욱 클 것이다. -> 설정된 경우에는 영향이 더욱 클 것이다.
[ p292 ]
옮긴이 주 삭제
[ p15 목차, p86, p88, p292-293 ]
포 레터 단어/포-레터 워드/포-레터 단어 -> '4글자 명령' 으로 일괄 변경