방법은 2가지가 있다.
- MongoDB Atlas 클라우드 서비스 이용
- MongoDB Atlas: https://cloud.mongodb.com/
- 거의 SaaS임. 인프라를 전혀 신경 쓰지 않고 편하게 쓸 수 있다. 회원 가입하고 클러스터를 생성하면 모든 과정이 웹 GUI로 안내된다.
- 512GB까지 무료 이용 가능하고 유료 최소 크기인 2GB로 확장하기 위해서 매달 미화 9불 결제 필요하다. [출처]
- IaaS 컴퓨팅 클라우드
좋은 무료 클라우드 서비스: MongoDB Atlas
또는 GCP
-
Console - Project - Compute Engine - VM Instance - Create Instance
- Zone:
us-*
- Machine type:
f1-micro
(1 vCPU, 0.6 GB memory) - Boot disk
- Image:
debian-10-buster-v20200910
- Size:
30 GB
- Type:
Standard persistent disk
- Image:
안정성과 성능면에서 데비안이 우분투보다 더 우수하다. 우분투는 서버 행업을 유발하는 치명적인 버그가 산재하므로 쓰지 말자. 경험상 우분투 이용중 트래픽이 많으면 18.04 LTS와 20.04 LTS 모두 시스템에 대한 연결을 상실하는 버그가 있었다. [출처]
- Zone:
- Console - Project - VPC Network - Firewall - Create Firewall Rule
- Name:
mongodb
- Type:
Ingress
- Targets:
Apply to all
- Filters:
IP ranges: 0.0.0.0/0
- Protocols / ports:
tcp:27017
- Action:
Allow
- Priority:
1000
- Network:
default
- Name:
- MongoDB 문서에서 보이는 설치법을 따라 설치한다.
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
$ echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
$ ps --no-headers -o comm 1
$ sudo systemctl start mongod
$ sudo systemctl daemon-reload
$ sudo systemctl status mongod
q
$ sudo systemctl enable mongod
$ sudo systemctl stop mongod
$ sudo systemctl restart mongod
$ mongo
> exit
$ sudo nano /etc/mongod.conf
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
security:
authorization: enabled
mongod.conf
설정 파일 수정시 오타 없도록 주의
$ mongo
> use admin
> db.createUser({user: 'rootadminuser', pwd: 'YOUR_PASSWORD', roles: ["root"]})
> db.createUser({user: 'YOUR_COMPASS_USERNAME', pwd: 'YOUR_PASSWORD', roles: ["clusterMonitor","dbAdmin","readWriteAnyDatabase"]})
> exit
mongo mongodb://rootadminuser:YOUR_PASSWORD@YOUR_SERVER_IP:27017
mongo mongodb://YOUR_COMPASS_USERNAME:YOUR_PASSWORD@YOUR_SERVER_IP:27017/OPTIONALLY_YOUR_DATABASE_NAME
- 또는 MongoDB Compass 이용
여기까지 완수했다면 MongoDB 서버가 설치 완료되었다.
$ sudo passwd
$ su
# adduser someuser
# adduser someuser sudo
# exit
$ sudo visudo
열린 파일의 마지막에 아래 구문 추가하여 추가한 해당 사용자가 매번 패스워드 입력하지 않고 sudo 사용 가능하도록 설정
someuser ALL=NOPASSWD: ALL
2. 시스템 SSH 이용 불능시 직렬 콘솔 사용법 [출처]
gcloud compute instances add-metadata YOUR_INSTANCE_NAME --metadata serial-port-enable=TRUE
gcloud compute connect-to-serial-port YOUR_INSTANCE_NAME
3. 데이터베이스 연결 상태 확인 방법 [출처]
$ sudo lsof -i | grep mongod
$ sudo lsof | grep mongod | grep TCP
$ lsof | grep mongod
...
mongod 362 mongodb 128u IPv4 58114 0t0 TCP ...:36124 (ESTABLISHED)
mongod 362 mongodb 130u IPv4 58115 0t0 TCP ...:36118 (ESTABLISHED)
mongod 362 mongodb 132u IPv4 58116 0t0 TCP ...:36128 (ESTABLISHED)
mongod 362 mongodb 134u IPv4 58117 0t0 TCP ...:36126 (ESTABLISHED)
mongod 362 mongodb 137u IPv4 58825 0t0 TCP ...:48138 (ESTABLISHED)
$ sudo netstat -optn
$ sudo ss -optn
> db.serverStatus().connections
{"current" : 21, "available" : 15979}
4. 데이터베이스 Health-check 방법 [출처]
$ curl --connect-timeout 10 --silent --show-error YOUR_HOST_IP:27017
$ mongo --norc --quiet --host=YOUR_HOST_IP:27017 <<< "db.getMongo()"
$ echo 'db.runCommand("ping").ok' | mongo YOUR_HOST_IP:27017/test --quiet
$ mongodump --uri="SOURCE_URI" --gzip --archive | mongorestore --uri="TARGET_URI" --nsFrom="SOURCE_DB_NAME.*" --nsTo="TARGET_DB_NAME.*" --gzip --archive
- 명령어 실행 전 컬렉션을 모두 비워 놓는 것이 좋다.
- 참고1: https://hokstadconsulting.com/devops/writing-systemd-units
- 참고2: https://gist.github.com/jwilm/5842956
$ systemctl cat mongod
$ sudo nano /lib/systemd/system/mongod.service
[Service]
Restart=always
$ sudo systemctl daemon-reload
$ systemctl show mongod
- 참고1: https://jdm.kr/blog/2
- 참고2: https://askubuntu.com/questions/173924/how-to-run-a-cron-job-using-the-sudo-command
- 참고3: https://askubuntu.com/questions/13730/how-can-i-schedule-a-nightly-reboot
$ sudo crontab -e
# m h dom mon dow command
0 1 * * * /sbin/reboot
0 7 * * * /sbin/reboot
0 13 * * * /sbin/reboot
0 19 * * * /sbin/reboot
$ sudo crontab -l
$ sudo systemctl restart cron
$ sudo systemctl status cron
$ sudo crontab -l
$ sudo sysctl net.ipv4.ip_local_port_range
$ sudo sysctl net.ipv4.tcp_fin_timeout
$ sudo sysctl net.ipv4.tcp_tw_reuse
$ sudo sysctl net.ipv4.ip_local_port_range="15000 61000"
$ sudo sysctl net.ipv4.tcp_fin_timeout=30
$ sudo sysctl net.ipv4.tcp_tw_reuse=2
$ sudo nano /etc/sysctl.conf
#sysctl.conf
net.ipv4.tcp_fin_timeout=30
- 참고1: https://linuxize.com/post/how-to-add-swap-space-on-debian-10/
- 참고2: https://askubuntu.com/questions/103915/how-do-i-configure-swappiness
$ sudo swapon --show
$ sudo fallocate -l 2G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo echo "/swapfile swap swap defaults 0 0" | sudo tee /etc/fstab
$ sudo swapon --show
$ sudo free -h
$ cat /proc/sys/vm/swappiness
$ sudo sysctl vm.swappiness=10
$ sudo nano /etc/sysctl.conf
#sysctl.conf
vm.swappiness=10
$ sudo mount -vo remount,rw /
$ sudo nano /etc/fstab
# /etc/fstab
/swapfile swap swap defaults 0 0
/dev/sda1 / ext4 rw 0 1