mongodb에서 삭제된 공간을 자동 압축하시겠습니까?
mongodb 문서에 따르면
이 공간을 압축하려면 mongo 셸에서 db.repairDatabase()를 실행합니다(이 작업은 차단되고 느려집니다).
http://www.mongodb.org/display/DOCS/Excessive+Disk+Space 에서
어떻게 하면 mongodb가 삭제된 디스크 공간을 자동으로 확보할 수 있는지 궁금합니다.
p.s. 우리는 많은 다운로드 작업을 mongodb에 최대 20GB까지 저장하고 30분 만에 완료했습니다.
일반적으로 데이터 파일을 축소할 필요가 없는 경우에는 축소해서는 안 됩니다.이는 디스크에서 데이터 파일을 "늘리는" 작업이 상당히 비용이 많이 들고 MongoDB가 데이터 파일에 할당할 수 있는 공간이 많을수록 조각화가 줄어들기 때문입니다.
따라서 데이터베이스에 디스크 공간을 최대한 많이 제공해야 합니다.
그러나 데이터베이스를 축소해야 하는 경우 두 가지 사항을 염두에 두어야 합니다.
MongoDB는 데이터 파일을 두 배로 확장하여 데이터 파일을 64MB, 128MB 등으로 확장하여 최대 2GB까지 유지할 수 있습니다.
대부분의 데이터베이스와 마찬가지로... 축소와 같은 작업을 수행하려면 별도의 작업을 예약해야 합니다. MongoDB에는 "자동 축소"가 없습니다.실제로 주요 noSQL 데이터베이스(이 이름을 싫어함)에서는 Riak만 자동으로 축소됩니다.따라서 축소를 실행하려면 OS의 스케줄러를 사용하여 작업을 생성해야 합니다.bash 스크립트를 사용할 수도 있고, php 스크립트를 실행할 수도 있습니다.
서버측 Javascript
서버 측 Javascript를 사용하여 mongo의 셸을 통해 축소를 수행하고 작업(cron 또는 Windows 스케줄링 서비스 등)을 통해 JS를 실행할 수 있습니다.
foo라는 컬렉션을 가정하면 아래의 javascript를 bar.js라는 파일에 저장하고 ...을 실행합니다.
$ mongo foo bar.js
Javascript 파일은 다음과 같습니다.
// 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
예약에 따라 이 작업을 실행하십시오(피크 시간이 아닌 시간대).
캡션 컬렉션
상한 컬렉션은 매우 높은 성능의 자동 FIFO 에이징 아웃 기능(에이징 아웃은 삽입 순서를 기준으로 함)이 있는 고정 크기 컬렉션입니다.만약 여러분이 그것에 익숙하다면, 그것들은 "RRD" 개념과 약간 비슷합니다.
또한 캡션 컬렉션은 자동으로 고성능으로 컬렉션의 개체 삽입 순서를 유지합니다. 이는 로깅과 같은 특정 사용 사례에 매우 유용합니다.
기본적으로 컬렉션의 크기(또는 에 있는 문서 수)를 20GB로 제한할 수 있습니다. 이 제한에 도달하면 MongoDB는 가장 오래된 레코드를 폐기하고 새 항목으로 교체하기 시작합니다.
이는 시간이 지남에 따라 오래된 데이터를 삭제하고 동일한 양의 디스크 공간을 사용하여 대량의 데이터를 보관할 수 있는 좋은 방법입니다.
시스템을 잠글 여유가 없거나 스토리지 용량이 두 배가 되지 않는 경우 db.repairDatabase()를 수행하는 것보다 더 효과적인 다른 솔루션이 있습니다.
복제본 집합을 사용하고 있어야 합니다.
디스크를 집어삼키는 과도한 데이터를 모두 제거한 후 보조 복제본을 중지하고 데이터 디렉토리를 지우고 마스터와 다시 동기화할 수 있도록 해야 합니다.
이 프로세스는 시간이 많이 걸리지만 rs.stepDown()을 수행할 때 다운타임이 몇 초밖에 걸리지 않습니다.
또한 이것은 자동화될 수 없습니다.그럴 수도 있지만, 저는 시도할 의향이 없다고 생각합니다.
db.repairDatabase()를 실행하려면 파일 시스템에서 사용할 수 있는 데이터베이스의 현재 크기와 동일한 공간이 필요합니다.데이터베이스에 남아 있는 컬렉션 또는 데이터를 유지해야 하는 경우 현재 할당된 공간보다 훨씬 적은 공간을 사용하고 복구할 공간이 부족할 경우 이 문제가 발생할 수 있습니다.
또는 실제로 보존해야 하는 컬렉션이 적거나 데이터의 하위 집합만 원하는 경우에는 보관해야 하는 데이터를 새 데이터베이스로 이동하여 이전 데이터베이스를 삭제할 수 있습니다.동일한 데이터베이스 이름이 필요한 경우 동일한 이름의 새 데이터베이스로 다시 이동할 수 있습니다.인덱스를 다시 작성해야 합니다.
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 및 컬렉션이 다시 생성됩니다.필요한 인덱스를 적절한 시간에 생성하는 작업이 포함되어 있는지 확인하십시오.
이 질문을 처음 작성할 때 사용할 수 없었던 복제본 세트를 사용하는 경우, 심각한 중단이나 성능 문제 없이 자동으로 공간을 회수하는 프로세스를 설정할 수 있습니다.
이렇게 하려면 복제본 집합에 있는 보조의 자동 초기 동기화 기능을 사용합니다.설명: 보조 장치를 종료하고 해당 데이터 파일을 지우고 다시 시작하면 보조 장치가 세트의 다른 노드 중 하나에서 처음부터 다시 동기화됩니다(기본적으로 응답 시간을 확인하여 가장 가까운 노드를 선택함).이러한 재동기화가 발생하면 인덱스를 포함한 모든 데이터가 처음부터 다시 작성되어 복구와 동일한 작업을 효과적으로 수행하고 Disk 공간을 회수합니다.
보조 장치에서 이를 실행한 다음 주를 종료하고 프로세스를 반복하면 운영 중단을 최소화하면서 전체 세트의 Disk 공간을 효과적으로 회수할 수 있습니다.보조 데이터를 읽을 경우 보조 데이터가 회전하지 않을 수 있으므로 주의해야 합니다.또한 oplog 창이 재동기화를 성공적으로 수행하기에 충분한지 확인하려고 하지만 일반적으로 이 작업을 수행할지 여부를 확인해야 합니다.
이 프로세스를 자동화하려면 세트의 각 멤버에 대해 이 작업을 별도의 날짜(또는 유사한 날짜)에 수행하는 스크립트를 실행하기만 하면 됩니다. 가능하면 대기 시간이나 유지 관리 기간 중에 수행할 수 있습니다.이 스크립트의 매우 단순한 버전은 다음과 같습니다.bash
:
참고: 이 코드는 기본적으로 유사 코드입니다. 설명용으로만 사용할 수 있습니다. 중요한 변경 사항이 없는 프로덕션 시스템에는 사용하지 마십시오.
#!/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
언급URL : https://stackoverflow.com/questions/4555938/auto-compact-the-deleted-space-in-mongodb
'it-source' 카테고리의 다른 글
Xcode 소스 자동 포맷 (0) | 2023.05.26 |
---|---|
Express.js req.body가 정의되지 않았습니다. (0) | 2023.05.26 |
ActiveX 컨트롤이 비활성화되어 있습니까? (0) | 2023.05.26 |
Eclipse Juno에서 "빠른 액세스" 항목 제거 (0) | 2023.05.26 |
Xcode는 각 키 입력 후에도 스토리보드를 계속 빌드합니다. (0) | 2023.05.26 |