Apakah ini strategi cadangan yang valid untuk MongoDB?

11

Saya punya satu server khusus dengan database MongoDB sekitar 10GB. Saya perlu melakukan backup harian, tetapi saya tidak bisa memiliki downtime dengan database. Apakah mungkin untuk menggunakan replika yang diatur pada disk tunggal (dengan 2 contoh mongod berjalan pada port yang berbeda), dan cukup mengambil yang sekunder offline dan mencadangkan file data ke penyimpanan di luar kantor seperti S3 (penjurnalan dihidupkan)? Atau apakah menggunakan master / slave lebih baik daripada set replika?

Apakah ini layak, dan jika demikian, potensi masalah apa yang bisa saya miliki? Jika tidak, bagaimana saya membuat konsep ini berfungsi?

James Simpson
sumber

Jawaban:

6

ReplicaSet akan berfungsi dalam skenario ini. Namun, saya tidak tahu apakah memiliki dua instance MongoDB di server yang sama adalah ide yang bagus - ini tergantung pada perangkat keras / lunak dan beban server.

Untuk memastikan backupsimpul MongoDB Anda tidak menjadi master, atur priorityparameternya ke 0, mis

rs.add({_id: 1, host: "localhost:<port>", priority: 0})

CATATAN : jika Anda tidak dapat memiliki waktu henti, Anda HARUS memiliki setidaknya 2 simpul MongoDB primer di ReplicaSet, lihat artikel

Alexander Azarov
sumber
2

Salah satu strategi untuk dipertimbangkan adalah menggunakan opsi "tersembunyi" pada simpul cadangan di replaset Anda. Dari blog MongoDB:

Server tersembunyi tidak akan muncul di hasil isMaster (). Ini juga berarti bahwa mereka tidak akan digunakan jika driver secara otomatis mendistribusikan membaca ke budak. Server tersembunyi harus memiliki prioritas 0 (Anda tidak dapat memiliki primer tersembunyi). Untuk menambahkan anggota tersembunyi, jalankan:

rs.add ({"_ id": num, "host": hostname, "priority": 0, "hidden": true})

Travis Dunn
sumber
1

Perangkat replika lebih disukai secara umum tetapi juga dalam hal ini hanya karena fungsi pemulihan otomatis dan sinkronisasi otomatis. Metode cadangan yang Anda gambarkan terdengar sangat masuk akal dan telah digunakan sebelumnya dengan database lain juga.

Satu-satunya masalah potensial yang saya lihat adalah bahwa dalam keadaan tertentu, sekunder Anda dapat dipromosikan ke primer Anda dan Anda akan a) perlu mengambil cadangan dari sekunder yang baru, atau b) membuat skrip cadangan Anda cukup pintar untuk memberi tahu contoh MongoDB untuk mundur.

Kabar baiknya adalah bahwa hal itu seharusnya sepele

  1. Permintaan sumber cadangan Anda untuk mengetahui instance mana yang primer dan mana yang sekunder ( db.isMaster())
  2. Meyakinkan instance cadangan untuk mundur menggunakan rs.freeze()dan rs.stepDown()memerintahkan atau menyambung kembali ke sekunder
Charles Hooper
sumber
Apakah ini bukan pilihan untuk menetapkan prioritas ke 0 seperti yang disarankan Alexander sehingga yang sekunder tidak pernah menjadi yang utama?
James Simpson
Anda harus melakukan beberapa pengujian, tetapi saya tidak yakin apakah sekunder hanya akan siaga jika karena alasan tertentu proses utama turun. Saya selalu ingin orang kedua mengambil alih;)
Charles Hooper
1
>> sekunder Anda dapat dipromosikan ke utama - Seperti yang disebutkan, menetapkan sekunder ke prioritas 0 akan mencegahnya beralih ke master.
Jonesome Reinstate Monica
Anda dapat terhubung ke salah satu rekan dari daftar node peer Anda (bisa berupa node primer, sekunder, arbiter, atau tersembunyi), tanyakan rekan itu siapa yang sekunder ( rs.status()dan lewati result["members"]), dan sambungkan ke salah satu sekunder untuk melakukan pencadangan.
yfeldblum