10 분 시리즈-zookeeper 입문

10 분 zookeeper 총괄.
설치 설정
  • 스트레스 해소
  • 설정 수정:zoo.cfg,dataDir 수정
  • 시작:bin/zkServer.sh start
  • 기본적으로 standalone 입 니 다.
    분산 배치
  • 동기 화 패키지
  • zkData 데이터 디 렉 터 리 아래 myid 파일 만 들 기
  • myid 를 편집 하고 유일한 표 지 를 입력 하 십시오.예 를 들 어 2,3,4
  • zoo.cfg 설정:
    # server.A=host1:B:C
    # A: myid  
    # B:      
    # C:       
    server.2=host1:2888:3888
    server.3=host2:2888:3888
    server.4=host3:2888:3888
    
  • 서버 당zkServer.sh start을 시작 하여zkServer.sh statusleader 인지 follower 인지 확인 합 니 다
  • 설정 설명
    ticktime:ticktime 시간 마다 심장 박동 을 보 냅 니 다.
    initLimit:follower 링크 leader 가 가장 많이 허용 하 는 심장 박동 프레임 횟수:initLimit*tickTime 후 시간 초과
    syncLimit:follower 와 leader 가 동기 화 될 때 가장 많이 허용 되 는 심장 박동 수 syncLimit*tickTime 이후 시간 을 초과 하여 서비스 목록 에서 follower 를 삭제 합 니 다.
    내부 원리
    선거 메커니즘
    paxos 프로 토 콜 기반.
  • 반수 메커니즘:일반 장치 홀수 대
  • leader 와 follower,투표 로 선출 된 leader
  • 자세 한 내용 은 선거 부분 코드 를 볼 수 있다.
    모두Election인터페이스의 실현 에 있다.
    package org.apache.zookeeper.server.quorum;
    
    public interface Election {
    
        Vote lookForLeader() throws InterruptedException;
        void shutdown();
    
    }
    

    주로FastLeaderElection류 입 니 다.
    노드 종류
  • 지속:클 라 이언 트 와 서버 가 연결 을 끊 은 후 노드 를 삭제 하지 않 습 니 다.
  • 지속 적 인 디 렉 터 리 노드:디 렉 터 리 가 변 하지 않 습 니 다
  • 지속 화 순서 번호 디 렉 터 리 노드:끊 기 면 자동 번호
  • 짧게:끊 기 면 삭제
  • 임시 디 렉 터 리 노드
  • 임시 디 렉 터 리 번호 노드

  • Stat 구조 체
    셸 작업 을 먼저 보 는 것 을 권장 합 니 다.
  • czxid:노드 를 만 드 는 사무 zxid:zxid 유일,시간 스탬프,대표 순서
  • ctime:znode 가 만 든 밀리초 수
  • mzxid:마지막 으로 업 데 이 트 된 zxid
  • mtime:마지막 으로 수 정 된 밀리초 수
  • pZxid:마지막 으로 업 데 이 트 된 하위 노드 의 zxid
  • cversion:zno de 바이트 변화 번호,zno de 서브 노드 수정 횟수
  • dataversion:데이터 변화 번호
  • aclVersion:제어 목록 에 접근 하 는 변화 번호
  • ephemeralOwner:임시 노드 라면 znode 소유자 의 session id 를 대표 합 니 다.그렇지 않 으 면 0
  • 입 니 다.
  • dataLength:데이터 길이
  • numChildren:하위 노드 수량
  • 모니터 원리
  • 클 라 이언 트:먼저 main 스 레 드
  • 가 있 습 니 다.
  • 클 라 이언 트:main 스 레 드 에 2 개의 스 레 드 를 만 듭 니 다.하 나 는 통신(connector)을 연결 하고 하 나 는 감청(listener)
  • 을 담당 합 니 다.
  • 클 라 이언 트:connector 를 통 해 등 록 된 감청 사건 을 zk 서버 에 보 냅 니 다
  • 서버:zk 의 등록 모니터 목록(서버)은 등 록 된 감청 이 벤트 를 목록 에 추가 합 니 다
  • 서버:zk 서버 가 데이터 경로 변화 가 있 음 을 감청 하면 listener 스 레 드
  • 에 메 시 지 를 보 냅 니 다.
  • 클 라 이언 트:listener 내부 호출 프로 세 스 방법
  • 일반적인 감청 유형:
  • 감청 노드 데이터 의 변화:get path watch
  • 감청 서브 노드 증감 의 변화:ls path watch
  • 데이터 작성 절차
    client--->쓰기 요청 보 내기-server 1
  • server 1 이 leader 가 아니라면 leader 에 게 요청 을 전달 합 니 다.leader 는 각 server 에 요청 을 방송 합 니 다.예 를 들 어 server 1 과 server 2,각 server 가 성공 하면 leader
  • 에 게 알 립 니 다.
  • leader 가 대부분의(과반)server 가 성공 적 으로 쓴 답장 을 받 은 후에 데이터 작성 이 성공 했다 고 생각 합 니 다
  • 성공 적 으로 쓴 후에 leader 는 server 1 에 성공 했다 고 말 했다
  • server 1 클 라 이언 트 에 게 성공 했다 고 알려 주기
  • 조작 실전
    셸 사용
    zkCli.sh 클 라 이언 트 진입
  • help:명령 표시
  • ls /:현재 디 렉 터 리 노드 보기
  • create /china "china":노드 만 들 기create /china/beijing "beijing":하위 노드
  • get /china/beijing:노드 의 값 가 져 오기
  • create -e /china/japan "japan":짧 은 노드 만 들 기
  • create -s /china/cq "cq":번호 가 있 는 노드 만 들 기(여러 번 실행)
  • set /china/beijing "home":노드 의 값 수정
  • get /china watch:감청 노드 값 의 변화(등록 한 번 에 한 번 유용)ls /china watch:감청 노드 의 변화
  • delete /china/beijing:노드 삭제rmr /china:재 귀적 삭제
  • 코드 실천
    maven 환경 준비
        <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
            dependency>
    
            <dependency>
                <groupId>log4jgroupId>
                <artifactId>log4jartifactId>
                <version>1.2.17version>
            dependency>
    
            <dependency>
                <groupId>org.apache.zookeepergroupId>
                <artifactId>zookeeperartifactId>
                <version>3.4.10version>
            dependency>
        dependencies>
    

    클 라 이언 트 만 들 기
        /**
         *        
         */
        private static String connectString = "localhost:2181";
        /**
         *     
         */
        private static int sessionTimeout = 2000;
        /**
         * client
         */
        private static ZooKeeper zk;
    
        @BeforeClass
        public static void init() throws IOException {
            zk = new ZooKeeper(connectString, sessionTimeout, watchedEvent -> {
    
            });
        }
    	
        @AfterClass
        public static void afterClass() throws Exception {
            zk.close();
        }	
    

    코드 구현 CRUD
        @Test
        public void createNode() throws KeeperException, InterruptedException {
            String path = zk.create("/super", "jimo".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            assertEquals("/super", path);
        }
    
        @Test
        public void getNode() throws KeeperException, InterruptedException {
            List<String> children = zk.getChildren("/", false);
            children.forEach(System.out::println);
        }
    
        @Test
        public void getNodeWatch() throws KeeperException, InterruptedException {
            zk.getChildren("/", watcher -> {
                try {
                    getNode();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
    
            TimeUnit.MINUTES.sleep(1L);
        }
    
        @Test
        public void nodeExist() throws KeeperException, InterruptedException {
            Stat exists = zk.exists("/super", false);
            assertNotNull(exists);
            Stat existNon = zk.exists("/hehe", false);
            assertNull(existNon);
        }
    

    좋은 웹페이지 즐겨찾기