Zookeeper


  • Apache 재단 오픈소스 프로젝트
  • 구성 정보 유지 관리,분산 동기화 제공하고 그룹 서비스를 제공하는 중앙 집중식 서비스
  • Apache 내부 프로젝트 중 동물(hadoop, pig, hive) 을 zookeeper(사육사)가 관리 해준다는 의미?
  • 디자인 목표
    • 간단하게 설계
    • 복제
      • 서버들끼리 연결되어 서로 데이터가 복제
    • 순서 존재
      • 업데이트 순서 기록, 기록된 숫자 주키퍼 트랜잭션에 사용(이를 통해 동기화가 가능) 
    • 빠른 속도




  • Server
    • 설정
      • 최신 버전 다운로드
      • 프로젝트 폴더 내 jar 파일 이용하여 Standalone 방식으로 동작 가능
      • 설정 파일 생성
        • conf/zoo.cfg
        • tickTime=2000 dataDir=/var/lib/zookeeper clientPort=2181




        • tickTime
          • ZooKeeper에서 사용하는 기본 시간 단위 (milliseconds)
          • 하트 비트를 수행하는 데 사용
        • dataDir
          • 메모리 내 데이터베이스 스냅 샷 저장할 위치
        • clientPort
          • client 연결을 대기하는 포트
      • server start
        • java -cp zookeeper-3.4.13.jar:lib/log4j-1.2.17.jar:lib/slf4j-log4j12-1.7.25.jar:lib/slf4j-api-1.7.25.jar:conf org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.cfg




    • 다운 받은 프로젝트 내 application.properties 혹은 application.yml정보 설정
      • server.port: 8080 spring.application.name: libqa-client spring: cloud: zookeeper: connect-string: localhost:2181


    • build.grale 수정
      • dependencies { compile('org.springframework.cloud:spring-cloud-starter-zookeeper-all') { exclude group: 'org.apache.zookeeper', module: 'zookeeper' } compile('org.apache.zookeeper:zookeeper:3.4.12') { exclude group: 'org.slf4j', module: 'slf4j-log4j12' } implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' }


    • client start


      • 다중 client 확인을 위해서 client project 복사
        • howling-client application.yml 수정
          • server.port: 8081 spring.application.name: howling-client spring: cloud: zookeeper: connect-string: localhost:2181
        • howling-client2
          • server.port: 8082 spring.application.name: howling-client spring: cloud: zookeeper: connect-string: localhost:2181


      • service discovery 테스트
        • @GetMapping("/callHowling/{applicationIndex}") public String callHowling(@PathVariable Integer applicationIndex) { List<ServiceInstance> clients = discoveryClient.getInstances("howling-client"); String uri = clients.get(applicationIndex).getUri().toString(); String requestUrl = uri + "/howling"; this.discoveryClient.getServices().forEach(client -> System.out.println(client)); ResponseEntity<String> stockResponse = restTemplate().exchange(requestUrl, HttpMethod.GET, null, new ParameterizedTypeReference<String>() {}); return stockResponse.getBody(); }


      • eureka와 zookeeper 다른점
        • eureka는 client의 spring.application.name이 host 정보라서 찾을수 있음
        • zookeeper는 discoveryClient.getInstances("howling-client") 방식으로 spring.application.name으로 service를 찾아야함


      • 상위 문제점 해결
        • 설정의 문제
          • 위치
          • @Autowired private RestTemplate restTemplate; @Bean @LoadBalanced public RestTemplate restTemplate() {     return new RestTemplate(); }


          • annotation
          • @Configuration @EnableAutoConfiguration @EnableDiscoveryClient @EnableFeignClients
          • @SpringBootApplication @EnableDiscoveryClient







참고 : https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_designGoals


https://zookeeper.apache.org/doc/current/zookeeperStarted.html



https://github.com/yongpwi/spring-cloud-zookeeper-client

https://github.com/yongpwi/spring-cloud-zookeeper-client2

https://github.com/yongpwi/spring-cloud-zookeeper-client3