Apakah Replikasi MySQL Terkena Koneksi Tinggi-Latensi?

11

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?

shlomoid
sumber
2000 detik? Jadi, ketinggalan 33 menit?
Richard
Yap ... Ini naik dan turun sepanjang hari.
shlomoid
2
+1 karena saya suka jenis pertanyaan ini di situs ini. Silakan sampaikan kabar kepada orang lain untuk datang ke situs ini dengan pertanyaan seperti ini !!!
RolandoMySQLDBA

Jawaban:

7

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:

  • Master Menjalankan SQL
  • Master Mencatat Acara SQL dalam Log Binernya
  • Budak Membaca Acara SQL dari Master Binary Logs
  • Slave Menyimpan Acara SQL dalam Log Relai melalui Utas I / O
  • Slave Membaca Event SQL Selanjutnya Dari Relay Log via SQL Thread
  • Budak Mengeksekusi SQL
  • Budak Mengakui Master tentang Eksekusi Lengkap Acara SQL

Pada MySQL 5.5, menggunakan Semisynchronous Replication , sekarang replikasi akan beroperasi sebagai berikut:

  • Master Menjalankan SQL
  • Master Mencatat Acara SQL dalam Log Binernya
  • Budak Membaca Acara SQL dari Master Binary Logs
  • Budak Mengakui Master tentang Penerimaan Acara SQL
  • Slave Menyimpan Acara SQL dalam Log Relai melalui Utas I / O
  • Slave Membaca Event SQL Selanjutnya Dari Relay Log via SQL Thread
  • Budak Mengeksekusi SQL
  • Budak Mengakui Master tentang Eksekusi Lengkap Acara SQL

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

[mysqld]
plugin-dir=/usr/lib64/mysql/plugin
#rpl_semi_sync_master_enabled
#rpl_semi_sync_master_timeout=5000
#rpl_semi_sync_slave_enabled

Langkah 2) Mulai ulang MySQL

service mysql restart

Langkah 3) Jalankan perintah ini di klien MySQL

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave  SONAME 'semisync_slave.so';

Langkah 4) Hapus komentar opsi tiga rpm_semi_sync setelah opsi plugin-dir

[mysqld]
plugin-dir=/usr/lib64/mysql/plugin
rpl_semi_sync_master_enabled
rpl_semi_sync_master_timeout=5000
rpl_semi_sync_slave_enabled

Langkah 5) Mulai ulang MySQL

service mysql restart

Semua selesai !!! Sekarang cukup setup Replikasi MySQL seperti biasa.

RolandoMySQLDBA
sumber
Saya tidak yakin tentang tahap terakhir dari replikasi asinkron - Saya tidak berpikir master tahu seberapa jauh setiap budak telah datang. Mereka dapat meminta bagian dari log biner yang mereka inginkan, sejauh yang saya tahu - apakah Anda memiliki referensi untuk ini?
shlomoid
Kami juga menggunakan replikasi asinkron default di MySQL, bukan tipe asinkron - yang perlu diaktifkan dengan sengaja dengan memasang plugin dan sejenisnya. Apa yang saya coba pahami adalah apakah peristiwa disalurkan dengan gaya net-cat ke dalam slave dari posisi awal di log, atau apakah ada pertukaran bolak-balik antara master dan slave untuk setiap peristiwa, yang bisa mengalami latensi seperti itu.
shlomoid
Dengan segala cara, saya sangat merekomendasikan menggunakan MySQL 5.5 untuk mengambil keuntungan dari bentuk baru Replikasi MySQL ini serta peningkatan InnoDB.
RolandoMySQLDBA
1
Ya, tentu saja kami menggunakan MySQL 5.5, tetapi ini bukan tipe replikasi default. Anda harus melalui seluruh prosedur konfigurasi, instal plugin dan semacamnya, untuk membuatnya bekerja dengan cara semi-sinkron.
shlomoid
2

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:

  1. Klien mengirim ke master kueri SQL (misalnya, menyisipkan) menggunakan transaksi

  2. Master mengeksekusi transaksi. Jika berhasil, catatan disimpan di disk, tetapi transaksi belum dilakukan.

  3. Master mencatat peristiwa penyisipan dalam log biner master Jika master tidak bisa menyimpannya di log biner, transaksi dibatalkan.

  4. Klien menerima tanggapan dari master (sukses atau kembalikan).

  5. Jika berhasil dalam transaksi, utas dump pada master membaca peristiwa dari log biner dan mengirimkannya ke utas slave I / O.

  6. Utas Slave I / O menerima event dan menulisnya di akhir file log relai.

  7. 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:

  1. Klien mengirim ke master kueri SQL (misalnya, menyisipkan) menggunakan transaksi.

  2. Master mengeksekusi transaksi. Jika berhasil, catatan disimpan di disk, tetapi transaksi tidak dilakukan.

  3. 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.

  4. Karena keberhasilan transaksi pada master, utas dump pada master membaca peristiwa dari log biner dan mengirimkannya ke utas slave I / O.

  5. Utas Slave I / O menerima event dan menulisnya di akhir file log relai.

  6. Budak Mengakui Master tentang rekaman peristiwa dalam file log relai.

  7. Master melakukan transaksi penyisipan.

  8. Klien menerima respons dari master (sukses).

  9. 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

Yakub Nikom
sumber
1

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.

Richard
sumber
1
Anda mendapatkan +1 untuk menyebutkan bagaimana Replikasi MySQL adalah single-threaded, tetapi saya harus memenuhi syarat pernyataan Anda sebagai berikut: Replikasi MySQL adalah dual-threaded menggunakan I / O Thread untuk mengunduh Acara SQL Dari Master ke Slave dan Thread SQL untuk diproses Acara SQL secara lokal di Budak. Namun, transmisi Acara SQL adalah single-threaded, yang secara kontekstual benar untuk pertanyaan ini.
RolandoMySQLDBA
2
BTW Tolong jangan gunakan LIMIT dengan pernyataan UPDATE dan DELETE karena urutan baris yang diperbarui atau dihapus mungkin tidak sama pada Slave seperti pada Master. Jika faktanya, pesan peringatan tentang ini muncul seperti "Statement Not BinLog-Safe" di log kesalahan.
RolandoMySQLDBA
Ooh, poin bagus tentang tidak menggunakan LIMIT dengan UPDATE dan DELETE. Saya akan mengubah jawaban saya untuk menghapusnya.
Richard