백업/복구

  • db의 백업/복제
    • 데이터베이스 솔루션을 사용하는 이유: 데이터의 안전한 저장과 값에 대한 일관성 보장
    • 하나의 서비스를 진행하다보면 각종 장애 상황에 접하게 됨
    • 장애 발생 시 가장 중요하게 필요한 것이 백업과 복구에 관련된 기능
    • 기존에 관계형 데이터베이스 솔루션의 경우에는 테이블별로 사용하는 솔루션에 따라 단순히 데이터가 저장된 파일을 복사하는 것만으로도 가능한 경우가 있음
    • mongodb는 기본적으로 데이터를 덤프를 뜨고 복구하거나 리플리케이션 하는 등의 다양한 백업/복구 기능 지원
  • 복구 종류
    • shutdown & file copy
      • 서비스를 종료하고 실제 저장된 데이터를 운영체제 명령어를 통해 복사하는 방법
      • mongodb는 특정폴더 또는 지정된 폴더에 해당 데이터를 저장
      • 운영체제 명령어 cp 등을 활용하여 데이터 복제
      • 서비스 종료 이유는 카피 도중 새로운 데이터 유입되어 무결성에 문제가 생길 수 있기 때문이다.
    • FsyncLock & backup
      use admin
      db.copyDatabase("test", "test1"); // test database 를 test1 database로 복제
      db.copyDatabase("test", "test", "192.168.1.77:27017"); // IP로 원격 서버에 있는 데이터를 복제해 올 수 있다.    
      
      • FsyncLock은 db 전체에 락을 걸고 데이터를 복제하는 방법으로 새로운 데이터 유입을 막고 무결성 문제를 해결한다.
      • clone database 기능을 활용하면 local이 아닌 remote 상의 똑같은 데이터베이스 구조로 복제 가능
      • local에서는 copydatabase 명령어를 사용
      • 복제 완료 후 unlock을 해주어야 한다
    • MondoDump, MongoRestore
      // mongo dump 생성
      $ mongodump --host 127.0.0.1 // 해당 서버에 덤프 생성
      $ mongorestore -h 127.0.0.1 ./dump/ // dump 디렉터리 밑에 복구
      
      • mongodb내의 데이터를 컬렉션, db, 전체 데이터 단위로 백업 가능
      • 백업되는 데이터를 bson형태로 저장되어 문자열 형태로 저장된 데이터보다 빠르게 백업과 복구 가능
      • 백업된 데이터는 mongorestore 명령어를 통해 복구 가능
    • MongoExport, MongoImport
      // -c: things collection, -d: test database
      $ mongoexport -h 192.168.1.77 -c things -d test -o "C:\data\db\export\test.exp"
      // json 타입, 저장된 text.exp 파일을 통해 test database, things collection에 복구
      $ mongoimport -d test -c things --type json --file "C:\data\db\export\test.exp"
      
      • bson형태보다 속도면에서 느리지만 다양한 형태(json, csv, tsv) 로 백업 가능하며 마이그레이션 시 외부 툴 활용이 가능하다
      • 백업된 데이터를 MongoImport 명령어를 통해 복구 가능
    • Replica
      • Master 에서 입력된 그대로 N개 이상의 slave에 동일한 쿼리가 반복 복제되어 입력
      • Master에 변경/삭제 쿼리가 Slave에도 복제되기 때문에 서비스 운영중에 쿼리 명령어를 통해 유실된 데이터 복구는 어려움
    • ReplicationSet
      • Master 서버가 장애가 발생면 Slave 서버 중 Master서버로 선정되어 운영되는 기능
    • SnapShot 백업
      • mongodb 내부에서 사용하는 백업 방식으로 일종의 버퍼
      • 1.6 버전 부터 Journal 시스템에 해당 내용을 저장한 뒤 디스크에 내용을 저장
      • 디스크에 문제가 발생하여도 Journal에 존재하는 데이터를 통해 복구가능

