반응형

팀원끼리 몇 일간에 삽질끝에 설정이 완료되어 내용을 공유해보고자 합니다.

다들 몽고만 써보고 도커나 엘라스틱서치는 써본적이 없었고 이번에 환경 구성을 위해 도커를 사용하면서 엘라스틱서치와 몽고DB 레플리카셋 설정을 시작해보았습니다.

 

 

엘라스틱서치와 몽고 DB 환경 구성하기

(OS는 CentOs에서 진행되었으며, 먼저 docker와 docker-compose가 설치되어 있어야 합니다.)

 

몽고 DB와 엘라스틱서치 환경 구성을 위해서는 몽고 DB를 레플리카셋으로 구성해야하는데, (안정성때문이라고 합니다.) 이를 위해 몽고DB간에 연결을 위한 이미지를 먼저 docker-compse를 통해 생성해야 합니다.

 

setup-rspl 이미지 생성하기

파일구성

 

docker-compose.yml

version: '4'
services:
  mongo1:
    image: "mongo"
    ports:
      - "27020:27017"
    volumes:
      - /home/psw/mongodb/mongo1:/home/psw/data
    networks:
      - mongo-networks
    command: mongod --replSet replication
  mongo2:
    image: "mongo"
    ports:
      - "27021:27017"
    volumes:
      - /home/psw/mongodb/mongo2:/home/psw/data
    networks:
      - mongo-networks
    command: mongod --replSet replication
    depends_on:
      - mongo1
  mongo3:
    image: "mongo"
    ports:
      - "27022:27017"
    volumes:
      - /home/psw/mongodb/mongo3:/home/psw/data
    networks:
      - mongo-networks
    command: mongod --replSet replication
    depends_on:
      - mongo2
  mongosetup:
    image: "setup-rspl"
    depends_on:
      - mongo1
    networks:
      - mongo-networks

networks:
  mongo-networks:
    driver: bridge

 

replicaSet.js

config = {
  _id: "replication",
  members: [
    { _id: 0, host: "mongo1:27017" },
    { _id: 1, host: "mongo2:27017" },
    { _id: 2, host: "mongo3:27017" }
  ],
}

rs.initiate(config)

rs.conf()

 

setup.sh

#!/bin/bash

sleep 10 | echo Sleeping

mongo mongodb://mongo1:27017 replicaSet.js

 

Dockerfile

FROM mongo

WORKDIR /usr/src
RUN mkdir configs
WORKDIR /usr/src/configs

COPY replicaSet.js .
COPY setup.sh .

RUN chmod +x ./setup.sh

CMD ["./setup.sh"]

여기까지 세팅이 되었다면 Dockerfile이 있는 위치에서 이미지를 생성한다.

> docker build -t setup-rspl .

 

위 명령어를 날리면 이미지가 생성됩니다.

docker build -t setup-rspl .

 

Elasticsearch + 몽고DB + Monstache 환경구성하기

먼저 만들고 있던 디렉토리 상위로 올라와서 docker-compose.yml과 config, elasticsearch 디렉토리를 구성합니다.

구성할 환경

 

config내부에는 monstache설정파일이 위치하며, elasticsearch디렉토리에는 data디렉토리가 존재하고 비워둡니다.(필요없어보이긴한다...)

아래처럼 다시 환경 구성을 시작합니다.

 

docker-compose.yml

version: "3"

