Strategi pencadangan untuk bucket AWS S3

93

Saya mencari beberapa saran atau praktik terbaik untuk mencadangkan S3 bucket.
Tujuan mencadangkan data dari S3 adalah untuk mencegah kehilangan data karena hal berikut:

  1. Masalah S3
  2. masalah di mana saya tidak sengaja menghapus data ini dari S3

Setelah beberapa penyelidikan, saya melihat opsi berikut:

  1. Gunakan versi http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
  2. Salin dari satu bucket S3 ke bucket lain menggunakan AWS SDK
  3. Cadangkan ke Amazon Glacier http://aws.amazon.com/en/glacier/
  4. Cadangan ke server produksi, yang dicadangkan sendiri

Opsi apa yang harus saya pilih dan seberapa aman menyimpan data hanya di S3? Ingin mendengar pendapat Anda.
Beberapa tautan berguna:

Sergey Alekseev
sumber

Jawaban:

63

Awalnya diposting di blog saya: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/

Sinkronkan Bucket S3 Anda ke Server EC2 Secara Berkala

Ini dapat dengan mudah dicapai dengan memanfaatkan beberapa utilitas baris perintah yang memungkinkan sinkronisasi bucket S3 jarak jauh ke sistem file lokal.

s3cmd
Pada awalnya, s3cmdterlihat sangat menjanjikan. Namun, setelah mencobanya pada bucket S3 saya yang sangat besar - gagal untuk menskalakan, membuat kesalahan dengan file Segmentation fault. Itu berhasil dengan baik pada ember kecil. Karena tidak berhasil untuk ember besar, saya mulai mencari alternatif.

s4cmd Alternatif
multi-utas yang lebih baru untuk s3cmd. Terlihat lebih menjanjikan, bagaimanapun, saya perhatikan bahwa itu terus mengunduh ulang file yang sudah ada di sistem file lokal. Itu bukan jenis perilaku yang saya harapkan dari perintah sinkronisasi. Ini harus memeriksa apakah file jarak jauh sudah ada secara lokal (pemeriksaan hash / filesize akan rapi) dan melewatkannya di sinkronisasi berikutnya yang dijalankan pada direktori target yang sama. Saya membuka masalah ( bloomreach / s4cmd / # 46 ) untuk melaporkan perilaku aneh ini. Sementara itu, saya mulai mencari alternatif lain.

awscli
Dan kemudian saya temukan awscli. Ini adalah antarmuka baris perintah resmi Amazon untuk berinteraksi dengan berbagai layanan cloud mereka, termasuk S3.

AWSCLI

Ini memberikan perintah sinkronisasi berguna yang dengan cepat dan mudah mengunduh file keranjang jarak jauh ke sistem file lokal Anda .

$ aws s3 sync s3: // nama-keranjang-anda / home / ubuntu / s3 / nama-keranjang-anda /

Manfaat:

  • Skalabel - mendukung bucket S3 yang sangat besar
  • Multi-utas - menyinkronkan file lebih cepat dengan memanfaatkan banyak utas
  • Cerdas - hanya menyinkronkan file baru atau yang diperbarui
  • Cepat - berkat sifat multi-utasnya dan algoritme sinkronisasi cerdas

Penghapusan Tidak Disengaja

Dengan mudah, syncperintah tidak akan menghapus file di folder tujuan (sistem file lokal) jika hilang dari sumber (S3 bucket), dan sebaliknya. Ini sempurna untuk mencadangkan S3 - jika file terhapus dari bucket, sinkronisasi ulang tidak akan menghapusnya secara lokal. Dan jika Anda menghapus file lokal, itu juga tidak akan dihapus dari keranjang sumber.

Menyiapkan awscli di Ubuntu 14.04 LTS

Mari mulai dengan menginstal awscli. Ada beberapa cara untuk melakukan ini, namun saya merasa paling mudah untuk menginstalnya melalui apt-get.

$ sudo apt-get install awscli

Konfigurasi

Selanjutnya, kita perlu mengonfigurasi awsclidengan ID Kunci Akses & Kunci Rahasia, yang harus Anda peroleh dari IAM , dengan membuat pengguna dan melampirkan kebijakan AmazonS3ReadOnlyAccess . Ini juga akan mencegah Anda atau siapa pun yang memperoleh akses ke kredensial ini untuk menghapus file S3 Anda. Pastikan untuk masuk ke wilayah S3 Anda, seperti us-east-1.

$ aws konfigurasi

aws configure

Persiapan

Mari persiapkan direktori backup S3 lokal, sebaiknya di /home/ubuntu/s3/{BUCKET_NAME}. Pastikan untuk mengganti {BUCKET_NAME}dengan nama keranjang Anda yang sebenarnya.

$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}