로그 수집/분석

  • 모니터링 전략
    • DB 활동을 실시간 리포팅하는 유틸리티 활용
      • MongoDB 다운로드 패키지에 포함된 유틸리티
    • 데이터베이스 명령 활용
      • 현재 데이터베이스의 상태에 대한 통계 확인 가능
    • MMS 모니터링 서비스(MMS Monitoring Service) 활용
      • MongoDB Management Service: 데이터에 대한 시각화 및 경고 등을 제공하는 무료 서비스
  • MongoStat
    mongostat -rowcount 50 // 로우 수 지정 가능
    
    • MongoDB가 동작하는 내부 상황에 대한 정보를 확인하기 위한 툴
    • 1초에 한번씩 mongod, mongos 성능 측정
      • mongod: mongodb 시스템의 주요 데몬으로 데이터 요청을 다루고, 접근을 관리하며 백그라운드 관리 operation 수행
      • mongos: client의 요청을 받아 환경설정서버의 partitioning 정보를 참고해 적절한 데이터 서버로 요청을 포워딩함(샤딩), 쿼리 라우터처럼 동작하며, client 애플리케이션과 sharding 클러스터간의 인터페이스를 제공
    • MongoDB내에서 일어나는 다양한 이벤트에 대한 정보와 메모리 상태등의 정보 확인 가능
      • mapped: 메모리 상에 매핑되는 메모리 크기 단위(MB)
      • vsize: 프로세스의 가상 크기
      • res: 프로세스 resident 크기
      • faults: 초당 발생하는 페이지 폴트 수
      • locked: 글로벌 Write 락이 발생하는 전체시간에 대한 비율
      • idx miss: btree index를 로드하며 인덱스를 읽을 때 페이지 폴트가 나는 비율
      • qr: Mongodb 인스턴스로부터 data읽기를 기다리기 위한 client의 queue 길이
      • qw: Mongodb 인스턴스로부터 data쓰기를 기다리는 client queue 길이
      • ar: 읽기 작업 수행중인 Active 클라이언트 수
      • aw: 쓰기 작업 진행중인 Active 클라이언트 수
      • netIn: 몽고디비로 received된 네트워크 트래픽 양
      • netOut: 몽고디비에서 밖으로 sent 된 네트워크 트래픽 양
      • conn: 접속된 connection 수
      • set: Replica 이름
      • repl: Replication 유형(M(Master), SEC(Secondary), REC(Recovering), UNK(Unknown), SLV(Slave))
    • faults의 수가 증가하면 full scan 쿼리를 날렸을 가능성이 높다
    • qr 수치가 증가하면 쓰기 요청이 많아지며, 대기중인 상태가 많아지므로 서비스 지연으로 느낄 수 있다
  • MongoTop
    mongotop 5 // 5초마다 refresh
    
    • 리눅스에서 시스템 상황을 확인하는 top과 유사한 명령어로 다른 점은 인스턴스 내 모든 컬렉션에 대한 read/write 확인이 가능하다
      • ns: db + collection 명
      • db: db명
      • total: mongod 프로세스가 해당 콜렉션에서 수행한 총 시간
      • read: mongod 프로세스가 해당 콜렉션에서 읽기 작업을 수행한 총 시간
      • write: mongod 프로세스가 해당 콜렉션에서 쓰기 작업을 수행한 총 시간
      • 시간: 분석 결과를 반환한 시간
  • 웹 모니터링 도구
    mongod -dbpath c:\mongodb\var --rest
    
    • 웹상에서 상황을 모니터링할 수 있으며, -dbpath path —rest를 통해 모니터링할 수 있다
    • localhost:28017을 입력
  • 로그 수집
    mongod -dbpath c:\mongodb\var -logpath c:\mongodb\testlog.txt
    
    • logpath 옵션으로 몽고디비의 로그를 저장할 수 있다
    • log 파일명을 일정 시간단위로 바꿔 줄 필요가 있다

출처

  • https://blog.skcc.com/3225 [SK(주) C&C 블로그]
  • https://mongsil1025.github.io/til/mongo/mongoMonitoring/