Kami memiliki master vanilla dan slave pengaturan MySQL yang berada di pusat data yang berbeda, dan slave lain di pusat data yang sama dengan master.
Bandwidth antara pusat data cukup tinggi (dalam tolok ukur jaringan yang kami lakukan, kami dapat mencapai 15MB / detik), tetapi latensi ada, yaitu sekitar 28 ms. Ini tidak tinggi dengan cara apa pun, tetapi jauh lebih tinggi daripada latensi sub-detik di pusat data yang sama.
Kadang-kadang, kami mengalami kelambatan yang serius (2000 detik dan lebih banyak) dengan menghapus budak, sementara budak lokal tetap up to date. Saat melihat slave jarak jauh yang tertinggal, untaian SQL biasanya menghabiskan waktu menunggu utas untuk memperbarui log relai. Tuan menunjukkan "menunggu jaring" atau semacam itu pada saat yang sama.
Jadi itu artinya jaringan, tetapi kami masih memiliki bandwidth gratis pada saat ini terjadi.
Pertanyaan saya adalah : bisakah latensi antara pusat data memengaruhi kinerja replikasi? Apakah utas slave io hanya mengalirkan peristiwa sampai master berhenti mengirimnya, atau apakah itu menyatukan master di antara peristiwa?
sumber
Jawaban:
Jawaban langsung untuk pertanyaan Anda adalah Ya, tetapi itu tergantung pada versi MySQL yang Anda jalankan. Sebelum MySQL 5.5, replikasi akan beroperasi sebagai berikut:
Pada MySQL 5.5, menggunakan Semisynchronous Replication , sekarang replikasi akan beroperasi sebagai berikut:
Paradigma baru ini akan memungkinkan seorang Budak untuk lebih dekat disinkronkan dengan tuannya.
Meskipun demikian, latensi dalam jaringan dapat menghambat Replikasi Semisync MySQL ke titik di mana ia kembali ke replikasi asinkron gaya lama. Mengapa Jika batas waktu terjadi tanpa ada budak yang mengakui transaksi, master akan kembali ke replikasi asinkron. Ketika setidaknya satu budak semisinkron menangkap, master kembali ke replikasi semisinkron.
UPDATE 2011-08-08 14:22 EDT
Konfigurasi MySQL 5.5 Semisynchronous Replication sangat mudah
Langkah 1) Tambahkan empat (4) baris ini ke /etc/my.cnf
Langkah 2) Mulai ulang MySQL
Langkah 3) Jalankan perintah ini di klien MySQL
Langkah 4) Hapus komentar opsi tiga rpm_semi_sync setelah opsi plugin-dir
Langkah 5) Mulai ulang MySQL
Semua selesai !!! Sekarang cukup setup Replikasi MySQL seperti biasa.
sumber
Saya sangat suka bagaimana Rolando menggambarkan urutan operasi yang dilakukan replikasi. Namun, saya pikir akan lebih jelas jika kita menambahkan komponen lain - klien.
Dengan klien, urutan operasi untuk replikasi asinkron dapat menjadi sebagai berikut:
Klien mengirim ke master kueri SQL (misalnya, menyisipkan) menggunakan transaksi
Master mengeksekusi transaksi. Jika berhasil, catatan disimpan di disk, tetapi transaksi belum dilakukan.
Master mencatat peristiwa penyisipan dalam log biner master Jika master tidak bisa menyimpannya di log biner, transaksi dibatalkan.
Klien menerima tanggapan dari master (sukses atau kembalikan).
Jika berhasil dalam transaksi, utas dump pada master membaca peristiwa dari log biner dan mengirimkannya ke utas slave I / O.
Utas Slave I / O menerima event dan menulisnya di akhir file log relai.
Setelah peristiwa masuk ke log estafet, slave SQL thread mengeksekusi
acara tersebut untuk menerapkan perubahan pada database pada slave.
Dalam skenario ini, master tidak peduli tentang slave dan klien hanya tahu bahwa ada sesuatu yang salah pada slave dengan secara manual menjalankan perintah "SHOW SLAVE STATUS".
Dalam kasus replikasi semi-sinkron urutan operasi bisa sebagai berikut:
Klien mengirim ke master kueri SQL (misalnya, menyisipkan) menggunakan transaksi.
Master mengeksekusi transaksi. Jika berhasil, catatan disimpan di disk, tetapi transaksi tidak dilakukan.
Master mencatat peristiwa penyisipan dalam log biner master Jika master tidak dapat menyimpannya dalam log biner, transaksi dibatalkan dan klien menerima respons hanya dalam kasus rollback.
Karena keberhasilan transaksi pada master, utas dump pada master membaca peristiwa dari log biner dan mengirimkannya ke utas slave I / O.
Utas Slave I / O menerima event dan menulisnya di akhir file log relai.
Budak Mengakui Master tentang rekaman peristiwa dalam file log relai.
Master melakukan transaksi penyisipan.
Klien menerima respons dari master (sukses).
Setelah acara masuk ke log estafet, slave SQL thread mengeksekusi
acara tersebut. Master dan klien tidak tahu apakah eksekusi berhasil atau tidak.
Replikasi semi-sinkron memecahkan satu kasus penting ketika budak atau jaringan mati dan master terus melanjutkan. Kemudian master mati dan Anda ingin me-restart budak lama sebagai master baru hanya karena Anda memperbaiki simpul itu.
Jadi Anda mulai simpul itu sebagai master baru, Anda memperbaiki master lama dan sekarang Anda ingin menggunakannya sebagai budak. Node itu masih memiliki data, tetapi jika budak baru mulai dari posisi di mana master baru mulai akan ada rekaman duplikat.
Jika periode menunggu tidak terbatas, posisi master log biner akan selalu disinkronkan dengan posisi log slave relay dengan asumsi bahwa semua permintaan pada slave berhasil. Seberapa realistis asumsi ini?
Saya pikir ini sangat realistis. Salah satu kasus yang paling umum dari kegagalan permintaan slave adalah "duplikat catatan". Di mana catatan duplikat datang ke budak jika tuan tidak memilikinya? Itu datang dari posisi yang salah yang diberikan kepada budak untuk mulai meniru. Posisi replikasi awal termasuk catatan yang sudah direplikasi. Dalam kasus replikasi semi-sinkron situasi ini tidak akan terjadi.
Yakub Nikom
sumber
Kualifikasi : Saya bukan pengguna MySQL, jadi kebanyakan, ini hanya penelitian saya di internet.
Seperti yang saya yakin Anda tahu, batasan terbesar dari replikasi MySQL adalah single threaded. Jadi, sementara utas sibuk mengirim data ke budak di rumah, ia tidak akan dapat mengirim data ke budak jarak jauh. Ini per di sini .
Per disini :
Satu hal yang perlu Anda pastikan adalah mengurangi waktu transaksi Anda. Ini memungkinkan utas replikasi Anda memiliki kesempatan untuk mengejar ketinggalan dengan apa yang terjadi dalam database. Anda ingin transaksi Anda sesingkat mungkin.
Salah satu cara untuk melakukan ini adalah dengan memotong kueri; batasi baris yang diubah oleh UPDATE atau DELETE melalui penggunaan klausa WHERE. Jika Anda memasukkannya ke dalam loop, Anda dapat mengulangi daftar, memulai dan melakukan transaksi setiap kali. (MEMPERBARUI / HAPUS ketiga pertama, ketiga kedua, kemudian ketiga masing-masing akhir dalam transaksi sendiri.) Saya pribadi akan sangat menyarankan untuk tidak melakukan ini karena Anda membuka diri terhadap kemungkinan data dalam tabel berubah antara transaksi. Tapi, ada kemungkinan untuk meningkatkan kinerja ini jika Anda yakin tidak ada orang lain yang bermain-main dengan tabel (dan tidak akan pernah) .
Kemungkinan lain adalah untuk tidak mereplikasi transaksi yang sudah berjalan lama itu, tetapi menjalankannya pada master (yang mereplikasi ke slave lokal) dan kemudian menjalankannya pada slave jarak jauh secara terpisah. Ini akan membebaskan utas replikasi sehingga tidak macet sampai tanda 30+ menit.
Per disini :
Satu kemungkinan terakhir adalah menyesuaikan ukuran buffer TCP Anda. Tujuannya adalah untuk mengurangi jumlah komunikasi yang Anda lakukan antara master dan slave. Ini dapat membantu mengurangi latensi.
Secara pribadi, saya akan mencoba ini jika semuanya gagal. Saya menduga bahwa masalahnya lebih disebabkan oleh sistem replikasi ulir tunggal daripada latensi jaringan. Jaringan biasanya akan lama sebelum tanda 30 menit. (30 menit?!)
Bookmark JHammerb's Delicious memiliki beberapa tautan untuk replikasi mysql yang mungkin ingin Anda periksa juga.
Saya harap itu membantu.
sumber