JavaRush /Java Blog /Random-KO /사육사 또는 사육사의 삶은 어떤가요?
Viacheslav
레벨 3

사육사 또는 사육사의 삶은 어떤가요?

Random-KO 그룹에 게시되었습니다
사육사 또는 동물원 직원의 생활 방식 - 1

소개

Java 애플리케이션은 구성이 다른 경우가 많습니다. 예를 들어 주소 및 연결 포트입니다. 예를 들어 Properties 클래스를 사용하면 다음과 같이 보일 수 있습니다 .
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
그리고 이것으로 충분한 것 같습니다. 왜냐면... 파일에서 속성을 가져올 수 있습니다. 그리고 모든 것이 하나의 컴퓨터에서 우리와 잘 어울리는 것 같습니다. 하지만 우리 시스템이 서로 분리된 서로 다른 시스템으로 구성되기 시작한다고 상상해 보십시오. 이러한 시스템을 분산 시스템이라고도 합니다. Wikipedia에서는 다음과 같은 정의를 찾을 수 있습니다. 분산 시스템은 구성 요소가 서로 통신하고 서로 메시지를 교환하여 작업을 조정하는 서로 다른 네트워크 컴퓨터에 있는 시스템입니다. 다음 다이어그램을 볼 수 있습니다.
사육사 또는 동물원 직원의 생활 방식 - 2
이 접근 방식을 사용하면 단일 시스템이 구성 요소로 구분됩니다. 구성은 별도의 공통 구성 요소입니다. 다른 각 구성 요소는 구성 구성 요소에 대한 클라이언트 역할을 합니다. 이 경우를 " 분산 구성 " 이라고 합니다 . 분산 구성에는 다양한 구현이 있습니다. 그리고 오늘 리뷰에서 나는 그중 하나인 Zookeeper에 대해 알아볼 것을 제안합니다.
사육사 또는 동물원 직원의 생활 방식 - 3

사육사

