2015-12-14 8 views
5

私のmongodumpをs3にアップロードするには、この手順に従います。linkbotoを使用してec2からs3にファイルを転送中にエラーが発生する

bashスクリプト

#!/bin/sh 

MONGODB_SHELL='/usr/bin/mongo' 

DUMP_UTILITY='/usr/bin/mongodump' 
DB_NAME='amicus' 

date_now=`date +%Y_%m_%d_%H_%M_%S` 
dir_name='db_backup_'${date_now} 
file_name='db_backup_'${date_now}'.bz2' 

log() { 
    echo $1 
} 

do_cleanup(){ 
    rm -rf db_backup_2010* 
    log 'cleaning up....' 
} 

do_backup(){ 
    log 'snapshotting the db and creating archive' && \ 
    ${MONGODB_SHELL} admin fsync_lock.js && \ 
    ${DUMP_UTILITY} -d ${DB_NAME} -o ${dir_name} && tar -jcf $file_name ${dir_name} 
    ${MONGODB_SHELL} admin unlock.js && \ 
    log 'data backd up and created snapshot' 
} 

save_in_s3(){ 
    log 'saving the backup archive in amazon S3' && \ 
    python aws_s3.py set ${file_name} && \ 
    log 'data backup saved in amazon s3' 
} 

do_backup && save_in_s3 && do_cleanup 

aws_s3.py

ACCESS_KEY='' 
SECRET='' 
BUCKET_NAME='s3:///s3.amazonaws.com/database-backup' #note that you need to create this bucket first 

from boto.s3.connection import S3Connection 
from boto.s3.key import Key 

def save_file_in_s3(filename): 
    conn = S3Connection(ACCESS_KEY, SECRET) 
    bucket = conn.get_bucket(BUCKET_NAME) 
    k = Key(bucket) 
    k.key = filename 
    k.set_contents_from_filename(filename) 

def get_file_from_s3(filename): 
    conn = S3Connection(ACCESS_KEY, SECRET) 
    bucket = conn.get_bucket(BUCKET_NAME) 
    k = Key(bucket) 
    k.key = filename 
    k.get_contents_to_filename(filename) 

def list_backup_in_s3(): 
    conn = S3Connection(ACCESS_KEY, SECRET) 
    bucket = conn.get_bucket(BUCKET_NAME) 
    for i, key in enumerate(bucket.get_all_keys()): 
     print "[%s] %s" % (i, key.name) 

def delete_all_backups(): 
    #FIXME: validate filename exists 
    conn = S3Connection(ACCESS_KEY, SECRET) 
    bucket = conn.get_bucket(BUCKET_NAME) 
    for i, key in enumerate(bucket.get_all_keys()): 
     print "deleting %s" % (key.name) 
     key.delete() 

if __name__ == '__main__': 
    import sys 
    if len(sys.argv) < 3: 
     print 'Usage: %s <get/set/list/delete> <backup_filename>' % (sys.argv[0]) 
    else: 
     if sys.argv[1] == 'set': 
      save_file_in_s3(sys.argv[2]) 
     elif sys.argv[1] == 'get': 
      get_file_from_s3(sys.argv[2]) 
     elif sys.argv[1] == 'list': 
      list_backup_in_s3() 
     elif sys.argv[1] == 'delete': 
      delete_all_backups() 
     else: 
      print 'Usage: %s <get/set/list/delete> <backup_filename>' % (sys.argv[0]) 

しかし、このエラーを取得しておいてください。

Traceback (most recent call last): 
    File "aws_s3.py", line 42, in <module> 
    save_file_in_s3(sys.argv[2]) 
    File "aws_s3.py", line 13, in save_file_in_s3 
    k.set_contents_from_filename(filename) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 1362, in set_contents_from_filename 
    encrypt_key=encrypt_key) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 1293, in set_contents_from_file 
    chunked_transfer=chunked_transfer, size=size) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 750, in send_file 
    chunked_transfer=chunked_transfer, size=size) 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 951, in _send_file_internal 
    query_args=query_args 
    File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 664, in make_request 
    retry_handler=retry_handler 
    File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 1071, in make_request 
    retry_handler=retry_handler) 
    File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 1030, in _mexe 
    raise ex 
socket.error: [Errno 104] Connection reset by peer 

は、私の研究のビットを行なったし、そのそのいくつかの種類のを発見botoのバグ。これをさらに進めるには?

+0

バケット名は非常に疑わしいです、重複コードの多くは、あなたが一般的な 'AWS-cli'の代わりに、コードを書くを使用することができ、そこだが、最終的には、' initiate_multipart_upload'はあなたのbotoに必要なものです。 – tedder42

+0

@ tedder42コピーの貼り付けエラーです。しかし、プロセス全体を自動化するために、私は 's3cmd'を使用しています。 –

答えて

3

私はそれを動作させる方法を更新しませんでしたので、私はs3cmdをbashスクリプトで使用しました。しかし、私はまだ1ギガバイト以上のファイルについてそれをテストしなければなりません。これはおそらく、アップロードされたファイルのサイズに関係している

#!/bin/sh 

MONGODB_SHELL='/usr/bin/mongo' 

DUMP_UTILITY='/usr/bin/mongodump' 
DB_NAME='amicus' 

date_now=`date +%Y_%m_%d_%H_%M_%S` 
dir_name='db_backup_'${date_now} 
file_name='db_backup_'${date_now}'.bz2' 

log() { 
    echo $1 
} 

do_cleanup(){ 
    rm -rf db_backup_2010* 
    log 'cleaning up....' 
} 

do_backup(){ 
    log 'snapshotting the db and creating archive' && \ 

    ${DUMP_UTILITY} -d ${DB_NAME} -o ${dir_name} && tar -jcf $file_name ${dir_name} 

    log 'data backd up and created snapshot' 
} 

save_in_s3(){ 
    log 'saving the backup archive in amazon S3' && \ 
    python aws_s3.py set ${file_name} && \ 
    s3cmd put ${file_name} s3://YOURBUCKETNAME 
    log 'data backup saved in amazon s3' 
} 

do_backup && save_in_s3 && do_cleanup 
+1

1ギガバイト以上のファイルで動作しています –

0

- ここ

が更新されたコードです。

「ピアによって接続がリセットさ」は、通常、リモートサーバーが接続を(それがのbotoの問題だとは思わない)閉じていることを意味します。また、これを推測するつもりは、あなたが要求をするために打っている何らかの種類のタイムアウトです(大きなファイルの場合、転送には多くの時間がかかります)。

これを自分でやりたいのであれば、マルチパートアップロードを調べることをおすすめします。この例を参照してください:https://gist.github.com/chrishamant/1556484

s3cmdは、ファイルサイズに基づいて、背中にこれを行います。

+0

テスト用に10 MBしかアップロードしていませんでした。 –

関連する問題