Sinkronisasi Awal

Mari lanjutkan dan sinkronkan bucket untuk pertama kalinya dengan perintah berikut:

$ aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /

Dengan asumsi bucket ada, kredensial dan wilayah AWS sudah benar, dan folder tujuan valid, awscliakan mulai mengunduh seluruh bucket ke sistem file lokal.

Bergantung pada ukuran bucket dan koneksi internet Anda, proses ini dapat berlangsung dari beberapa detik hingga berjam-jam. Setelah selesai, kami akan melanjutkan dan menyiapkan tugas cron otomatis untuk terus memperbarui salinan lokal bucket.

Menyiapkan Cron Job

Lanjutkan dan buat sync.shfile di /home/ubuntu/s3:

$ nano /home/ubuntu/s3/sync.sh

Salin dan tempel kode berikut ke sync.sh:

#! / bin / sh

# Gema tanggal dan waktu saat ini

echo '-----------------------------'
tanggal
echo '-----------------------------'
echo ''

# Inisialisasi skrip gema
echo 'Menyinkronkan bucket S3 jarak jauh ...'

# Sebenarnya jalankan perintah sinkronisasi (ganti {BUCKET_NAME} dengan nama bucket S3 Anda)
/ usr / bin / aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /

# Penyelesaian skrip gema
echo 'Sinkronisasi selesai'

Pastikan untuk mengganti {BUCKET_NAME} dengan nama bucket S3 Anda, dua kali di seluruh skrip.

Kiat pro: Anda harus menggunakan /usr/bin/awsuntuk menautkan ke awsbiner, karena crontabmenjalankan perintah dalam lingkungan shell terbatas dan tidak akan dapat menemukan yang dapat dieksekusi sendiri.

Selanjutnya, pastikan ke chmodscript agar bisa dieksekusi oleh crontab.

$ sudo chmod + x /home/ubuntu/s3/sync.sh

Mari coba jalankan skrip untuk memastikannya benar-benar berfungsi:

$ /home/ubuntu/s3/sync.sh

Outputnya harus seperti ini:

keluaran sync.sh

Selanjutnya, mari edit pengguna saat ini crontabdengan menjalankan perintah berikut:

$ crontab -e

Jika ini pertama kalinya Anda mengeksekusi crontab -e, Anda harus memilih editor yang disukai. Saya akan merekomendasikan memilih nanokarena ini yang paling mudah bagi pemula untuk dikerjakan.

Frekuensi Sinkronisasi

Kita perlu memberi tahu crontabseberapa sering skrip kita dijalankan dan di mana skrip berada pada sistem file lokal dengan menulis perintah. Format untuk perintah ini adalah sebagai berikut:

mh dom mon dow

Perintah berikut mengkonfigurasi crontabuntuk menjalankan sync.shskrip setiap jam (ditentukan melalui menit: 0 dan jam: * parameter) dan membuatnya menyalurkan output skrip ke sync.logfile di s3direktori kami :

0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log

Anda harus menambahkan baris ini ke bagian bawah crontabfile yang sedang Anda edit. Kemudian, lanjutkan dan simpan file ke disk dengan menekan Ctrl + W lalu Enter . Anda kemudian dapat keluar nanodengan menekan Ctrl + X . crontabsekarang akan menjalankan tugas sinkronisasi setiap jam.

