MongoDB 3.6 on Ubuntu

5 분 소요

이 문서는 Ubuntu/Debian 계열 정규 배포본에 3.x 버전을 지원하지 않는 플랫폼에 MongoDB Community Edition 3.6 버전을 설치하는 과정을 정리하고 있다. 내용의 기초는 MongoDB Community Edition 3.6 버전을 Amd64, Arm64 지원하는 64bit OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행하고 경험상 필요한 부분을 추가로 정리했다.

  • MongoDB Community Edition 3.6 설치
  • Mongo Database 구성

Install MongoDB 3.6 Community edition

문서에 따르면 리눅스 계열은 Ubuntu, Red Hat, SUSE, Amazon, Debian 과 tarball 설치를 지원한다. 또한 macOS, Windows 플랫폼 설치도 지원한다고 한다.

테스트한 플랫폼은

  • 64bit Ubuntu 16.04:
  • Hardkernel Odroid C2: 64bit, Armbian

MongoDB는 다음 패키지를 지원하고 있다:

  • mongodb-org : 다음 패키지를 설치하기 위한 메타 패키지
  • mongodb-org-server : mongod daemon 과 구성 및 초기 스크립트.
  • mongodb-org-mongos : mongos daemon.
  • mongodb-org-shell : mongo shell.
  • mongodb-org-tools : MongoDB 유틸리티: mongoimport bsondump, mongodump, mongoexport, mongofiles, mongoperf, mongorestore, mongostat, and mongotop.

사전준비

네이버 NCloud에서 Micro server를 하나 생성한 후에, MongoDB Community Edition을 설치했고, ncloud의 Ubuntu 16.01 이미지로 서버를 생성한 후에 업그레이드해서 16.04.4 LTS 버전에서 설치했다.

레포지토리 등록

인증된 .dpkg, .apt 패키지를 설치하기 위해, 아래 처럼 서버의 키를 등록한다.

여러분 시스템이 적용되는 지는 1에 잘 설명되어 있다.

키서버 등록

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5

MongoDB용 소스 리스트 추가

apt의 source list에 mongodb repository를 등록한다. 우분투 계열은 파일 생셩 /etc/apt/sources.list.d/mongodb-org-3.6.list 파일 생성하고 아래 같이 해당 리눅스 버전에 맞는 소스 목록을 추가한다.

Ubuntu 16.04

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list

Ubuntu 14.04

echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list

remove key & ppa

설치 후 필요 없어서 키 서버, 저장소 목록을 지우려면, 삭제할 키 해시 8자리 코드를 확인한다.

sudo apt-key list

pub   4096R/A15703C6 2016-01-11 [expires: 2018-01-10]
uid                  MongoDB 3.4 Release Signing Key <packaging@mongodb.com>

이 키를 삭제한다.

sudo apt-key del A15703C6

설치

그리고 apt 명령으로 소스 캐시를 갱신하고 mongodb-org 커뮤니티 버전의 mongodb를 설치한다.

sudo apt update
sudo apt install -y mongodb-org

mongodb 3.x 버전은 데이터 저장 파일 시스템으로 xfs 를 권장하고 있다.

만약 특정 버전을 설치하려면 다음 같이 버전을 명시한다.

sudo apt-get install -y mongodb-org=3.6.5 mongodb-org-server=3.6.5 mongodb-org-shell=3.6.5 mongodb-org-mongos=3.6.5 mongodb-org-tools=3.6.5



Run

MongoDB Community Edition이 설치되면 요구되는 파일 및 폴더가 다음 위치에 생성됟다.

  • /var/lib/mongodb : 기본 데이터 파일 위치
  • /var/log/mongodb : 기본 로그 저장 폴더
  • /etc/mongod.conf : mongod 구성 파일. 로그, 데이터 위치 등을 변경 가능

mongod 데몬은 mongodb user account 계정으로 실행된다.

systemd

systemd 서비스 파일이 /lib/systemd/system/mongod.service에 위치한다.

$ sudo systemctl status mongod
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: https://docs.mongodb.org/manual

systemctl 명령으로 mongod 를 시작한다.

sudo systemctl start mongod
sudo systemctl status mongod

실행중인 mongod를 확인해 보면

$ ps -ef |grep mongod
mongodb  15385     1  1 12:06 ?        00:00:00 /usr/bin/mongod --config /etc/mongod.conf
root     15445 15033  0 12:07 pts/0    00:00:00 grep --color=auto mongod

만약 Community Edition 설치후 systemd 파일이 없다면, 이어지는 create systemd service endtry 섹션을 참조해 추가하면 된다.

create systemd service entry

설치후 시스템 사용자 mongodb 가 없으면 새로 만든다.

$ sudo adduser --disabled-password --gecos "" --no-create-home --disabled-password --disabled-login mongodb

systemd service entry

systemd 서비스로 mongod 서비스를 제공하려면 아래 같이 한다.

mongodb-org 설치후 systemctl 스크립트가 /etc/init.d에 복사되지 않았다.

여기서는 odroid-c2 armbian 설치 상태, 일반 리눅스 배포본은 잘 된다.

아래 명령을 실행해 mongodb.service 가 없으면 새로 생성해야 한다.

$ sudo systemctl list-unit-files --type=service |grep mongodb

만약 mongodb.service 가 없다면, /lib/systemd/system/mongod.service 파일을 다음 같이 활성화 시켜준다.

$ cd /lib/systemd/system
$ sudo systemctl enable mongodb.service

mongodb.service 가 있고,

$ sudo systemctl list-unit-files --type=service |grep mongodb
mongodb.service             disabled

