티스토리 뷰

TL;DR (요약)

  1. 터미널에서 mongo Repl 진입
  2. mongo> db.fsyncLock() 명령으로 mongoDB 얼리기
  3. $ xfs_freeze -f /mnt/mdb
  4. take the EBS 스냅샷
  5. EBS 스냅샷이 pending 상태로 뜨면
  6. $ xfs_freeze -u /mnt/mdb
  7. mongo> db.fsyncUnlock() 명령으로 mongoDB 얼리기 해제


절차

자동 Sync 방법:

  1. increase ulimit
    1. https://medium.com/@muhammadtriwibowo/set-permanently-ulimit-n-open-files-in-ubuntu-4d61064429a
  2. clean shutdown mongod instance (use either a or b below)
    1. mongo> db.shutdownServer()
    2. $ mongod --shutdown
  3. Delete all data from dbPath directory
  4. Start mongod process
    1. --replSet <setname> 옵션 붙이거나 conf 파일에 입력
    2. systemctl start mongod
    3. (serveice) start mongod
  5. 이 지점에서 mongod 는 initial sync 수행함.
    1. sync process 시간은 db 크기와 replica set 간 network latency 에 좌우됨.

다른 ReplicaSet 멤버로부터 데이터 파일 복사로 Sync 방법:

  1. increase ulimit
    1. https://medium.com/@muhammadtriwibowo/set-permanently-ulimit-n-open-files-in-ubuntu-4d61064429a
  2. tpmdb2$ mongo
  3. mongo> use admin
  4. mongo> db.shutdownServer()
  5. create EBS snapshot or direct copy data directory
    1. EBS Snapshot 생성 소요시간: 40분 / 300G
    2. snapshot 100%
  6. shut down 했던 mongoDB server 에서 systemctl start mongod
  7. AWS> snapshot 로부터 volume 생성.
  8. AWS> 생성한 volume 을 새 EC2 replica 에 attach
  9. lsblk 명령으로 attach 한 volume 'xvdg' 존재 확인
  10. new EC2$ mount -t xfs /dev/xvdg /mnt/mdb
  11. 볼륨 생성시 기존보다 큰 볼륨크기로 생성했다면
    1. new EC2$ xfs_growfs -d /mnt/mdb
    2. new EC2$ df -h
    3. /dev/xvdg Size 확인
  12. new EC2$ chown -R mongodb:mongodb /mnt/mdb/data
  13. new EC2$ rm -f /mnt/mdb/data/mongod.lock
  14. new EC2$ systemctl start mongod
  15. secondary 의 sync target 설정
    1. "Too many open files" 오류가 발생하길래 sync target 제한 시도.
    2. new mongo> rs.syncFrom("tpmdb2:27017");

Issues

db.fsyncLock → 스냅샷 → 새 서버 볼륨에 마운트하고 → mongod 데몬 시작 했는데 → 오류 내뱉고 die

$ tail -n 100 /var/log/mongodb/mongod.log

mongod 가 잘 띄워진 상태에서 replica set 에 추가되면 발생되는 오류

ulimit 제한을 65535 로 고쳐도 동일 오류 발생.

$ tail -n 100 /var/log/mongodb/mongod.log

위 오류가 발생 한 후 mongod 데몬을 다시 띄우면 발생되는 오류

$ tail -n 100 /var/log/mongodb/mongod.log


Troubleshooting

  • $ ulimit -n 3129048
  • $ vi /etc/security/limits.conf
    • soft nproc 65535
      hard nproc 65535
      soft nofile 1000000
      hard nofile 1000000
      root soft nproc 65535
      root hard nproc 65535
      root soft nofile 1000000
      root hard nofile 1000000
  • 오픈할 수 있는 최대 파일 갯수
    • 확인: $ cat /proc/sys/fs/file-max
    • 임시변경: $ echo 3129048 > /proc/sys/fs/file-max
    • 영구변경: vi /etc/sysctl.conf
    • fs.file-max=3129048
  • 현재 오픈되어 있는 파일 갯수
    • 확인: $ cat /proc/sys/fs/file-nr
  • 프로세스가 잡고 있는 파일 갯수
    • $ ls /proc/${PID}/fd | wc -l
  • 프로세스의 제한사항 확인
    • $ cat /proc/${PID}/limits


Reference

  • https://www.nclouds.com/blog/10-steps-migrating-mongodb-replica-set/
  • https://docs.mongodb.com/ecosystem/tutorial/backup-and-restore-mongodb-on-amazon-ec2/#flush-and-lock-the-database
  • https://engineering.checkr.com/mongodb-cluster-migration-with-zero-downtime-f4e294c29bef
  • https://docs.mongodb.com/manual/tutorial/resync-replica-set-member/
  • https://docs.mongodb.com/manual/tutorial/configure-replica-set-secondary-sync-target/
  • http://www.alexbevi.com/blog/2016/02/10/recovering-a-wiredtiger-collection-from-a-corrupt-mongodb-installation/


댓글