Kiat pro: Anda dapat memverifikasi bahwa tugas cron per jam berhasil dijalankan dengan memeriksa /home/ubuntu/s3/sync.log, memeriksa isinya untuk tanggal & waktu pelaksanaan, dan memeriksa log untuk melihat file baru mana yang telah disinkronkan.

Siap! Bucket S3 Anda sekarang akan disinkronkan ke server EC2 Anda setiap jam secara otomatis, dan Anda siap melakukannya. Perhatikan bahwa seiring waktu, saat bucket S3 Anda semakin besar, Anda mungkin harus meningkatkan ukuran volume EBS server EC2 Anda untuk mengakomodasi file baru. Anda selalu dapat meningkatkan ukuran volume EBS dengan mengikuti panduan ini .

Elad Nava
sumber
Saya telah meninggalkan pertanyaan di blog Anda, tetapi saya bertanya-tanya apakah ada cara untuk menyinkronkan metadata juga?
Devology Ltd
@Devology Ltd, Sayangnya saya belum memiliki kesempatan untuk bekerja dengan metadata objek S3. Dari pencarian Google cepat, sepertinya tidak awsclimendukung sinkronisasi ini secara otomatis dalam aws s3 syncperintah. Sepertinya Anda harus menerapkannya secara manual.
Elad Nava
Terima kasih @Ekad Nava - Saya menghargai Anda mengonfirmasi apa yang saya yakini sebagai kasusnya.
Devology Ltd
1
Ini @EladNava yang luar biasa, terima kasih telah berbagi, masih relevan di tahun 2020!
pengguna1130176
jawaban ini tidak cocok, jika Anda memiliki jutaan file di dalamnya. Ini menjadi sangat mahal, lambat dan terkadang tidak mungkin - karena batasan pada sistem file.
Psikozoikum
30

Dengan mempertimbangkan tautan terkait, yang menjelaskan bahwa S3 memiliki daya tahan 99.999999999%, saya akan membuang kekhawatiran Anda # 1. Sungguh.

Sekarang, jika # 2 adalah kasus penggunaan yang valid dan perhatian nyata bagi Anda, saya pasti akan tetap menggunakan opsi # 1 atau # 3. Yang mana dari mereka? Itu sangat tergantung pada beberapa pertanyaan:

  • Apakah Anda memerlukan fitur pembuatan versi lainnya atau hanya untuk menghindari penimpaan / penghapusan yang tidak disengaja?
  • Apakah biaya tambahan yang dikenakan oleh versi terjangkau?
  • Amazon Glacier is optimized for data that is infrequently accessed and for which retrieval times of several hours are suitable. Apakah ini baik untukmu?

Kecuali penggunaan penyimpanan Anda sangat besar, saya akan tetap menggunakan versi bucket. Dengan cara ini, Anda tidak memerlukan kode / alur kerja tambahan untuk mencadangkan data ke Glacier, ke bucket lain, atau bahkan ke server lain (yang benar-benar merupakan pilihan IMHO yang buruk, mohon lupakan saja).

