Skip to content

Instantly share code, notes, and snippets.

@NaniteFactory
Last active October 16, 2020 20:20
Show Gist options
  • Save NaniteFactory/c41dbc28eb252643e45560e461d79583 to your computer and use it in GitHub Desktop.
Save NaniteFactory/c41dbc28eb252643e45560e461d79583 to your computer and use it in GitHub Desktop.

무료 MongoDB 서버 만들기

방법은 2가지가 있다.

  1. MongoDB Atlas 클라우드 서비스 이용
    • MongoDB Atlas: https://cloud.mongodb.com/
    • 거의 SaaS임. 인프라를 전혀 신경 쓰지 않고 편하게 쓸 수 있다. 회원 가입하고 클러스터를 생성하면 모든 과정이 웹 GUI로 안내된다.
    • 512GB까지 무료 이용 가능하고 유료 최소 크기인 2GB로 확장하기 위해서 매달 미화 9불 결제 필요하다. [출처]
  2. IaaS 컴퓨팅 클라우드
    • [OCI]: 개인정보를 잔뜩 갈취하고 회원가입이 안 됐다.
    • [IBM]: 이것도 개인정보만 갈취하고 회원가입이 안 됐다.
    • [AWS]: 좋은데 비싸다. EC2는 상시 무료 제공되지 않는다.
    • [GCP]: 저렴하고 가용성 높으며 항상 무료 컴퓨터가 있다. 그러나 설정이 유독 때때로 번거롭거나 어렵다는 단점이 있다. f1-micro 1대와 HDD 30 GB가 상시 무료다.
    • [Azure]: 상시 무상 제공 옵션이 거의 없음.

좋은 무료 클라우드 서비스: MongoDB Atlas 또는 GCP

GCP 기반 MongoDB 서버 구축

1. 머신 설치

1) 인스턴스 생성

  • 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

    안정성과 성능면에서 데비안이 우분투보다 더 우수하다. 우분투는 서버 행업을 유발하는 치명적인 버그가 산재하므로 쓰지 말자. 경험상 우분투 이용중 트래픽이 많으면 18.04 LTS와 20.04 LTS 모두 시스템에 대한 연결을 상실하는 버그가 있었다. [출처]

2) 방화벽 설정

  • 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

2. 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 설정 파일 수정시 오타 없도록 주의

3. 사용자 추가

$ 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

4. 클라이언트로부터 연결

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 서버가 설치 완료되었다.


번외: 사용상 팁

서버 관리

1. 시스템에 미리 패스워드 설정을 해 두면 좋다.

$ sudo passwd

임의의 sudo user 추가하는 방법

$ 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

5. 데이터베이스 복사 방법

$ mongodump --uri="SOURCE_URI" --gzip --archive | mongorestore --uri="TARGET_URI" --nsFrom="SOURCE_DB_NAME.*" --nsTo="TARGET_DB_NAME.*" --gzip --archive
  • 명령어 실행 전 컬렉션을 모두 비워 놓는 것이 좋다.

6. systemd 서비스 유닛 설정

$ systemctl cat mongod
$ sudo nano /lib/systemd/system/mongod.service
[Service]
Restart=always
$ sudo systemctl daemon-reload
$ systemctl show mongod

7. cron 사용 설정

$ 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

8. 시스템 임시 포트 늘리기

$ 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

9. 디스크 스왑 공간 설정

$ 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

10. 디스크 리마운트

  • 파티션 재설정시 읽기/쓰기 모드로 디스크를 리마운트하고 재부팅 후에도 적용될 수 있게 하는 명령어 [참고1] [참고2]
$ sudo mount -vo remount,rw /
$ sudo nano /etc/fstab
# /etc/fstab
/swapfile swap swap defaults 0 0
/dev/sda1 / ext4 rw 0 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment