MySQL cadangan downtime pada anggaran

14

Skenario cadangan MySQL saya saat ini adalah untuk mereplikasi db kami ke server kedua dan menjalankan mysqldump di server itu untuk menghapus segala downtime dari penguncian tabel atau baris. Ini bekerja dengan baik tetapi biaya $ 150 per bulan untuk server kedua (hosting Australia jauh lebih mahal daripada AS.)

Saya membaca banyak pertanyaan di sini tentang ini, kebanyakan orang memerlukan bantuan dengan backup terjadwal dan yang lainnya yang bukan yang saya butuhkan. Saya perlu mysqldump (lebih disukai setiap 4 jam) tanpa downtime. Db ~ 7GB tidak terkompresi, sehingga mysqldump dapat memakan waktu tergantung pada server.

Saya telah mempertimbangkan mereplikasi ke mesin yang sama, tetapi saya tidak ingin budak memakan memori yang sangat dibutuhkan. Saya tidak yakin dapat membatasi penggunaan memori berdasarkan basis per db? Either way, ini akan menempatkan beban pada server sambil membuang db.

Saya baru saja membaca ini http://www.zmanda.com/quick-mysql-backup.html dan kelihatannya bagus, $ 300 per tahun ok, itu menghemat banyak hal.

Sayangnya saya tidak dapat mereplikasi ke Amazon RDS tetapi saya bisa mereplikasi ke contoh RC2 mikro tetapi replikasi akan terjadi over-net dan ping adalah ~ 220ms.

Saya melihat beberapa orang di sini berbicara tentang snapshot LVM yang mungkin merupakan pilihan yang baik. Saya tidak tahu banyak tentang opsi ini.

Pendapat akan sangat dihargai.

Kristen
sumber
Apa situs webnya? Berikan deskripsi tentang fungsinya
jamespo
Anda dapat membeli server dengan harga jauh lebih murah dari $ 150 sebulan. 7GB tidak terdengar seperti data sebanyak itu. Anda dapat membeli server 128MB sekali pakai hanya dengan $ 1,50 per bulan dan 1GB lebih mengesankan untuk sekitar $ 20. Karena tidak perlu untuk cache permintaan, Anda dapat dengan mudah menangani banyak penulisan dengan GB RAM dan server dengan SSD.
Xeoncross
Snapshots LVM tidak akan memberikan gambar yang konsisten kecuali Anda mematikan server terlebih dahulu. Anda dapat melakukan snapshot panas - dan mencoba membangun kembali file - tetapi berisiko.
symcbean

Jawaban:

10

Jika Anda menggunakan tabel innodb, Anda bisa menggunakan

http://www.percona.com/docs/wiki/percona-xtrabackup:start

Itu akan mengambil dump database Anda yang dapat diimpor oleh alat mereka juga tanpa mengunci. Saya percaya jika Anda memiliki tabel myisam itu mengunci mereka.

Mike
sumber
Saya punya beberapa tabel MyISAM tetapi tidak sering digunakan, jadi pengunciannya ok. Terima kasih atas komentarnya, akan memeriksanya.
Christian
Percona rocks btw!
Christian
5

Jika Anda menggunakan innodb atau backend lain yang sepenuhnya transaksional, Anda dapat menggunakan mysqldump --single-transaction .... Saya telah menggunakan ini pada basis data yang cukup besar (~ 100GB) dengan hasil yang baik; jika database berada di bawah beban yang berat itu bisa memakan waktu berjam - jam tetapi tidak berfungsi tanpa mengunci tabel Anda. Replikasi umumnya lebih baik tetapi kadang-kadang Anda menginginkan file dump yang bagus. Perlu diingat bahwa Anda dapat membuang budak replikasi mysql juga.

Dari halaman mysqldump (perhatikan peringatan tentang operasi yang akan bocor ke dalam transaksi):

 ·   --single-transaction

   This option sends a START TRANSACTION SQL statement to the server
   before dumping data. It is useful only with transactional tables
   such as InnoDB, because then it dumps the consistent state of the
   database at the time when BEGIN was issued without blocking any
   applications.

   When using this option, you should keep in mind that only InnoDB
   tables are dumped in a consistent state. For example, any MyISAM or
   MEMORY tables dumped while using this option may still change
   state.

   While a --single-transaction dump is in process, to ensure a valid
   dump file (correct table contents and binary log coordinates), no
   other connection should use the following statements: ALTER TABLE,
   CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE. A
   consistent read is not isolated from those statements, so use of
   them on a table to be dumped can cause the SELECT that is performed
   by mysqldump to retrieve the table contents to obtain incorrect
   contents or fail.
Joshua Hoblitt
sumber
Joshua, saya melihat kesalahan ketik Anda 'sendiri' dan catatan bahwa saya merasa begitu sulit untuk mengetik 'sendiri' karena saya hanya secara alami ketik mysql. Saat ini saya melakukan mysqldump 4 jam di mesin slave. transaksi tunggal sepertinya pilihan yang bagus, terima kasih!
Christian
Doh. Tangkapan bagus. :)
Joshua Hoblitt
Saya tidak berpikir bahwa mysqldump adalah pilihan yang bagus untuk database yang begitu besar. Jika perlu waktu beberapa jam untuk dibuang, diperlukan waktu berminggu-minggu untuk pulih. Uji waktu pemulihan Anda dan sumber daya yang diperlukan untuk menyelesaikannya!
Baron Schwartz
Terima kasih Baron, memang butuh sedikit waktu untuk memulihkan - bukan minggu, tetapi masih waktu yang cukup. Saya akan melihat berapa lama waktu saya mendapatkan server baru saya. Mungkin salinan file akan berhasil menjadi jauh lebih efektif.
Christian
2