Viccari
sumber
4
@SergeyAlekseev Jika Glacier adalah sesuatu yang akan bekerja untuk Anda, sangat cepat untuk menyiapkan aturan siklus hidup pada ember yang secara otomatis mengarsipkan file Anda ke glacier. Mereka masih akan muncul di keranjang (di UI web) tetapi kelas penyimpanan akan berubah dari standar ke gletser. Saya memindahkan file yang diproses dari keranjang utama saya ke keranjang "selesai", dan keranjang selesai memiliki aturan siklus hidup yang mengarsipkan apa pun yang lebih dari 1 hari. Ini adalah file data yang mungkin tidak akan pernah saya sentuh lagi, tetapi perlu disimpan untuk klien.
Dan
28
Saya tidak berpikir 99.999999999% adalah alasan yang cukup baik untuk menjadi tumpukan aws penuh pada penyimpanan / cadangan. Saya tidak berbicara tentang 0,000000001% yang tersisa, tetapi lebih dari itu jika sesuatu yang sangat tidak terduga terjadi, rasanya canggung untuk memiliki seluruh bisnis Anda tergeletak di suatu tempat. Secara tidak terduga, bisa jadi AS akan berperang ke negara tertentu, Amazon diretas sepenuhnya (lih. Sony), dll. Dll.
Augustin Riedinger
11
Saya akan mendukung @AugustinRiedinger untuk yang satu ini: "Masalah S3" secara definisi dapat berupa sesuatu yang tidak Anda ketahui (misalnya, masalah pemerintah) yang dapat membatalkan hipotesis yang mendasari angka S3 SLA seperti 99,99 .... Ketika melakukan sesuatu dalam jangka panjang termasuk mencadangkan data Anda, diversifikasi adalah praktik yang baik, jika tidak harus menjadi prasyarat
lajarre
2
Saya sangat setuju bahwa poin Anda valid. Namun berdasarkan opsi yang diberikan oleh OP (hampir semuanya termasuk alternatif AWS untuk masalah tersebut), menurut saya "masalah S3" tidak akan seluas yang Anda kembangkan. Namun, senang melihat beberapa pemikiran yang lebih luas.
Viccari
4
Jawaban lama, tapi saya merasa perlu menyebutkan kejadian (-ish) baru-baru ini. "Hari ketika Amazon merusak web", sebuah teknologi secara tidak sengaja menghapus sebagian besar server S3 mereka. Bahkan selama 24 jam itu, masalahnya adalah aksesibilitas. Bukan kehilangan data. Sama sekali tidak ada kehilangan data, bahkan mengingat sejumlah besar server yang dihapus, dan mereka masih berhasil bekerja dengan baik dalam SLA mereka
Oberst
14

Anda dapat mencadangkan data S3 Anda menggunakan metode berikut

  1. Jadwalkan proses backup menggunakan datapipeline AWS, dapat dilakukan dengan 2 cara yang disebutkan di bawah ini:

    Sebuah. Menggunakan copyActivity dari datapipeline yang dapat digunakan untuk menyalin dari satu keranjang s3 ke keranjang s3 lain.

    b. Menggunakan ShellActivity datapipeline dan perintah "S3distcp" untuk melakukan salinan rekursif folder s3 rekursif dari bucket ke bucket lain (secara paralel).

  2. Gunakan pembuatan versi di dalam bucket S3 untuk mempertahankan versi data yang berbeda

  3. Gunakan glacier untuk mencadangkan data Anda (gunakan saat Anda tidak perlu memulihkan cadangan dengan cepat ke keranjang asli (perlu beberapa saat untuk mendapatkan kembali data dari gletser karena data disimpan dalam format terkompresi) atau saat Anda ingin menyimpan beberapa biaya dengan menghindari penggunaan cadangan s3 bucket fro lainnya), opsi ini dapat dengan mudah disetel menggunakan aturan siklus proses pada bucket s3 fro yang ingin Anda buat cadangannya.

Opsi 1 dapat memberi Anda lebih banyak keamanan katakanlah jika Anda tidak sengaja menghapus bucket s3 asli Anda dan manfaat lainnya adalah Anda dapat menyimpan cadangan Anda di folder data di bucket s3 lain, dengan cara ini Anda mengetahui data apa yang Anda miliki pada tanggal tertentu dan dapat mengembalikan cadangan tanggal tertentu. Itu semua tergantung pada kasus penggunaan Anda.

Varun
sumber
@David: Seperti yang disarankan david dalam solusinya di bawah ini, bahwa mungkin ada skrip yang mencadangkan s3 bucket setiap hari atau setiap minggu, Ini dapat dengan mudah dicapai oleh poin pertama saya (garis data AWS- yang memberi Anda kemampuan untuk menjadwalkan proses pencadangan-setiap hari , mingguan, dll.). Saya akan merekomendasikan untuk melakukan pencarian di aws datapipeline.
Varun
Ini menunjukkan beberapa janji, karena tidak bergantung pada pendekatan kuno yang tidak unggul dalam memanfaatkan cloud secara maksimal (baca: crons). Data Pipeline juga memiliki percobaan ulang otomatis, dan merupakan layanan terkelola (tanpa server).
Felipe Alvarez
13