Zookeeper를 알아가는 길은 공식 웹사이트인 Zookeeper.apache.org 에서 시작됩니다. 공식 웹사이트에서 " 다운로드 " 섹션 으로 이동해야 합니다 . 이 섹션에서는 "zookeeper-3.4.13.tar.gz"와 같은 .tar.gz 형식의 아카이브를 다운로드합니다. tar는 단위 시스템의 전통적인 아카이브 형식입니다. gz - 아카이브를 압축하는 데 gzip이 사용됨을 의미합니다. Windows 시스템에서 작업하는 경우에는 이것이 우리를 괴롭히지 않습니다. 대부분의 최신 아카이버(예: 7-zip )는 Windows에서 완벽하게 작동할 수 있습니다. 일부 디렉토리에 내용을 추출해 보겠습니다. 동시에 우리는 차이점을 볼 것입니다. 추출된 상태의 디스크에서는 약 60MB를 차지하며 약 35MB 크기의 아카이브를 다운로드했습니다. 보시다시피 압축은 실제로 작동합니다. 이제 Zookeeper를 실행해야 합니다. 일반적으로 Zookeeper는 일종의 서버입니다. Zookeeper는 Standalone 또는 Replicated의 두 가지 모드 중 하나로 실행될 수 있습니다 . 첫 번째 옵션이라고도 알려진 가장 간단한 옵션인 독립 실행형 모드를 고려해 보겠습니다. Zookeper를 실행하려면 구성 파일이 필요합니다. 따라서 여기에서 생성해 보겠습니다 [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Windows의 경우 Medium의 권장 사항인 " Windows에 Apache ZooKeeper 설치 " 를 사용합니다 . 구성 파일의 내용은 다음과 같습니다.
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Zookeper 루트 디렉터리에 대한 경로가 포함된 ZOOKEEPER_HOME 환경 변수를 추가하고(매체에 대한 지침과 같이) PATH 환경 변수에 다음 조각도 추가합니다. 또한 ;%ZOOKEEPER_HOME%\bin; dataDir에 지정된 디렉터리가 있어야 합니다. 그렇지 않으면 Zookeeper가 존재하지 않습니다. 서버를 시작할 수 있습니다. 이제 zkServer 명령을 사용하여 서버를 안전하게 시작할 수 있습니다. Zookeeper 디렉토리가 path 환경 변수에 추가되었다는 사실 덕분에 bin 디렉토리뿐만 아니라 어디에서나 Zookeper 명령을 호출할 수 있습니다.
사육사 또는 동물원 직원의 생활 방식 - 4

Z노드

" Zookeeper 개요 "에서 언급한 바와 같이 Zookeper의 데이터는 트리 구조로 구성된 ZNode (노드) 형태로 표현됩니다 . 즉, 각 ZNode는 데이터를 포함할 수 있으며 하위 ZNode를 가질 수 있습니다. ZNode 조직에 대한 자세한 내용은 Zookeeper 문서 " 데이터 모델 및 계층적 네임스페이스 "에서 찾을 수 있습니다. Zookeeper 및 ZNode를 사용하기 위해 Zookeeper CLI (명령줄 인터페이스) 를 사용합니다 . 이전에는 zkServer 명령을 사용하여 서버를 시작했습니다. 이제 연결을 위해 실행해 보겠습니다. zkCli.cmd -server 127.0.0.1:2181 성공하면 Zookeeper에 대한 연결 세션이 생성되고 대략 다음과 같은 출력이 표시됩니다.
사육사 또는 동물원 직원의 생활 방식 - 5
흥미롭게도 Zookeeper에는 설치 직후에도 이미 ZNode가 있습니다. 다음과 같은 경로가 있습니다./zookeeper/quota
사육사 또는 동물원 직원의 생활 방식 - 6
이것이 소위 " 할당량 "입니다. " Apache ZooKeeper Essentials " 에 명시된 대로 각 ZNode에는 저장할 수 있는 데이터를 제한하는 할당량이 있을 수 있습니다. znode 수와 저장된 데이터 양에 대한 제한이 지정될 수 있습니다. 또한 이 제한을 초과하면 ZNode 작업이 취소되지 않지만 제한 초과에 대한 경고가 수신됩니다. " ZooKeeper 프로그래머 가이드: ZNodes " 에서 ZNode에 대해 읽어보는 것이 좋습니다 . ZNode로 작업하는 방법에 대한 몇 가지 예는 다음과 같습니다.
사육사 또는 동물원 직원의 생활 방식 - 7
또한 ZNode는 다르다는 점에 주목하고 싶습니다. 일반 ZNode(추가 플래그를 지정하지 않는 한)는 " persist " 유형입니다 . " Ephemeral Node " 유형 의 ZNode가 있습니다 . 이러한 ZNode는 생성된 Zookeeper 연결 세션 동안에만 존재합니다. " Sequence Node " 유형의 ZNode가 있습니다 . 이러한 ZNode에는 고유성을 보장하기 위해 시퀀스의 번호가 추가됩니다. 시퀀스 노드는 지속적이거나 임시적일 수 있습니다. ZNode에 대한 약간의 배경 정보도 여기에서 권장됩니다: " Zookeeper ZNodes – 특성 및 예 ".
사육사 또는 동물원 직원의 생활 방식 - 8

Z노드 감시자

감시자에 대해서도 이야기하고 싶습니다. 이에 대한 자세한 내용은 Zookeeper 문서 " ZooKeeper Watches "에 기록되어 있습니다. 간단히 말해서 감시자는 일부 이벤트에 의해 트리거되는 일회성 트리거입니다. getData(), getChildren() 또는 presents() 작업을 수행하여 데이터를 검색하면 추가 작업으로 트리거를 생성할 수 있습니다. Zookeeper는 이벤트가 처리되는 순서를 보장합니다. 또한 문서에는 새 ZNode 값을 보기 전에 이전 값을 새 값으로 변경하는 이벤트가 표시된다고 명시되어 있습니다. 여기에서 Watchers에 대한 자세한 내용을 읽을 수 있습니다: " ZooKeeper 시계 – 기능 및 보증 ". 이를 시도하기 위해 CLI를 다시 사용해 보겠습니다 . 일부 서비스의 상태를 저장하는 값을 가진 일부 ZNode가 있다고 가정해 보겠습니다.
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
이제 데이터 /services/service1/status가 변경되면 일회성 트리거가 실행됩니다.
사육사 또는 동물원 직원의 생활 방식 - 9
Zookeeper에 연결할 때 감시자가 어떻게 작동하는지 볼 수 있다는 점이 흥미롭습니다.
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected는 가능한 Zookeper 이벤트 중 하나입니다. 이에 대한 자세한 내용은 API 설명에서 확인할 수 있습니다.
사육사 또는 동물원 직원의 생활 방식 - 10

사육사와 자바

이제 Zookeeper가 수행할 수 있는 작업에 대한 기본적인 이해가 끝났습니다. 이제 CLI가 아닌 Java를 통해 작업해 보겠습니다. 이를 위해서는 Zookeeper로 작업하는 방법을 알아보는 Java 애플리케이션이 필요합니다. 애플리케이션을 생성하기 위해 Gradle 프로젝트 빌드 시스템을 사용합니다 . " Gradle Build Init 플러그인 "을 사용하여 프로젝트를 생성합니다. 이를 위해 다음 명령을 실행해 보겠습니다. gradle init --type java-application Gradle이 명확한 질문을 요청하면 기본값을 그대로 둡니다(Enter를 누르기만 하면 됩니다). 이제 빌드 스크립트를 열어보겠습니다. build.gradle 파일. 여기에는 프로젝트가 무엇으로 구성되어 있는지, 그리고 프로젝트가 의존하는 아티팩트(라이브러리, 프레임워크)에 대한 설명이 포함되어 있습니다. 왜냐하면 Zookeeper를 사용하려면 이를 추가해야 합니다. 따라서 종속성 블록에 Zookeeper에 대한 종속성을 추가해 보겠습니다.
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Gradle에 대한 자세한 내용은 " A Brief Introduction to Gradle " 리뷰를 참조하세요 . 그래서 우리는 Java 프로젝트를 가지고 있고 Zookeeper 라이브러리를 여기에 연결했습니다. 이제 뭔가를 써 봅시다. 우리가 기억하는 것처럼 CLI를 사용하여 다음과 같이 연결했습니다. zkCli.cmd -server 127.0.0.1:2181 기본 메서드의 App 클래스에 "server" 속성을 선언해 보겠습니다.
String server = "127.0.0.1:2181";
연결은 즉각적인 행동이 아닙니다. 연결이 발생할 때까지 프로그램 실행의 메인 스레드에서 어떻게든 기다려야 합니다. 그러므로 자물쇠가 필요합니다. 아래와 같이 선언해 보겠습니다.
Object lock = new Object();
이제 연결이 설정되었다고 말할 사람이 필요합니다. 우리가 CLI를 통해 이 작업을 수행했을 때 감시자가 우리를 위해 일했다는 것을 기억합니다. 따라서 Java 코드에서는 모든 것이 정확히 동일합니다. 감시자는 성공적인 완료에 대한 메시지를 표시하고 잠금을 통해 이를 기다리고 있는 모든 사람에게 알립니다. 감시자를 작성해 봅시다:
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
이제 ZooKeeper 서버에 연결을 추가해 보겠습니다.
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
여기에서는 모든 것이 간단합니다. 프로그램의 메인 스레드에서 메인 메소드를 실행할 때 잠금 장치를 잡고 사육사에게 연결을 요청합니다. 동시에 우리는 잠금을 해제하고 다른 사람이 잠금을 잡고 계속할 수 있다고 알려줄 때까지 기다립니다. 연결이 설정되면 감시자가 작동합니다. 그는 SyncConnected 이벤트가 도착했는지 확인한 후(우리가 기억하는 것처럼 이는 관찰자가 CLI를 통해 포착한 것임) 메시지를 작성합니다. 다음으로 잠금을 잡고(메인 스레드가 이전에 잠금을 해제했기 때문에) 잠금을 기다리는 모든 스레드에 계속할 수 있음을 알립니다. 이벤트 처리 스레드는 동기화된 블록을 종료하여 잠금을 해제합니다. 메인 스레드는 알림을 수신하고 잠금이 해제될 때까지 기다린 후 실행을 계속합니다. 잠금을 받을 때까지 동기화된 블록을 종료하고 작업을 계속할 수 없습니다. 따라서 멀티스레딩과 Zookeeper API를 사용하여 다양한 작업을 수행할 수 있습니다. Zookeeper API는 CLI에서 허용하는 것보다 훨씬 더 광범위합니다. 예를 들어:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
보시다시피 노드를 생성할 때 ACL을 구성할 수 있습니다. 이것은 또 다른 중요한 기능입니다. ACL은 ZNode를 사용한 작업에 적용되는 권한입니다. 설정이 많기 때문에 자세한 내용은 공식 문서인 " Zookeeper ACL Permissions "를 참조하는 것이 좋습니다.
사육사 또는 동물원 직원의 생활 방식 - 11

결론

우리는 왜 이것을 읽었습니까? Zookeeper는 다른 대중적인 기술에도 사용되기 때문입니다. 예를 들어 Apache Kafka에는 " Kafka 빠른 시작 가이드 " 에서 읽을 수 있는 Zookeeper가 필요합니다 . 이는 NOSQL 데이터베이스 HBase에서도 사용되며 " HBase 빠른 시작 가이드 "에서 자세한 내용을 읽을 수 있습니다. 실제로 다른 많은 프로젝트에서도 Zookeeper를 사용합니다. 그 중 일부는 " 현실 세계에서 Zookeeper 사용 "에 나열되어 있습니다. "왜"라는 질문에 대한 답이 되었기를 바랍니다. 지금 가장 중요한 질문은 "다음은 무엇입니까?"입니다. 먼저 Apache Zookeeper 주제에 관한 다음 책을 읽을 수 있습니다. 둘째, Zookeeper에 대한 훌륭한 비디오 보고서가 있습니다. 추천 시청: 셋째, 세계의 모습을 보완할 몇 가지 유용한 기사가 있습니다. 아주 짧은 리뷰이지만, 입문용으로 도움이 되었으면 좋겠습니다. #비아체슬라프
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION