복붙노트

[MONGODB] 자동 MongoDB의에서 삭제 된 공간을 압축?

MONGODB

자동 MongoDB의에서 삭제 된 공간을 압축?

MongoDB의 문서는 말한다

http://www.mongodb.org/display/DOCS/Excessive+Disk+Space에서

나는 MongoDB를의 자유가 자동으로 디스크 공간을 삭제하는 방법을 궁금해?

추신. 우리는 최대 20GB, MongoDB의 많은 다운로드 작업을 저장하고 반 시간에이를 마쳤다.

해결법

  1. ==============================

    1.일반적으로 당신은 당신이 전혀를 축소해서는 안 당신의 데이터 파일을 축소 할 필요가없는 경우. 디스크에 데이터 파일을 "성장하는"상당히 비용이 많이 드는 작업 및 MongoDB를이 데이터 파일에 당신이 가진 것보다 적게 단편화를 할당 할 수있는 공간이기 때문이다.

    일반적으로 당신은 당신이 전혀를 축소해서는 안 당신의 데이터 파일을 축소 할 필요가없는 경우. 디스크에 데이터 파일을 "성장하는"상당히 비용이 많이 드는 작업 및 MongoDB를이 데이터 파일에 당신이 가진 것보다 적게 단편화를 할당 할 수있는 공간이기 때문이다.

    그래서, 당신은 데이터베이스에 대한 가능한 한 많은 디스크 공간으로 제공하기 위해 시도해야합니다.

    데이터베이스를 축소해야하지만 경우에 당신은 마음에 두 가지를 유지해야합니다.

    서버 사이드 자바 스크립트

    당신은 축소하고 실행을 수행하는 서버 측 자바 스크립트를 사용할 수 (크론 또는 서비스를 예약 창 등) 작업을 통해 정기적으로 기지에 JS를 통해 몽고의 쉘이 ...

    당신 FOO라는 컬렉션을 가정하면라는 파일 bar.js하고 실행에 아래의 자바 스크립트를 절약 할 수 ...

    $ mongo foo bar.js
    

    자바 스크립트 파일은 아래와 같다 것이라고 ...

    // Get a the current collection size.
    var storage = db.foo.storageSize();
    var total = db.foo.totalSize();
    
    print('Storage Size: ' + tojson(storage));
    
    print('TotalSize: ' + tojson(total));
    
    print('-----------------------');
    print('Running db.repairDatabase()');
    print('-----------------------');
    
    // Run repair
    db.repairDatabase()
    
    // Get new collection sizes.
    var storage_a = db.foo.storageSize();
    var total_a = db.foo.totalSize();
    
    print('Storage Size: ' + tojson(storage_a));
    print('TotalSize: ' + tojson(total_a));
    

    이것은 실행과 같은 반환 일 것입니다 ...

    MongoDB shell version: 1.6.4
    connecting to: foo
    Storage Size: 51351
    TotalSize: 79152
    -----------------------
    Running db.repairDatabase()
    -----------------------
    Storage Size: 40960
    TotalSize: 65153
    

    (비 피크 시간 동안) 일정에이 프로그램을 실행하고 당신이 가서 좋다.

    출장 컬렉션

    그러나 다른 한 옵션 덮인 컬렉션이 있습니다.

    기본적으로 당신은의 크기 (또는 문서 수) 말할 모음 .. 20기가바이트을 제한 할 수 있으며, 그 한계에 도달하면 MongoDB의 가장 오래된 기록을 던져 그들이에서 와서 새로운 항목으로 대체하기 시작합니다.

    이것은 시간이 지남에 따라하여 이전 데이터를 폐기하고 사용되는 디스크 공간의 동일한 금액을 유지, 많은 양의 데이터를 유지하는 좋은 방법입니다.

  2. ==============================

    2.더 나은 당신이 시스템에 여유가없는 경우 고정 수, 또는 이중 저장을하지 않아도 () db.repairDatabase하는 것보다 힘 작업이 다른 솔루션을 가지고있다.

    더 나은 당신이 시스템에 여유가없는 경우 고정 수, 또는 이중 저장을하지 않아도 () db.repairDatabase하는 것보다 힘 작업이 다른 솔루션을 가지고있다.

    당신은 복제 세트를 사용해야합니다.

    당신이 당신의 디스크를 삼키고 있어요 초과 데이터를 모두 제거하고 나면 내 생각은, 2 차 복제본을 중지 데이터 디렉토리를 닦아, 그것을 시작하고 마스터와 동기화 할 수 있습니다.

    이 과정은 많은 시간이 소요,하지만 당신은 rs.stepDown을 수행 할 때 그것은 단지 시간 아래의 몇 초 비용을해야합니다 ().

    또한이 자동화 할 수 없습니다. 그럼 그것은 할 수 있지만, 내가하려고 기꺼이 생각하지 않습니다.

  3. ==============================

    3.db.repairDatabase ()를 실행하면 파일 시스템에서 사용할 수있는 데이터베이스의 현재 크기와 동일한 공간을 가지고 필요합니다. 당신이 컬렉션이 남아 있음을 알고 있거나 현재 할당 된 것보다 훨씬 적은 공간을 사용하여 데이터베이스에 보관해야 할 데이터와 사용자가 수리 할 수있는 공간이 충분하지 않은 경우에 귀찮은 될 수 있습니다.

    db.repairDatabase ()를 실행하면 파일 시스템에서 사용할 수있는 데이터베이스의 현재 크기와 동일한 공간을 가지고 필요합니다. 당신이 컬렉션이 남아 있음을 알고 있거나 현재 할당 된 것보다 훨씬 적은 공간을 사용하여 데이터베이스에 보관해야 할 데이터와 사용자가 수리 할 수있는 공간이 충분하지 않은 경우에 귀찮은 될 수 있습니다.

    다른 방법으로 당신은 당신이 실제로 유지하거나 데이터 만의 부분 집합이, 당신은 당신이 새 데이터베이스로 유지하고 이전을 삭제하는 데 필요한 데이터를 이동할 수 있습니다 원하는해야 할 몇 가지 컬렉션이있는 경우. 동일한 데이터베이스 이름이 필요한 경우는 같은 이름으로 새로운 DB로 다시 이동할 수 있습니다. 그냥 확인 당신은 어떤 인덱스를 다시 확인하십시오.

    use cleanup_database
    db.dropDatabase();
    
    use oversize_database
    
    db.collection.find({},{}).forEach(function(doc){
        db = db.getSiblingDB("cleanup_database");
        db.collection_subset.insert(doc);
    });
    
    use oversize_database
    db.dropDatabase();
    
    use cleanup_database
    
    db.collection_subset.find({},{}).forEach(function(doc){
        db = db.getSiblingDB("oversize_database");
        db.collection.insert(doc);
    });
    
    use oversize_database
    
    <add indexes>
    db.collection.ensureIndex({field:1});
    
    use cleanup_database
    db.dropDatabase();
    

    많은 컬렉션과 데이터베이스에 대한 수출 / 드롭 / 가져 오기 작업이 가능성이 같은 결과를 얻을 것입니다하지만 테스트하지 않았습니다.

    또한 정책으로는 데이터를 처리 / 당신의 과도에서 별도의 데이터베이스에 영구 컬렉션을 유지할 수 있습니다 귀하의 작업이 완료되면 간단하게 처리 데이터베이스를 놓습니다. MongoDB의 스키마없는 때문에, 인덱스 제외하고는 아무 것도 손실되지 것입니다 및 프로세스에 대한 삽입 다음에 실행할 때 DB 및 컬렉션이 다시 생성됩니다. 그냥 확인하여 작업이 적절한시기에 어떤 nessecary 인덱스를 생성 포함합니다.

  4. ==============================

    4.당신이이 질문에 원래 작성되었을 때 사용할 수 없었던 복제 세트를 사용하는 경우, 당신은 중요한 중단 또는 성능 문제를 발생시키지 않고 자동으로 회수 공간 프로세스를 설정할 수 있습니다.

    당신이이 질문에 원래 작성되었을 때 사용할 수 없었던 복제 세트를 사용하는 경우, 당신은 중요한 중단 또는 성능 문제를 발생시키지 않고 자동으로 회수 공간 프로세스를 설정할 수 있습니다.

    이렇게하려면, 당신은 복제 세트에 보조의 자동 초기 동기화 기능을 활용. 설명하기 : 당신은, 보조 데이터 파일을 지우고 다시 시작 종료하는 경우, 기본적으로 세트의 다른 노드 중 하나 (에서 처음부터 보조 의지 재 동기화가 핑 응답을 보면 노드 그것에 가장 가까운 선택합니다 타임스). 이 재 동기화가 발생하면 모든 데이터가 효과적으로 수리와 같은 일을, (인덱스 포함) 처음부터 다시 작성하고, 디스크 공간이 재생.

    세컨더리에서이 작업을 실행 (다음 차를 사임하고 과정을 반복)함으로써 효과적으로 중단을 최소화하면서 전체 세트의 디스크 공간을 확보 할 수 있습니다. 이것은 잠재적으로 오랜 시간 동안 회전 차 밖으로 걸릴 것 때문에 당신은 당신이 세컨더리에서 읽고 있다면 조심해야 할 필요가 없습니다. 당신은 또한 당신의 oplog 창이 성공적인 재 동기화를 수행하기에 충분 있는지 확인하려면,하지만 일반적으로 당신이 당신이이 아닌지를 할 수 있는지 여부 해보고 싶어요 무언가이다.

    당신은 단순히 가급적 조용한 시간 또는 유지 관리 창에서, 별도의 일 (또는 유사)하여 세트의 각 멤버에이 작업을 수행하는 스크립트의 실행이 필요가이 프로세스를 자동화합니다. 이 스크립트의 아주 순진 버전은 bash는 같을 것이다 :

    참고 : 이것은 기본적으로 PSEUDO 코드 -에 대한 설명을 목적으로 만 - 큰 변화없이 DO NOT 사용을위한 생산 시스템

    #!/bin/bash 
    
    # First arg is host MongoDB is running on, second arg is the MongoDB port
    
    MONGO=/path/to/mongo
    MONGOHOST=$1
    MONGOPORT=$2
    DBPATH = /path/to/dbpath
    
    # make sure the node we are connecting to is not the primary
    while (`$MONGO --quiet --host $MONGOHOST --port $MONGOPORT --eval 'db.isMaster().ismaster'`)
    do
        `$MONGO --quiet --host $MONGOHOST --port $MONGOPORT --eval 'rs.stepDown()'`
        sleep 2
    done    
    echo "Node is no longer primary!\n"
    
    # Now shut down that server 
    # something like (assuming user is set up for key based auth and has password-less sudo access a la ec2-user in EC2)
    ssh -t user@$MONGOHOST sudo service mongodb stop
    
    # Wipe the data files for that server
    
    ssh -t user@$MONGOHOST sudo rm -rf $DBPATH
    ssh -t user@$MONGOHOST sudo mkdir $DBPATH
    ssh -t user@$MONGOHOST sudo chown mongodb:mongodb $DBPATH
    
    # Start up server again
    # similar to shutdown something like 
    ssh -t user@$MONGOHOST sudo service mongodb start 
    
  5. from https://stackoverflow.com/questions/4555938/auto-compact-the-deleted-space-in-mongodb by cc-by-sa and MIT license