Saya tidak melihat banyak masalah mereplikasi koneksi latensi tinggi ke VPS murah di AS. Latensi tinggi seharusnya tidak terlalu menjadi masalah. Replikasi dirancang untuk dapat mengejar ketinggalan dengan cepat bahkan ketika seorang budak jatuh berjam-jam , yaitu dapat beroperasi secara tidak sinkron.

Selama Anda dapat mempertahankan bandwidth keluar sebanyak itu pada paket hosting Australia Anda.

Berikut ini adalah respons yang jauh lebih rinci untuk apakah latensi tinggi itu penting

thomasrutter
sumber
1
Saya tidak tahu berapa banyak bandwidth yang akan digunakan. Mungkin saya harus memantau lalu lintas antara kotak yang saya miliki sekarang untuk melihat berapa banyak yang digunakan.
Christian
1
Anda mungkin "kecewa" dengan mencoba menjalankan mysql di atas EBS. Saya sangat menyarankan Anda menguji kinerja sebelum mencoba menggunakannya untuk replikasi.
Joshua Hoblitt
Terima kasih untuk itu, pasti akan merasakannya sebelum saya mulai mengandalkan itu - jika ini adalah pendekatan yang saya ambil.
Christian
1

Secara realistis, hanya waktu yang diperlukan untuk benar-benar mengekspor basis data akan menjadi tidak aktif. Lakukan selama periode waktu yang cukup lambat dan seharusnya tidak ada masalah APA PUN. Apa yang sebenarnya diharapkan oleh departemen TI pada anggaran itu?

Anda harus dapat mysqldump database 7GB dalam 5-10 menit MAX, lepaskan kunci baca / tulis dan downtime akan berakhir. Anda kemudian dapat menemukan cara bandwidth paling efektif untuk file 7GB ke server baru (baca: KOMPRESI TINGGI). Anda punya banyak waktu untuk mentransfer file dan mengimpor ke MySQL di server baru. Kemudian, masukkan informasi masterlog dan mulai replikasi. Seharusnya sepotong kue!

Dokumentasi MySQL sangat fantastis : http://dev.mysql.com/doc/refman/5.0/en/replication.html

Luke
sumber
Dan saya bermaksud menambahkan, replikasi tidak menggunakan banyak bandwidth. Tidak diragukan lagi itu adalah panggilan yang lebih baik daripada mysqldump-ing setiap empat jam !!!
Lukas
Siapa yang menyebut departemen TI? Ini hanya situs web saya. :) Dan saya saat ini mereplikasi untuk cadangan tetapi tidak yakin itu pendekatan terbaik pada $ 150 p / m. Seperti yang dinyatakan, opsi instance mikro EC2 ada di sana.
Christian
@ Kristen apa p / m? Saya tidak tahu apa itu, tetapi $ 150 untuk satu p per m tampaknya mahal 8- |
TehShrike
@ Teehrike, p / m = per bulan. Hosting Australia jauh lebih mahal daripada hosting AS. Juga, saya mencoba untuk menjaga server kedua di jaringan yang sama untuk kecepatan dan transfer tidak dihitung terhadap alokasi bandwidth.
Christian
1

Saya tidak yakin dapat membatasi penggunaan memori per basis db

Tentu saja Anda bisa - Anda hanya perlu menjalankan slave dengan /etc/my.cnf yang berbeda

Anda bahkan dapat melakukan hal-hal untuk memanipulasi prioritas penjadwalan / afinitas CPU pada master dan slave menggunakan nice / renice dan tasket (dengan asumsi itu adalah server Linux).

tetapi replikasi akan terjadi over-net dan ping ~ 220ms

Latensi cukup tidak relevan - yang penting adalah bandwidth - dan bandwidth database (dengan asumsi Anda tidak mereplikasi data sesi) adalah beberapa urutan besarnya lebih kecil dari bandwidth HTTP.

Saya perlu [membuat cadangan database yang konsisten] (lebih disukai setiap 4 jam) tanpa downtime

Tetapi strategi yang Anda diskusikan tidak memungkinkan untuk pemulihan pada saat seperti itu.

Saya pikir opsi termurah akan menjadi budak di mesin yang sama - dan jika itu mempengaruhi kinerja di luar apa yang dapat Anda konfigurasi ulang maka tingkatkan paket hosting saat ini.

Anda mungkin juga mempertimbangkan menjalankan slave yang terputus: aktifkan log bin pada server saat ini. Dapatkan cadangan, pulihkan cadangan di mesin lokal, lalu salin log tempat sampah saat diputar dan putar ke depan pada DBMS lokal .

symcbean
sumber
Respons yang bagus, terima kasih untuk itu. Server baru yang saya cari akan memiliki memori yang cukup untuk memungkinkan seorang budak pada mesin yang sama, tapi saya sangat menyukai gagasan tentang binlog yang disalin / digulirkan ke depan. Terima kasih lagi!
Christian
1

Saran saya:

1 - simpan akun / server kedua Anda dan terapkan replikasi ke database di akun / server asli Anda.

2 - hentikan replikasi ke akun / server kedua.

3 - memantau kinerja selama beberapa hari. Pastikan Anda memantaunya cukup lama untuk memasukkan periode tersibuk Anda.

4 - siap untuk beralih ke pengaturan lama Anda jika ada masalah kinerja utama. Inilah alasan mengapa Anda menyimpan akun kedua.

5 - beli lebih banyak kapasitas / tingkatkan server di akun asli Anda. Ini harus lebih murah daripada membayar untuk dua server yang saya percaya.

6 - batalkan akun kedua.

Semoga berhasil!

jdias
sumber