Last Updated on 3월 7, 2024 by Jade(정현호)
안녕하세요
이번 포스팅에서는 MongoDB 4.4 버전 설치에 대해서 확인해보도록 하겠습니다.
Contents
Platform Support
MongoDB 4.4 Community Edition 은 아래의 RPM OS 기준으로 Red Hat Enterprise Linux (RHEL), CentOS Linux, and Oracle Linux 의 64-bit(x86_64 architecture) versions , Amazon Linux 2 을 지원합니다.
• RHEL / CentOS / Oracle 8
• RHEL / CentOS / Oracle 7
• RHEL / CentOS / Oracle 6
• Amazon Linux 2
그 외 Debian , Suse , Ubuntu 등을 지원하며 또한 ARM64 과 s390x 아키텍처 platform 지원합니다.
Oracle Linux 에서 MongoDB 는 사용시 오직 Red Hat Compatible Kernel (RHCK) 만 지원하고 있습니다.
MongoDB는 Unbreakable Enterprise Kernel (UEK) 에 대해서는 지원하고 있지 않고 있습니다.
그 외 자세한 사항은 Supported Platforms 문서를 참조하시면 됩니다
Note
MoongoDB 4.4 에서는 Windows Subsystem for Linux (WSL) 환경은 지원하지 않습니다.
Windows Subsystem for Linux (WSL) - Unsupported
MongoDB does not support the Windows Subsystem for Linux (WSL)
MoongoDB 5.0 버전 부터 WLS 를 지원하고 있습니다.
Ubuntu 22.04 환경에서 MongoDB 5.0 버전 설치에 대한 정보가 필요하실 경우 아래 포스팅을 참조하시면 됩니다.
MongoDB 설치
설치하는 방법은 크게 패키지와 tarballs(바이너리 압축/해제) 방식이 있습니다.
포스팅에서는 Centos 7.9 버전에서 MongoDB 4.4 버전을 yum을 이용한 패키지 설치를 진행하였습니다.
Repository 설정
yum(또는 dnf) 로 설치하기 위해서 먼저 yum(dnf) repository 가 설정되어 있어야 합니다.
mongodb-org-4.4.repo 파일에 내용을 추가하도록 하겠습니다.
sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo ## 아래 내용 입력 [mongodb-org-4.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
패키지 설치
yum(dnf) 를 통해 설치하도록 하겠습니다.
sudo yum install -y mongodb-org < ...내용 중략 ... > Installed: mongodb-org.x86_64 0:4.4.10-1.el7 Dependency Installed: cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7 cyrus-sasl-plain.x86_64 0:2.1.26-23.el7 mongodb-database-tools.x86_64 0:100.5.1-1 mongodb-org-database-tools-extra.x86_64 0:4.4.10-1.el7 mongodb-org-mongos.x86_64 0:4.4.10-1.el7 mongodb-org-server.x86_64 0:4.4.10-1.el7 mongodb-org-shell.x86_64 0:4.4.10-1.el7 mongodb-org-tools.x86_64 0:4.4.10-1.el7
yum(dnf) 명령어를 통해서 패키지를 설치하게 되면 mongod 유저 및 필요한 디렉토리는 생성이 되게 됩니다.
# 유저 확인 grep mongod /etc/passwd;grep mongod /etc/group mongod:x:499:992:mongod:/var/lib/mongo:/bin/false mongod:x:992: # 디렉토리 확인 # ls -al /var/lib/ | grep mongo drwxr-xr-x. 2 mongod mongod 6 Oct 14 06:22 mongo # ls -al /var/log/ | grep mongo drwxr-xr-x. 2 mongod mongod 24 Dec 5 15:43 mongodb
tarballs 형태로 설치 시에는 유저/그룹 생성과 디렉토리 생성 및 소유권 변경 등의 작업이 필요 합니다.
추가 설정
MongoDB 에서 권장되는 OS 측면의 설정 몇 가지를 진행하도록 하겠습니다.
THP 옵션 비활성화
Transparent Huge Page(THP) 기능을 비활성화가 필요하며 서비스를 생성하여 진행하겠습니다.
sudo vi /etc/systemd/system/disable-transparent-huge-pages.service ## 아래 내용으로 작성 [Unit] Description=Disable Transparent Huge Pages (THP) DefaultDependencies=no After=sysinit.target local-fs.target Before=mongod.service [Service] Type=oneshot ExecStart=/bin/sh -c "echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled && echo 'never' >/sys/kernel/mm/transparent_hugepage/defrag" [Install] WantedBy=basic.target
서비스 파일 작성이 되었다면 아래 순서대로 서비스 활성화 및 시작을 진행합니다.
sudo systemctl daemon-reload sudo systemctl enable disable-transparent-huge-pages sudo systemctl start disable-transparent-huge-pages
서비스를 시작 후 에 정상적으로 THP 기능이 비활성화 되었는지는 아래와 같이 확인할 수 있습니다.
cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] cat /sys/kernel/mm/transparent_hugepage/defrag always madvise [never]
[never] 로 선택되어 있다면 비활성화가 된 상태입니다.
Red Hat Enterprise Linux 및 다른 Red Hat 기반 파생 제품에서는 아래 경로를 대신 사용해야 할 수도 있습니다.
/sys/kernel/mm/redhat_transparent_hugepage/enabled
/sys/kernel/mm/redhat_transparent_hugepage/defrag
ulimit 설정
ulimit 의 open files 값이 64000 미만이면 MongoDB 시작 오류가 발생될 수 있으므로 설정이 필요하며, 또한 권장되는 nproc 값에 대해서도 수정하도록 하겠습니다.
sudo vi /etc/security/limits.conf ## 아래 내용 입력 mongod soft nofile 64000 mongod hard nofile 64000 mongod soft nproc 64000 mongod hard nproc 64000
MongoDB 실행 유저가 mongod 가 아닐 경우 사용하는 유저명으로 기재하면 됩니다.
SELinux
RHEL,CentOS,Oracle Linux 에서 기본적으로 구성 되어있는 보안 기능인 SELinux 가 활성화되어 있을 경우에 정책 추가가 필요 합니다.
(SELinux 를 운영 정책 등으로 비활성화 중이라면 해당 내용은 Skip 하셔도 됩니다)
먼저 SELinux 활성화 설정 여부는 아래 와 같이 확인할 수 있습니다.
grep "SELINUX=" /etc/sysconfig/selinux # SELINUX= can take one of these three values: SELINUX=enforcing
위의 조회 결과 enforcing 으로 되어 있다면 SELinux 가 사용중인 것으로 확인하시면 됩니다.
checkpolicy 패키지를 설치를 합니다.
sudo yum install checkpolicy
2개의 TE(Type Enforcement) 을 작성 및 정책을 추가하도록 하겠습니다.
• mongodb_cgroup_memory.te
cat > mongodb_cgroup_memory.te <<EOF module mongodb_cgroup_memory 1.0; require { type cgroup_t; type mongod_t; class dir search; class file { getattr open read }; } #============= mongod_t ============== allow mongod_t cgroup_t:dir search; allow mongod_t cgroup_t:file { getattr open read }; EOF checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod sudo semodule -i mongodb_cgroup_memory.pp
• mongodb_proc_net.te
cat > mongodb_proc_net.te <<EOF module mongodb_proc_net 1.0;
require {
type cgroup_t;
type configfs_t;
type file_type;
type mongod_t;
type proc_net_t;
type sysctl_fs_t;
type var_lib_nfs_t;
class dir { search getattr };
class file { getattr open read };
}
#============= mongod_t ==============
allow mongod_t cgroup_t:dir { search getattr } ;
allow mongod_t cgroup_t:file { getattr open read };
allow mongod_t configfs_t:dir getattr;
allow mongod_t file_type:dir { getattr search };
allow mongod_t file_type:file getattr;
allow mongod_t proc_net_t:file { open read };
allow mongod_t sysctl_fs_t:dir search;
allow mongod_t var_lib_nfs_t:dir search; EOF checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod sudo semodule -i mongodb_proc_net.pp
• mongodb_sysctl_net.te
cat > mongodb_sysctl_net.te <<EOF module mongodb_sysctl_net 1.0; require { type mongod_t; type init_t; type locale_t; type ld_so_cache_t; type sysctl_net_t; class process { execmem }; class dir search; class file { getattr read open execute }; } #============= mongod_t ============== allow mongod_t sysctl_net_t:dir search; allow mongod_t sysctl_net_t:file { getattr read open execute }; allow mongod_t ld_so_cache_t:file execute; allow mongod_t locale_t:file execute; allow init_t self:process execmem; EOF checkmodule -M -m -o mongodb_sysctl_net.mod mongodb_sysctl_net.te semodule_package -o mongodb_sysctl_net.pp -m mongodb_sysctl_net.mod sudo semodule -i mongodb_sysctl_net.pp
MongoDB 의 디렉토리를 기본 경로 외 다른 경로를 사용한다면 SELinux 에서의 권한 추가 및 설정이 필요 합니다.
SELinux 에서의 MongoDB는 3개의 type을 가지게 됩니다.
- mongod_var_lib_t for data directory
- mongod_log_t for log file directory
- mongod_var_run_t for pid file directory
사용법은 아래와 같습니다.
1. semanage fcontext sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*> 2. chcon sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory> 3. updated SELinux policies sudo restorecon -R -v </some/MongoDB/directory>
별도의 경로에서 사용시 3가지 절차를 통해서 정책을 적용하면 되며 실제로 아래 와 같이 수행하면 됩니다.
## 별도의 MongoDB data path mkdir -p /mongodb/data chown -R mongod:mongod /mongodb/data ls -alZ /mongodb/ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*' sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data' sudo restorecon -R -v '/mongodb/data' ----------------------------------- ## 별도의 MongoDB log 경로 사용 mkdir -p /mongodb/log chown -R mongod:mongod /mongodb/log ls -alZ /mongodb/ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*' sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log' sudo restorecon -R -v '/mongodb/log'
만약 위와 같이 별도의 다른 디렉토리로 설정하였다면 /etc/mongod.conf 파일을 아래 와 같이 수정합니다.
< .. 중략 ..> # where to write logging data. systemLog: destination: file logAppend: true #path: /var/log/mongodb/mongod.log path: /mongodb/log/mongod.log # Where and how to store data. storage: # dbPath: /var/lib/mongo dbPath: /mongodb/data directoryPerDB: true journal: enabled: true < .. 중략 ..>
그 외 MongoDB 의 기본 포트인 27017 이 아닌 다른 포트를 사용할 경우 아래와 같이 SELinux 에서 정책 추가가 필요 합니다.
sudo semanage port -a -t mongod_port_t -p tcp 포트번호
mongod.conf 수정
MongoDB 시작 전에 필요한 설정 변경을 mongod.conf 파일에서 수정하도록 합니다.
기본 파일 위치: /etc/mongod.conf
vi /etc/mongod.conf storage: dbPath: /var/lib/mongo directoryPerDB: true 또는 storage: dbPath: /var/lib/mongodb journal: enabled: true directoryPerDB: true # network interfaces net: port: 27017 bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
포스팅에서는 storage 항목에서 directoryPerDB: true 를 추가하였습니다.
기본 BindIP 는 127.0.0.1 로 설정 되어있으며 외부 접속이 필요한 경우 0.0.0.0 으로 설정하시면 됩니다.
OS 방화벽
OS 방화벽(firewalld)이 활성화 되어있고 외부 접속이 필요할 경우 아래와 같이 MongoDB 포트를 Open 을 합니다.
sudo firewall-cmd --permanent --zone=public --add-port=27017/tcp sudo firewall-cmd --reload sudo firewall-cmd --list-all
MongoDB 시작
설치 및 추가 설정사항이 완료되었다면 아래와 같이 systemctl 을 통해서 MongoDB 서비스를 시작합니다.
systemctl enable mongod systemctl start mongod
정상적으로 시작되었다면 특이사항이 있는지 등은 로그를 체크하도록 합니다.
sudo tail -100f /var/log/mongodb/mongod.log
Reference
Reference URL
• mongodb.com/install-mongodb-on-red-hat
• mongodb.com/v4.4/install-mongodb-on-red-hat
• mongodb.com/v4.4/transparent-huge-pages
• mongodb.com/v4.4/supported-platforms
• mongodb.com/v4.4/configuration-options
연관된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io
잘 보고 가요~!!!!! 몽고도 시작하셨군요
안녕하세요 재환님 ㅎㅎ
이제 막 시작 했습니다ㅎㅎ
열심히 또 해보려고 합니다
코멘트 감사합니다
좋은 하루되세요
항상 잘 보고 있습니다 다음 작업편도 열심히 참고해볼게요
안녕하세요~
도움이 되셨다니 다행이십니다.
MongoDB 도 앞으로 내용을 포스팅 해보도록 하겠습니다.
친절한 코멘트 감사합니다.
좋은 하루 되세요