2. MongoDB Community Edition
1. MongoDB 웹 사이트 확인
- Ubuntu용 MongoDB Community Edition 설치는 MongDB 웹 사이트에서 확인한다.
2. Overview
- 적절한
apt
패키지 관리자를 사용하여 Ubuntu Linux의 LTS(장기 지원) 릴리스에 MongoDB 5.0 Community Edition을 설치한다.
1) MongoDB Version
- 이 튜토리얼은 MongoDB 5.0 Community Edition을 설치한다.
- 다른 버전의 MongoDB Community를 설치하려면 페이지의 왼쪽 상단 모서리에 있는 버전 드롭다운 메뉴를 사용하여 해당 버전에 대한 설명서를 선택한다.
3. Considerations
1) Platform Support
- MongoDB 5.0 Community Edition은 x86_64 아키텍처에서 다음 64비트 Ubuntu LTS(장기 지원) 릴리스를 지원한다.
1] 20.04 LTS
2] 18.04 LTS
3] 16.04 LTS
- MongoDB는 이러한 플랫폼의 64비트 버전을 지원한다.
- 또한 일부 플랫폼에서 ARM64 아키텍처도 지원한다.
2) Production Notes
- 프로덕션 환경에 MongoDB를 배포하기 전에 프로덕션 MongoDB 배포에 대한 성능 고려 사항 및 구성 권장 사항을 제공하는 프로덕션 노트 문서를 확인한다.
3) Official MongoDB Packages
- Ubuntu 시스템에 MongoDB 커뮤니티를 설치하기 위해 이 지침에서는 MongoDB Inc.에서 유지 관리하고 지원하는 공식
mongodb-org
패키지를 사용한다. - 공식
mongodb-org
패키지에는 항상 최신 버전의 MongoDB가 포함되어 있다. - Ubuntu에서 제공하는
mongodb
패키지는 MongoDB Inc.에서 관리하지 않으며 공식mongodb-org
패키지와 충돌한다. - Ubuntu 시스템에
mongodb
패키지를 이미 설치한 경우 이 지침을 진행하기 전에 먼저mongodb
패키지를 제거해야 한다.
4. Install MongoDB Community Edition
apt
패키지 관리자를 사용하여 MongoDB Community Edition을 설치하려면 다음 단계를 따른다.
1) 패키지 관리 시스템에서 사용하는 공개 키를 가져온다
- 패키지 관리 시스템에서 사용하는 공개 키를 가져온다.
- 터미널에서 다음 명령을 실행하여
https://www.mongodb.org/static/pgp/server-5.0.asc
에서 MongoDB 공개 GPG 키를 가져온다.
- 이 작업은
OK
로 응답해야 한다. - 하지만
gnupg
가 설치되지 않았다는 오류를 수신하는 경우 다음 단계를 따른다. - 다음 명령을 사용하여
gnupg
및 필요한 라이브러리를 설치한다.
- 설치가 완료되면 키를 다시 가져온다.
2) MongoDB에 대한 목록 파일을 만든다
- Ubuntu 버전에 대한 목록 파일
/etc/apt/sources.list.d/mongodb-org-5.0.list
를 만든다. - Ubuntu 버전에 해당하는 탭을 클릭한다.
- 호스트에서 실행 중인 Ubuntu 버전이 확실하지 않은 경우 호스트에서 터미널 또는 셸을 열고
lsb_release -dc
를 실행한다.
- 다음 지침은 Ubuntu 20.04(Focal)용이다.
- Ubuntu 20.04(Focal)용
/etc/apt/sources.list.d/mongodb-org-5.0.list
파일을 만든다.
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
3) 로컬 패키지 데이터베이스를 다시 로드한다
- 다음 명령을 실행하여 로컬 패키지 데이터베이스를 다시 로드한다.
4) MongoDB 패키지를 설치한다
- 최신 안정 버전의 MongoDB 또는 특정 버전의 MongoDB를 설치할 수 있다.
- 최신 안정 버전을 설치하려면 다음을 실행한다.
- 옵션 사항이지만, 사용 가능한 모든 버전의 MongoDB를 지정할 수 있지만
apt-get
은 새 버전을 사용할 수 있게 되면 패키지를 업그레이드한다. - 의도하지 않은 업그레이드를 방지하기 위해 현재 설치된 버전에서 패키지를 고정할 수 있다.
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
5. Run MongoDB Community Edition
1) ulimit
Considerations
- 대부분의 유닉스 계열 운영 체제는 프로세스가 사용할 수 있는 시스템 리소스를 제한한다.
- 이러한 제한은 MongoDB 작업에 부정적인 영향을 줄 수 있으므로 조정해야 한다.
- mongoDB 4.4부터
open files
의ulimit
값이64000
미만이면 시작 오류가 생성된다. - 플랫폼에 권장되는 설정은 UNIX
ulimit
설정을 참조한다.
2) Directories
- 패키지 관리자를 통해 설치했다면 설치 과정에서 데이터 디렉토리
/var/lib/mongodb
와 로그 디렉토리/var/log/mongodb
가 생성된다. - 기본적으로 MongoDB는
mongodb
사용자 계정을 사용하여 실행된다. - MongoDB 프로세스를 실행하는 사용자를 변경하는 경우 데이터 및 로그 디렉터리에 대한 권한도 수정하여 이 사용자에게 이러한 디렉터리에 대한 액세스 권한을 부여해야 한다.
3) Configuration File
- 공식 MongoDB 패키지에는 구성 파일(
/etc/mongod.conf
)이 포함되어 있다. - 이러한 설정(예: 데이터 디렉터리 및 로그 디렉터리 사양)은 시작 시 적용된다.
- 즉, MongoDB 인스턴스가 실행되는 동안 구성 파일을 변경하는 경우 변경 사항을 적용하려면 인스턴스를 다시 시작해야 한다.
6. Procedure
- 시스템에서 MongoDB Community Edition을 실행하려면 다음 단계를 따른다.
- 이 지침에서는 Ubuntu에서 제공하는 비공식
mongodb
패키지가 아닌 공식mongodb-org
패키지를 사용하고 기본 설정을 사용한다고 가정한다.
mongod
프로세스를 실행하고 관리하려면 운영 체제에 내장된 init 시스템을 사용하게 된다.- 최신 버전의 Linux는
systemd
(systemctl
명령 사용)를 사용하는 경향이 있는 반면 이전 버전의 Linux는System V init
(service
명령 사용)를 사용하는 경향이 있다.
- 만약 플랫폼에서 사용하는 초기화 시스템이 확실하지 않은 경우 다음 명령을 실행한다.
- 그런 다음 결과에 따라 아래에서 적절한 탭을 선택하여 진행한다.
1) systemd
(systemctl
)
- 다음은
systemd
(systemctl
)인 경우의 초기화 방법이다.
- 다음 명령을 실행하여
mongod
프로세스를 시작할 수 있다.
mongod
를 시작할 때Failed to start mongod.service: Unit mongod.service not found.
와 유사한 오류가 표시되는 경우가 있다.- 그럼 먼저 다음 명령을 실행한다.
- 그런 다음 위의 시작 명령을 다시 실행한다.
- MongoDB가 성공적으로 시작되었는지 확인한다.
- 옵션 사항으로, 다음 명령을 실행하여 시스템 재부팅 후 MongoDB가 시작되도록 할 수 있다.
- 필요에 따라 다음 명령을 실행하여
mongod
프로세스를 중지할 수 있다.
- 또한, 다음 명령을 실행하여
mongod
프로세스를 다시 시작할 수 있다.
/var/log/mongodb/mongod.log
파일의 출력을 보고 오류 또는 중요한 메시지에 대한 프로세스 상태를 확인할 수 있다.
mongod
와 동일한 호스트 시스템에서mongosh
세션을 시작한다.- 기본 포트
27017
로 로컬 호스트에서 실행 중인mongod
에 연결하기 위해 명령줄 옵션 없이mongosh
를 실행할 수 있다.
- 다른 호스트 및/또는 포트에서 실행 중인
mongod
인스턴스에 연결하는 것과 같이mongosh
를 사용하여 연결하는 방법에 대한 자세한 내용은mongosh
설명서를 참조한다.
2) System V Init
(service
)
- 다음은
System V Init
(service
)인 경우의 초기화 방법이다.
- 다음 명령을 실행하여
mongod
프로세스를 시작할 수 있다.
- 하지만 위와 같이 실행했을 때
mongod: unrecognized service
라는 메시지가 출력된다. - 이유는
service
명령어로 실행할mongod
의 스크립트가 없기 때문으로 다음과 같이 해결할 수 있다.
sudo touch /etc/init.d/mongod && \
sudo chmod -R 755 /etc/init.d/mongod && \
sudo vim /etc/init.d/mongod
#!/bin/sh
#
# init.d script with LSB support.
#
# Copyright (c) 2007 Javier Fernandez-Sanguino <jfs@debian.org>
#
# This is free software; you may redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2,
# or (at your option) any later version.
#
# This is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License with
# the Debian operating system, in /usr/share/common-licenses/GPL; if
# not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
#
### BEGIN INIT INFO
# Provides: mongod
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Should-Start: $named
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: An object/document-oriented database
# Description: MongoDB is a high-performance, open source, schema-free
# document-oriented data store that's easy to deploy, manage
# and use. It's network accessible, written in C++ and offers
# the following features:
#
# * Collection oriented storage - easy storage of object-
# style data
# * Full index support, including on inner objects
# * Query profiling
# * Replication and fail-over support
# * Efficient storage of binary data including large
# objects (e.g. videos)
# * Automatic partitioning for cloud-level scalability
#
# High performance, scalability, and reasonable depth of
# functionality are the goals for the project.
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/mongod
DESC=database
NAME=mongod
# Defaults. Can be overridden by the /etc/default/$NAME
# Other configuration options are located in $CONF file. See here for more:
# http://dochub.mongodb.org/core/configurationoptions
CONF=/etc/mongod.conf
PIDFILE=/var/run/$NAME.pid
ENABLE_MONGOD=yes
# Include mongodb defaults if available.
# All variables set before this point can be overridden by users, by
# setting them directly in the defaults file. Use this to explicitly
# override these values, at your own risk.
if [ -f /etc/default/$NAME ] ; then
. /etc/default/$NAME
fi
# Handle NUMA access to CPUs (SERVER-3574)
# This verifies the existence of numactl as well as testing that the command works
NUMACTL_ARGS="--interleave=all"
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
then
NUMACTL="`which numactl` -- $NUMACTL_ARGS"
DAEMON_OPTS=${DAEMON_OPTS:-"--config $CONF"}
else
NUMACTL=""
DAEMON_OPTS="-- "${DAEMON_OPTS:-"--config $CONF"}
fi
if test ! -x $DAEMON; then
echo "Could not find $DAEMON"
exit 0
fi
if test "x$ENABLE_MONGOD" != "xyes"; then
exit 0
fi
. /lib/lsb/init-functions
STARTTIME=1
DIETIME=10 # Time to wait for the server to die, in seconds
# If this value is set too low you might not
# let some servers to die gracefully and
# 'restart' will not work
DAEMONUSER=${DAEMONUSER:-mongodb}
DAEMONGROUP=${DAEMONGROUP:-mongodb}
set -e
running_pid() {
# Check if a given process pid's cmdline matches a given name
pid=$1
name=$2
[ -z "$pid" ] && return 1
[ ! -d /proc/$pid ] && return 1
cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
# Is this the expected server
[ "$cmd" != "$name" ] && return 1
return 0
}
running() {
# Check if the process is running looking at /proc
# (works for all users)
# No pidfile, probably no daemon present
[ ! -f "$PIDFILE" ] && return 1
pid=`cat $PIDFILE`
running_pid $pid $DAEMON || return 1
return 0
}
start_server() {
# Recommended ulimit values for mongod or mongos
# See https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings
#
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -l unlimited
# In dash, ulimit takes -p for maximum user processes
# In bash, it's -u
if readlink /proc/$$/exe | grep -q dash
then
ulimit -p 64000
else
ulimit -u 64000
fi
# Start the process using the wrapper
start-stop-daemon --background --start --quiet --pidfile $PIDFILE \
--make-pidfile --chuid $DAEMONUSER:$DAEMONGROUP \
--exec $NUMACTL $DAEMON $DAEMON_OPTS
errcode=$?
return $errcode
}
stop_server() {
# Stop the process using the wrapper
start-stop-daemon --stop --quiet --pidfile $PIDFILE \
--retry 300 \
--user $DAEMONUSER \
--exec $DAEMON
errcode=$?
return $errcode
}
force_stop() {
# Force the process to die killing it manually
[ ! -e "$PIDFILE" ] && return
if running ; then
kill -15 $pid
# Is it really dead?
sleep "$DIETIME"s
if running ; then
kill -9 $pid
sleep "$DIETIME"s
if running ; then
echo "Cannot kill $NAME (pid=$pid)!"
exit 1
fi
fi
fi
rm -f $PIDFILE
}
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
# Check if it's running first
if running ; then
log_progress_msg "apparently already running"
log_end_msg 0
exit 0
fi
if start_server ; then
# NOTE: Some servers might die some time after they start,
# this code will detect this issue if STARTTIME is set
# to a reasonable value
[ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time
if running ; then
# It's ok, the server started and is running
log_end_msg 0
else
# It is not running after we did start
log_end_msg 1
fi
else
# Either we could not start it
log_end_msg 1
fi
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
if running ; then
# Only stop the server if we see it running
errcode=0
stop_server || errcode=$?
log_end_msg $errcode
else
# If it's not running don't do anything
log_progress_msg "apparently not running"
log_end_msg 0
exit 0
fi
;;
force-stop)
# First try to stop gracefully the program
$0 stop
if running; then
# If it's still running try to kill it more forcefully
log_daemon_msg "Stopping (force) $DESC" "$NAME"
errcode=0
force_stop || errcode=$?
log_end_msg $errcode
fi
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
errcode=0
stop_server || errcode=$?
# Wait some sensible amount, some server need this
[ -n "$DIETIME" ] && sleep $DIETIME
start_server || errcode=$?
[ -n "$STARTTIME" ] && sleep $STARTTIME
running || errcode=$?
log_end_msg $errcode
;;
status)
log_daemon_msg "Checking status of $DESC" "$NAME"
if running ; then
log_progress_msg "running"
log_end_msg 0
else
log_progress_msg "apparently not running"
log_end_msg 1
exit 1
fi
;;
# MongoDB can't reload its configuration.
reload)
log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
log_warning_msg "cannot re-read the config file (use restart)."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
exit 1
;;
esac
exit 0
- 위와 같이 진행하면 이제
sudo service mongod 명령
을 사용할 수 있다.
- MongoDB가 성공적으로 시작되었는지 확인한다.
- 기본적으로
/var/log/mongodb/mongod.log
에 있는mongod
프로세스의 현재 상태에 대한 로그 파일을 확인할 수도 있다. - 실행 중인
mongod
인스턴스는 다음 줄을 사용하여 연결할 준비가 되었음을 나타낸다.
- 필요에 따라 다음 명령을 실행하여
mongod
프로세스를 중지할 수 있다.
- 또한, 다음 명령을 실행하여
mongod
프로세스를 다시 시작할 수 있다.
mongod
와 동일한 호스트 시스템에서mongosh
세션을 시작한다.- 기본 포트
27017
로 로컬 호스트에서 실행 중인mongod
에 연결하기 위해 명령줄 옵션 없이mongosh
를 실행할 수 있다.
- 다른 호스트 및/또는 포트에서 실행 중인
mongod
인스턴스에 연결하는 것과 같이mongosh
를 사용하여 연결하는 방법에 대한 자세한 내용은mongosh
설명서를 참조한다.
7. Uninstall MongoDB Community Edition
- 시스템에서 MongoDB를 완전히 제거하려면 MongoDB 애플리케이션 자체, 구성 파일, 데이터 및 로그가 포함된 모든 디렉토리를 제거해야 한다.
- 다음 섹션에서는 필요한 단계를 안내한다.
1) MongoDB를 중지한다
- 다음 명령을 실행하여
mongod
프로세스를 중지한다.
2) 패키지를 제거한다
- 이전에 설치한 모든 MongoDB 패키지를 제거한다.
3) 데이터 디렉토리를 제거한다
- MongoDB 데이터베이스 및 로그 파일을 제거한다.
8. Additional Information
1) Localhost Binding by Default
- 기본적으로 MongoDB는 localhost 네트워크 인터페이스에 바인딩되는
bindIp
가127.0.0.1
로 설정된 상태에서 시작된다. - 이는
mongod
가 동일한 시스템에서 실행 중인 클라이언트의 연결만 수락할 수 있음을 의미한다. - 원격 클라이언트는
mongod
에 연결할 수 없으며 이 값이 유효한 네트워크 인터페이스로 설정되어 있지 않으면mongod
는 복제 세트를 초기화할 수 없다. bindIP
값은 MongoDB configuration file(/etc/mongod.conf
)에 있는bindIP
를 변경하거나 커맨드 라인 인수인--bind_ip
를 변경한다.