Bagaimana jika menggunakan fitur Replikasi Lintas Wilayah yang tersedia di bucket S3 itu sendiri? Berikut beberapa artikel bermanfaat tentang fitur tersebut

Adrian Teh
sumber
Bagaimana jika Anda menghapus file di satu wilayah tidak boleh direplikasi di wilayah lain?
michelem
S3 tidak mereplikasi penghapusan, lihat tautan ini docs.aws.amazon.com/AmazonS3/latest/dev/… .
ᐅ devrimbaris
9

Anda akan berpikir akan ada cara yang lebih mudah saat ini untuk hanya menahan semacam incremental backup di wilayah berbeda.

Semua saran di atas bukanlah solusi yang sederhana atau elegan. Saya tidak benar-benar menganggap gletser sebagai opsi karena saya pikir itu lebih merupakan solusi arsip daripada solusi cadangan. Ketika saya memikirkan cadangan, saya pikir pemulihan bencana dari pengembang junior secara rekursif menghapus ember atau mungkin eksploitasi atau bug di aplikasi Anda yang menghapus barang dari s3.

Bagi saya, solusi terbaik adalah skrip yang hanya mencadangkan satu keranjang ke wilayah lain, satu hari dan satu minggu sehingga jika sesuatu yang buruk terjadi, Anda dapat beralih wilayah saja. Saya tidak memiliki pengaturan seperti ini, saya telah melihat ke dalam hanya belum sempat melakukannya karena akan membutuhkan sedikit usaha untuk melakukan ini, itulah sebabnya saya berharap ada beberapa solusi stok untuk digunakan.

David
sumber
Sepakat. Sangat menarik ketika Anda menggali S3 (bahkan replikasi CRR - built in) ada lubang besar untuk pemulihan bencana. Anda tidak dapat, misalnya, memulihkan keranjang, riwayat versi file, metadata (terutama tanggal terakhir diubah), dll. Semua skenario pemulihan yang tersedia saat ini adalah pemulihan parsial.
Paul Jowett
7

Sementara pertanyaan ini diposting beberapa waktu lalu, menurut saya penting untuk menyebutkan perlindungan penghapusan MFA dengan solusi lain. OP sedang mencoba menyelesaikan penghapusan data yang tidak disengaja . Otentikasi multi-faktor (MFA) bermanifestasi dalam dua skenario berbeda di sini -

  1. Menghapus versi objek secara permanen - Aktifkan penghapusan MFA pada pembuatan versi bucket.

  2. Tidak sengaja menghapus bucket itu sendiri - Siapkan kebijakan bucket yang menolak penghapusan tanpa autentikasi MFA.

Berpasangan dengan replikasi lintas wilayah dan pembuatan versi untuk mengurangi risiko kehilangan data dan meningkatkan skenario pemulihan.

Berikut adalah posting blog tentang topik ini dengan lebih detail.

pengguna1590603
sumber
0

Jika, Kami memiliki terlalu banyak data. Jika Anda sudah memiliki keranjang, pertama kali sinkronisasi akan memakan waktu terlalu lama, Dalam kasus saya, saya memiliki 400GB. Butuh waktu 3 jam untuk pertama kalinya. Jadi saya pikir kita bisa membuat replika adalah solusi yang baik untuk cadangan S3 Bucket.

Ankit Kumar Rajpoot
sumber
Saya akan memindahkan sekitar 7TB ke dalam ember dan mencoba mencari opsi terbaik ... Saya pikir saya membutuhkan sesuatu yang lebih baik daripada sinkronisasi. Saya bertanya-tanya apakah menggunakan saluran pipa untuk menyalin data ke versi GCS gletser mungkin menawarkan keamanan keseluruhan yang terbaik?
Brendon Whateley
AWS DataSync bisa menjadi opsi di sini.
Felipe Alvarez