ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ MongoDB + ElasticSearch + Monstache ] 도커 기본 셋팅을 해보자
    개발일지/mongoDB 2019. 10. 2. 11:18

    회사 내부에서 검색엔진을 적용하게 되면서 구글링을 해보니 생각보다 많은 정보가 없었다.

    내가 추구하는 개발 환경은 Docker로 구축하는 것이었다. 

    국내 자료가 많이 없고 , 외국 자료 역시 그렇게 많지 않았다. 

    삽질의 연속,,, 결국 기본 환경은 셋팅이 되어 정리할 겸 해서 이렇게 글로도 작성해본다.

    (혹시 모를 저와 같은 개발자 또는 미래의 내가 다시 이 상황을 맞이하게 될 것을 대비하여... )

     

    이전에 Logstash + MariaDB + ElasticSearch 로 구축한 경험이 있지만 이번 사내 프로젝트와는 맞지 않는다.

    이번에는 MongoDB + ElasticSEarch 다. 물론 Logstash 로도 구축이 가능하다는 글도 있지만 

    MongoDB와 찰떡 궁합인 Monstache라는 이 녀석을 사용하기로 해본다.

    우선 참고한 사이트를 나열해본다.

     

    1. https://medium.com/@nehajirafe/mongodb-to-elasticsearch-sync-using-monstache-cfe1177594b6

     

    MongoDB to ElasticSearch Sync using Monstache

    What is MongoDB ?

    medium.com

    이 곳에서는 mongoDB 와 ElasticSearch 의 간단 개념과 공통점과 차이점 , 그리고 data sync 를위해 Monstache 가 무엇이고 세팅방법에 대해 기술되어있다. 간단히 옮겨 보자면 

    What is Monstache ?

    Monstache는 MongoDB 컬렉션들을 Elasticsearch로 지속적으로 색인하는 Go언어로 개발된 sync 데몬이다 

    그리고 이 녀석은 루비나 파이썬, PHP와 같이 runtime에 의존하지 않고 단일 바이너리 파일이다.

    Go언어로 개발되었다고 해서 Go언어를 설치할 필요도 없다. 물론 GO언어 확장 플러그인을 설치할 것이라면 예외다.

     

    위 사이트에서 기술되어있는 내용은 개발환경(Ubuntu, 리눅스)에 설치하는 방법이기에 나에겐 해당되지 않지만 

    간단 개념과 Monstache 설정 세팅에 대한 정보는 얻었다.

     

    위에서 [[mapping]] 부분을 보게 되면 mongoDB 에 있는 common.child_info collection을 elasticsearch에 index / type을 어떻게 연결할지를 선택하는 것이다. 하지만 이번에는 아주 기본적인 설정만 다룰 것이기 때문에 이 부분은 패스한다.

     

    2. https://rwynn.github.io/monstache-site/

     

    Monstache

    From here you can search these documents. Enter your search terms below.

    rwynn.github.io

    Monstache Dev Document 사이트이다. 이곳에 모든 정보가 기록되어있다 물론 영어로 작성되어있다.

    Advanced 메뉴에 보면 Docker 파트가 있어서 다행이라고 생각했지만.. 이역시 너무 간단하게만 기술되어 있고 내가 만족할 만하지 못했다. 

     

    How to set up Monstache to sync MongoDB data to Elasticsearch?

    지금부터 어떻게 Docker기반에 Monstache를 활용하여 MongoDB 데이터를 Elasticsearch로 자동 동기화되도록 세팅했는지 기록해본다. (다시 한번 말하지만 아주 기본이 되는 세팅이다)

    참고! ubuntu 환경에서 개발한다.

     

    예를 들어 monstche 폴더가 있다고 가정하고 그 안에 위와 같이 세팅을 한다.

    1. config 폴더에는 monstache에 설정 파일이 들어갈 것이고.

    2. docker-compose파일은 elasticsearch , monstache , mongodb , kibana를 묶음으로 관리하기 위한 파일이다.

    3. elasticsearch 폴더에는 elasticsearch data 저장을 위한 폴더이다. ( 해당 폴더 안에 data 폴더도 존재한다 )

    4. mongodb 폴더에는 mongodb data 저장을 위한 폴더이다. (해당 폴더 안에는 db1, db2, db3, setup 폴더가 존재한다.)

     

    우선 docker-compose파일 먼저 확인해 보자.

    version: '3'
    
    services:
      elasticsearch:
        restart: always
        image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
        ports:
          - "9200:9200"
          - "9300:9300"
        environment:
          - ES_JAVA_OPTS=-Xms2048m -Xmx2048m
          - discovery.type=single-node
        healthcheck:
          test: "wget -q -O - http://localhost:9200/_cat/health"
          interval: 1s
          timeout: 30s
          retries: 300
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - ./elasticsearch/data:/usr/share/elasticsearch/data
        networks:
          - monstache-network
    
      kibana:
        restart: always
        image: docker.elastic.co/kibana/kibana:6.2.4
        expose:
          - 5601
        ports:
          - 5601:5601
        depends_on:
          - elasticsearch
        environment:
          - SERVER_PORT=5601
          - SERVER_NAME=kibana.example.org
          - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
        networks:
          - monstache-network
    
      monstache:
        restart: always
        image: rwynn/monstache:rel5
        command: -f ./monstache.config.toml &
        volumes:
          - ./config/monstache.config.toml:/monstache.config.toml
        depends_on:
          - elasticsearch
          - mongodb1
          - mongodb2
          - mongodb3
        links:
          - elasticsearch
        ports:
          - "8080:8080"
        networks:
          - monstache-network
    
      mongodb1:
        restart: always
        image: mongo:latest
        container_name: mongo1
        expose:
          - "27017"
        ports:
          - "27018:27017"
        volumes:
          - ./mongodb/db1:/data/db
        command: mongod --replSet rp0
        networks:
          - monstache-network
    
      mongodb2:
        restart: always
        image: mongo:latest
        container_name: mongo2
        expose:
          - "27017"
        ports:
          - "27019:27017"
        volumes:
          - ./mongodb/db2:/data/db
        command: mongod --replSet rp0
        depends_on:
          - mongodb1
        networks:
          - monstache-network
    
      mongodb3:
        restart: always
        image: mongo:latest
        container_name: mongo3
        expose:
          - "27017"
        ports:
          - "27020:27017"
        volumes:
          - ./mongodb/db3:/data/db
        command: mongod --replSet rp0
        depends_on:
          - mongodb1
        networks:
          - monstache-network
    
      mongosetup:
        image: "setup-rspl:latest"
        depends_on:
          - mongodb1
        networks:
          - monstache-network
    
    networks:
      monstache-network:
    

    docker-compose 파일에서 봐야 할 것은 mongodb 쪽이다. monstache에서는 보다 안전성을 추구하기 때문에 mongodb 가 replcaset 이 되어 있지 않으면 오류를 반환한다. 귀찮지만 테스트라도 replica 세팅까지 설정해야 하기 때문에 compose 파일 길이가 늘어난다 -ㅁ-;; 

    monstache 설명이기 때문에 다른 설명을 패스하도록 하겠다. (하지만 분명 setup-rspl docker 이미지를 미리 만들어 놔야 할 것이다.) mongodb 리플리카 셋업을 어떻게 하는지 모르는 분들은 아래 링크 참조

     

    docker + mongodb replSet 우분투 몽고디비 리플리카셋업 하기 with Docker

    지난 번에는 window 환경에서 테스트 성으로 replSet 하는 방법을 알아봤습니다 아래 링크를 통해 확인할수 있습니다. window 로컬 환경에 mongoDB replSet 셋업하기. 시스템 구축하는것은 할때마다 항상 까먹기..

    sudarlife.tistory.com

    다음 은 monstache 설정 파일을 확인해보자 

    위 설정값에 대한 내용은 위에 참고 링크 2번째 monstache 사이트에 잘 설명되어 있으니 패스하겠다. 

    여기서 내가 언급할 부분은 mongo-url과 direct-read-namespaces 가 되겠다.

    나머지 부분은 입맛에 맞게 설정하시거나 위에 설정처럼 세팅해도 상관없다. 

     

    mongo-url 

    mongo-url를 연결할 때 위와 같이 replicaset 한 url을 연결해주어야 한다.

    지금 상태는 새로운 DB를 연결한 것이기 때문에 접근 권한이 없어도 연결이 가능한 상태이지만

    라이브 DB를 연결할 때에는 계정과 비번을 적어줘야 한다 아래와 같은 방법이다.

    mongodb://[username]:[password]@mongo1:27017,mongo2:27017,mongo3:27017/servicename?replicaSet=rp0

     

    direct-read-namespaces

    보통 처음부터 검색엔진까지 세팅한 경우는 많지 않기에 어느 정도 데이터가 쌓이고 성능을 튜닝하면서 검색엔진을 도입할 것이다. 그렇다면 기존에 데이터까지 통으로 색인을 걸어줘야 하는데 그럴 때 사용하는 설정값이 바로 이 녀석이다.

    이 설정값을 넣지 않으면 monstache 세팅된 순간부터 들어오는 데이터만 감지해서 색인을 해준다.

    필요한 collection 이 있다면 direct-read-namespaces에 넣어주기만 하면 데이터를 모두 색인한다.

     

    주의사항!

    namespaces 이름을 맞게 적어줘야 한다.

    나 역시 처음에 이곳에 collection 이름만 넣으면 되는 줄 알고 넣었는데 계속해서 데이터를 색인하지 않는 것이다.

    왜 그러지 계속 삽질하다 이곳에 database명까지 넣어줘야 처리되는 것을 확인했다. 

    예) database 이름이 sudarlife이고 그 database 내부에 common.account라는 collection 이 있다면 

        direct-read-namespaces = ["sudarlife.common.account"]  // 이렇게 설정하면 되겠다.

     

     


    위와 같이 세팅 후에 docker-compose up -d 명령으로 실행 후 monstache 로그를 확인해 보았다.

    4~5번째 줄에 보면 mongoDB와 elasticsearch 가 서로 연결됨을 확인했고 

    몽고 DB에 test라는 database를 만들고 common.account collection을 만들고 그 안에 데이터를 넣어 봤다.

    아래 로그처럼 elasticsearch에 바로 색인하는 것을 알 수 있다.

    Elasticsearch에 데이터가 정상적으로 들어갔는지 확인해보자. 

    정상적으로 색인이 된 것을 확인할 수 있다.

    이상으로 docker-compose 환경으로 monstache를 통해 mongodb data를 elasticsearch로 색인하는 방법에 대해 알아봤습니다. 물론 서비스에 적용하려면 mapping과 데이터 가공해서 넣는 방법도 알아봐야 할 것이다. 조금 더 공부한 후에 서비스에 적용해야겠다.

     

    댓글

Designed by Tistory.