disable 상태면 systemctl 명령으로 enable 시킨다.

$ sudo systemctl enable mongodb.service

그리고 서비스를 시작한다.

$ sudo systemctl start mongod.service
$ sudo systemctl status mongod.service
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-07-18 09:17:53 UTC; 1s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 7234 (mongod)
   CGroup: /system.slice/mongod.service
           └─7234 /usr/bin/mongod --config /etc/mongod.conf

Jul 18 09:17:53 odroidc2 systemd[1]: Started High-performance, schema-free document-oriented database.

mongod 서비스가 제대로 실행됐으면 mongo 클라이언트로 테스트해 볼 수 있으면 접속해 볼 수 있다.



Mongo Database 구성

최초 설치후 데이터베이스를 구성해서 데이터 파일, 로그 그리고 인증 사용자 접근 제어를 하는 과정을 정리했다.

  • mongodb 설정
  • mongodb auth

현재 실행중인 mongod 를 종료한다.

sudo systemctl stop mongod.service

MongoDB 설정

Mongo Database를 사용하기 위해서 데이터 파일 위치, 로그, 포트, Ip 주소 등에 대한 구성을 mongod.conf 에서 할 수 있다. 수정된 구성이 작동하는지 mongo 클라이언트로 접속해서 테스트한다.

mongod.conf

/etc/mongod.conf 파일에 인증을 제외데이터 디렉토리, bindIp, 로그 부분만 설정한다.

storage:
  dbPath: /data/mongodata/
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

processManagement:
   fork: true

net:
  port: 27017
  bindIp: 127.0.0.1,192.168.0.20
  • dbPath : 데이터베이스 스토리지 위치
  • bindIp: 서버 외에서 mongo 클라이언트가 접근하려면 IP 를 입력한다.


Directory permissions

로그 디렉토리 /var/log/mongo 그리고 데이터 디렉토리 /data/mongodata 라면 해당 디렉토리에 몽고디비 사용자가 쓸 수 있는 퍼미션을 준다.

$ sudo chown mongo.daemon /var/log/mongodb
$ sudo chown mongodb.mongodb /data/mongodata



mongo 접속 테스트

설정을 구성하고 제대로 동작하는지 확인하기 위해서, mongod 를 수동으로 시작해서 설정 파일 등이 제대로 동작하는지 확인하다. 다음 같이 mongod 를 시작해 동작을 확인한다.

$ sudo mongod --port 27017 --dbpath /data/mongodata
...

이어서 클라이언트로 데이터베이스에 접속한다.접속에 성공하면 > 프롬프트가 나온다.

$mongo
>

현재 데이터베이스 사용자가 비인증으로 접속할 수 있는데, mongo 클라이언트에서 인증된 사용자만 접속하려면 –auth 옵션을 사용하고, 데이터베이스 사용자에 대한 인증 처리가 되야 한다.

Authentication

현재는 mongod.conf 설정 파일 혹은 mongod 시작시 접근 제어가 없는 상태에서 mongo 클라이언트로 접속한 후에 admin 데이터베이스로 전환한다.

> use admin
switched to db admin
>

admin 데이터베이스에서 관리자 role을 가진 사용자를 추가하고, 사용할 데이터베이스의 사용자와 접근 제어를 추가해서 사용하기 위해서 작업한다.

데이터베이스 관리를 위한 사용자로서 userAdmin role 혹은 userAdminAnyDatabase role을 가진 사용자 만든다. 다음은 admin 데이터베이스에서 사용자를 관리하는 admin 계정을 생성하고 있다.

>db.createUser(
  {
    user:'admin', 
    pwd:'****', 
    roles:['userAdminAnyDatabase']
  }
)
Successfully added user: { "user" : "admin", "roles" : [ "userAdminAnyDatabase" ] }
>
> db.getUsers()

admin 사용자 패스워드 변경

> db.changeUserPassword("accountUser", "SOh3TbYhx8ypJPxmt1oOfL")

사용자의 role 을 변경,

> db.grantRolesToUser( 'admin', [{role: 'userAdmin', db:'admin'}])
> db.getUsers()
[
  {
    "_id" : "admin.admin",
    "user" : "admin",
    "db" : "admin",
    "roles" : [
      {
        "role" : "userAdmin",
        "db" : "admin"
      },
      {
        "role" : "userAdminAnyDatabase",
        "db" : "admin"
      }
    ]
  }
]

혹은 updateUser 를 사용할 수 있다:

db.updateUser( "appClient01", ...



Start with Access Control

앞서 시작한 명령행 mongod 를 종료하고 명령에서 재시작 --auth 옵션을 붙여 시작한다.

$ mongod --auth --port 27017 --dbpath /data/mongodata

접근제어 --auth 옵션으로 데이터베이스를 시작하면, mongo 클리이언트 로그인시 -u <username>, -p <password>--authenticationDatabase <database> 를 지정해 주어야 한다.

$ mongo --port 27017 -u "admin" -p "****" --authenticationDatabase "admin"
MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0
>

인증 테스트가 성공했으면 명령행으로 시작한 mongod 는 종료하고 설정 파일에 인증을 넣자.


mongod.conf 파일

mongodb.conf 파일에 security.authorization 을 활성화 한다

security:
  authorization: enabled

systemd 서비스를 재시작 한다.

$ sudo systemctl restart mongod.service
$ sudo systemctl status mongod.service



MongoDB에 관련 글

MongoDB Community Edition 시리즈:

  1. Install MongoDB Community Edition 3.4 for Arm64
  2. Install MongoDB Community Edition 3.6
  3. MongoDB User Authentication

MongoDB 관련:

댓글남기기