services:
  elasticsearch:
    restart: always
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.14
    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:/home/psw/elasticsearch/data
    networks:
      - monstache-network

  kibana:
    restart: always
    image: docker.elastic.co/kibana/kibana:6.8.14
    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 /home/monstache.config.toml &
    volumes:
      - /home/psw/config/monstache.config.toml:/home/monstache.config.toml
    depends_on:
      - elasticsearch
      - mongo1
      - mongo2
      - mongo3
    links:
      - elasticsearch
    ports:
      - "8080:8080"
    networks:
      - monstache-network

  mongo1:
    image: "mongo"
    ports:
      - "27020:27017"
    volumes:
      - /home/psw/mongodb/mongo1:/home/psw/data
    networks:
      - monstache-network
    command: mongod --replSet replication
  mongo2:
    image: "mongo"
    ports:
      - "27021:27017"
    volumes:
      - /home/psw/mongodb/mongo2:/home/psw/data
    networks:
      - monstache-network
    command: mongod --replSet replication
    depends_on:
      - mongo1
  mongo3:
    image: "mongo"
    ports:
      - "27022:27017"
    volumes:
      - /home/psw/mongodb/mongo3:/home/psw/data
    networks:
      - monstache-network
    command: mongod --replSet replication
    depends_on:
      - mongo2
  mongosetup:
    image: "setup-rspl"
    depends_on:
      - mongo1
    networks:
      - monstache-network

networks:
  monstache-network:
    driver: bridge

 

/config/monstache.config.toml

mongo-url = "mongodb://mongo1:27017,mongo2:27017,mongo3:27017/test?replicaSet=replication"
elasticsearch-urls = ["http://elasticsearch:9200"]
elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000
dropped-collections = false
dropped-databases = false

namespace-regex = "^test"
direct-read-namespaces = ["book","log"]

환경 구성이 완료되면 docker-compose를 통해 서비스를 시작합니다.

> docker-compose up -d

 

-d는 백그라운드로 구동하겠다는 뜻입니다.

  • docker-compose 명령어 정리
docker-compse up 설정된 서비스 컨테이너를 생성 및 시작
docker-compose down 설정된 서비스 컨테이너 덩어리를 삭제(제거)
docker-compose start 설정된 서비스 컨테이너 구동
docker-compose stop 설정된 컨테이너 멈춤

서비스를 종료하고자 할때는 위에 명령어를 적어놨지만 stop으로 종료하고, 완전히 정보를 날리고자 할때는 down으로 컨테이너를 제거할 수 있다.(down은 데이터가 소멸된다. remove효과)

 

 

> docker ps

명령어를 통해 서비스들이 잘 올라왔는지 확인해봅니다.

docker를 설치하면서 시각화 서비스인 포트테이너가 있다면 웹에서 확인해도 좋다. 설정이 잘 못되어 정상적으로 올라오지 않은 경우 쉽게 로그 확인이 가능합니다.

▲ 포트테이너를 통해 확인한 서비스중인 컨테이너 리스트
▲ 동작중인 컨테이너의 로그를 확인 할 수 있다.

 

동작 확인하기

엘라스틱서치까지 healthy로 올라오면 postman이나 브라우저를 통해 9200으로 데이터를 확인해봅니다.

 

처음에는 DB에 데이터가 없을텐데 접속정보의 mongo1로 접속하여 데이터를 삽입해봅니다.

test 데이터베이스를 생성하고, book Collections에 간단하게 두 줄을 넣어봤습니다.

 

 

자 데이터를 넣었으니 조회가 되는지 확인해보겠습니다~

▲ GET > http://IP:PORT/_cat/indices?v

_cat/indices를 통해 엘라스틱서치에 등록된 index정보 리스트를 볼 수 있습니다.

test.book이 추가된 걸 볼 수 있네요.

 

 

특정 인덱스의 데이터 전체 검색

전체 검색을 해보겠습니다.

▲ GET > http://IP:PORT/test.book/_search  index/_search를 통해 검색

 

 

특정 인덱스의 특정 컬럼 조회

이번엔 특정 데이터를 받아보겠습니다.

▲ GET > http://IP:PORT/test.book/_search?q=name:"왜 나는 너를 사랑하는가"

 

 

like 검색해보기

이번에는 like문 검색방법입니다.

POST 방식으로 요청하고 body안에 raw형태로 아래의 형태로 전송을 해봅니다.

  • POST method
  • Headers : Content-Type : application/json
  • Body :
{
  "query" : {
      "bool": {
        "must": {
          "wildcard": {
            "name": "*나는*"
          }
        }
      }
  }
}

 

▲ POST > http://IP:PORT/test.book/_search

 

잘 검색된다!




  

반응형