ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kafka Docker-compose ( feat. single node ) 만들기
    Devops/Kafka 2021. 3. 19. 16:56
    반응형

    회사에서 급하게 메세지큐를 써야 하는 상황이 되어서 급하게 빠르게 구축하기  위해 머리를 굴리기 시작하였다. 

    1. 빠르게 구축 

    2. 돈이 적게 들게 

    3. 일단 가볍게 

    기준을 저렇게 잡은 이유는 별개 아니라 일단 당장 테스트하고 구축해서 써야 하는 조짐(?)이 보였고 당장 수익이 나는 구조가 아니다보니 비용에 민감할수 밖에 없었고 트래픽이 당장 크게 있을거 같진 않았기 때문에 저렇게 목표를 삼고 시작하였다. 

    어떻게 보면 rabbitMQ 사용해도 무방한 상황이지만 여러가지 비교를 해보고 앞으로를 생각했을때  (비교글 : ellune.tistory.com/29?category=769027 ) 카프카를 써야될거 같다는 팀원들 이야기가 나오기도 하면서 고민이 시작됬다 

     

    1) 컨셉 

    - 도커

    일단, 요즘엔 너무나도 당연하게 사용되는 도커 기반으로 하기로 했다. 이유는 간단하다 구축만큼은 아주 손쉽게 가능하기 때문이다. 기존에 테스트 하거나 공부 할땐 전부 OS 에 직접 설치하고 그걸 각각 config 설정을 맞춰주면서 내렸다 올렸다 하기위해 여러개의 콘솔을 띄워놓고 사용 했었던거 같다. 하지만 도커라면 아주 쉽게 사용이 가능하단걸 알았다. 

    - 싱글노드 

    보통 맛을 보거나 테스트 버전으로 많이 사용되는 형태라고 본다. 나도 예전에 테스트 목적일때 간단한 인스턴스하나에 모두 올려놓고 사용해보고 실제 프로덕트 구성시 분리해서 했던거 같다. 그럼에도 불구하고 싱글노드로 컨셉을 잡은건 당장은 트래픽이 얼마 없을 예정이고 한동안도 없을것으로 추측되는 서비스에 선 적용하는것이 목적이였고 ( 서비스 상에서는 메세지큐를 사용하는 환경은 먼저 만들기 위한 의도도 포함되있음 ) 추후 정말 제대로 트래픽이 많아지거나 하드하게 쓸경우에는 카프카 클러스터를 구성해서 교체할 생각이였기 때문에 싱글로 구성하였다 

    인스턴스 구성 

        - 클러스터 구성 : 카프카 3개 , 주키퍼 3개, 카프카매니저 1개( 별도로 구성하지 않아도 가능 ) = 인스턴스 6~7개

        - 싱글 구성 : 인스턴스 1개   ( 비용 최소화 !! ) 

     내가 겪었던 어떤 회사에서는 카프카 하나를 싱글 노드로 띄워놓고 주키퍼, 카프카매니저 없이 사용하던 회사가 있었다. 참 다행이도 문제는 크리티컬한 문제는 안생겼지만 싱글노드인데 이정도나 버틴다고 ? 라고 할정도로 생각보다 준수한 처리량을 보여줘서 놀랐던 경험이 있다. 

    물론 좋은 케이스는 아니지만 일단 한걸음 내딛는다는 생각으로 이구성을 결정했다 . 꼭! 추후에는 클러스터 형태로 바꿀것이다. 

     

    2) 구성

    - docker-compose

    docker-compose 를 이용한건 다른이유가 아니라 편리함과 쉬운 구성 이다. docker-compose 를 썼을때 개인적으로 가장 좋은점으로 보는것은 컨테이너간의 연동 부분인거 같다. 간단한 키워드 만으로도 서로 연동이 가능하기 때문에 무조건 알고 사용해야하는 기능이다. 

    여러가지 docker-compose 들을 찾아서 사용해보았는데 그중 보통 검색하면 가장 많이 나오는 샘플이 https://hub.docker.com/r/wurstmeister/kafka

     

    Docker Hub

     

    hub.docker.com

    이 사이트에서 보통 pull 받아서 사용하는경우가 많고 그에 따른 여러가지 형태의 컴포즈 파일들이 돌아다니는데 지금 나한테는 여러가지 안맞았고 특히 카프카 매니저를 연동하는데 여러가지로 문제가 생겨서 굉장히 애를 먹었다 그러던 와중에 conflunetinc 에서 이런 컴포즈를 제공하는것을 알았고 ( 내가 찾은 블로그 가이드에 따르면 커뮤니티 버전을 제공은 하는데... 일부 유료기능들이 있어서 사용할때 해당기능은 삭제하고 사용해야한다고 한다. 꼭 주의 !! ) 

    해당 컴포즈를 사용하기로 했다. !! 

    version: '2'
    services:
      zookeeper:
        image: confluentinc/cp-zookeeper:6.1.0
        hostname: zookeeper
        container_name: zookeeper
        ports:
          - "2181:2181"
        environment:
          ZOOKEEPER_CLIENT_PORT: 2181
          ZOOKEEPER_TICK_TIME: 2000
        volumes:      
          - ./var/run/docker.sock:/var/run/docker.sock
      broker:
        image: confluentinc/cp-enterprise-kafka:6.1.0
        hostname: kafka.wmpmzdev.com
        container_name: broker
        depends_on:
          - zookeeper
        ports:
          - "29092:29092"
          - "9092:9092"
        environment:
          KAFKA_BROKER_ID: 1
          KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
          KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:29092,PLAINTEXT_HOST://localhost:9092
          KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
          KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
          CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: localhost:29092
          CONFLUENT_METRICS_REPORTER_ZOOKEEPER_CONNECT: localhost:2181
          CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
          CONFLUENT_METRICS_ENABLE: 'true'
          CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'
          KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
    
        volumes:
          - ./data/kafka-data:/var/lib/kafka/data
          - /var/run/docker.sock:/var/run/docker.sock
      kafka_manager:
          depends_on:
            - zookeeper
            - broker
          image: hlebalbau/kafka-manager:stable
          ports:
            - "9000:9000"
          environment:
            ZK_HOSTS: "zookeeper:2181"
            APPLICATION_SECRET: "random-secret"
          command: -Dpidfile.path=/dev/null

    내가 사용한 컴포즈에서 수정된 부분은 몇군데 없는데 그중 중요한건 카프카와 주키퍼 , 카프카 매니저의 이미지 버전이다. 내가 사용해본결과 5.3 버전경우 그냥 사용할때 문제는 없는데 구동후 카프카 매니저에서 클러스터 추가시 mutex 가 없다는 에러가 발생하면서 카프카매니저 웹사이트에서 제대로 추가가 되지않는다. 5.5~6.0 까지 카프카와 주키퍼 이미지를 버전을 바꿔보면서 사용해봤는데 이때 문제는 버전업을 할경우 카프카 매니저 버전과의 문제가 생기는거 같았다. 잘보면 카프카,주키퍼는  confluentinc 에서 둘다 관리하기때문에 둘간의 문제는 없으나 카프카 매니저 경우 다른 hlebalbau 에서 이미지를 가져와서 중간의 호환성 문제( 파라미터나 나 환경 변수가 좀 틀어지는것 같다. ) 가 생기는것으로 추정되었다. ( 아닐수도 있다 다른문제일지도 ㅠㅠ... ) 

    그래서 일단 카프카 매니저의 버전을 stable 로 고정한 상태에서 주키퍼 , 카프카를 6.1 버전으로 업그레이드해서 동작 시켜봤고 둘간 정상 동작을 확인 하였다. 하지만 로그상에 일부 warn 이 발생하는케 카프카 매니저 로그에서 확인 되었고 이건 추후 확인이 좀 필요해보인다. 

    위 docker-compose 파일을 docker-compose up -d 로 실행하면 아주 간단하게 카프카를 구동 시킬수 있으며 그것을 관리 할수있는 카프카 매니저도 사용이 가능하다 ( http://설치된 장비IP:9000 ) 

    이글에서는 구성만 다루기위해 실제 토픽 생성이나 삭제 그리고 사용은 적지 않을 생각이다. 

    추가적으로 이것을 활용해서 클러스터를 구성할때 사용해도 좋을것 같다. 이후에 클러스터 구성시에도 도커기반으로 사용할 예정이며 주키퍼 경우 일반적으로는 별도 구성이 좀더 안정성면에서 좋기 때문에 전부 분리해서 구성할 예정이다. 

    간단하게 사용해보려면 참고하면 좋을거 같다. 

    하지만 뭔가 옵션을 디테일하게 건들고 튜닝하기에는 아직은 도커가 손에 익지 않아서 그런지 직접 설치해서 사용하는게 낫지 않을까 라는 생각이 든다! 

    참고 사이트

    1. https://www.jslee.me/2019/08/05/run-kafka-with-docker/
    2. https://akageun.github.io/2019/09/10/docker-compose-local-kafka.html
    3. https://akageun.github.io/2020/05/01/docker-compose-kafka-cluster-manager.html
    4. https://hub.docker.com/r/confluentinc/cp-zookeeper/tags?page=1&ordering=last_updated
    5. https://hub.docker.com/r/confluentinc/cp-enterprise-kafka/tags?page=1&ordering=last_updated
    6. hleb-albau/kafka-manager-docker
    7. https://megazonedsg.github.io/kafka-prod-env/
    반응형

    'Devops > Kafka' 카테고리의 다른 글

    Kafka manager(CMAK) 설치  (0) 2021.06.25
    Kafka 사용법  (0) 2019.11.20
    Kafka 사용이유 ( vs RabbitMQ )  (8) 2019.05.10
    Kafka 기본  (0) 2019.03.11
Designed by Tistory.