Replikasi master-master tidak sebagus yang Anda kira, hal yang sama berlaku untuk proksi round-robin dan solusi 'mudah' serupa. Jika Anda mengkomit data colliding ke server terpisah dengan cukup cepat (lebih cepat daripada penundaan antara server, yang pada server produksi mungkin hingga satu detik penuh *), keduanya akan menerima data. Jika Anda memiliki server lelang, Anda baru saja menjual mobil yang sama dua kali . Siapa yang membelinya? Itu tergantung pada DB mana yang akan Anda tanyakan!
Aplikasi harus menyadari bahwa sebenarnya ada 2 database di luar sana dan harus mengetahui kedua alamat ip mereka. Jika Anda ingin "menjual", Anda harus fe
DB_number = `auction_number` % `number_of_databases`
( %untuk modulo)
... dan komit ke basis data DB_number. Jika Anda mendapatkan kesalahan koneksi, maka mungkin lakukan dengan yang lain (tetapi dalam kasus server lelang, saya hanya akan menampilkan kesalahan).
Juga, alamat IP harus wackamole -d antara kedua server. Pada skenario bencana, di mana satu server database turun selama beberapa jam dalam waktu penggunaan puncak, Anda akan menemukan bahwa aplikasi akan mencoba untuk terhubung ke server yang tidak ada dan menggantung sampai TIMEOUT, katakanlah, 3s. Tiba-tiba setengah dari kueri Anda berjalan 3s lebih lama (dan mereka semua pergi ke database yang sama pada akhirnya - yang tidak membuatnya berjalan lebih cepat daripada sebelum bencana). Ini tidak membuat httpd Anda bahagia, karena mungkin memiliki kumpulan koneksi terbatas dari utas penangan permintaan bersamaan ...
* penundaan replikasi pada server produksi mungkin hingga satu detik penuh - Saya telah menguji ini di colocation jarak jauh dan di pusat data kami dan untuk seperti 99% dari waktu itu 0, tapi kadang-kadang mysql menunjukkan 1s. Pada lalu lintas besar saya memiliki banyak tabrakan karena aplikasi klien membuat dua permintaan sehingga menghasilkan dua permintaan, masukkan dan pilih. Untuk beberapa kasus, baris hanya tidak ada lagi , sehingga Kami menggunakan hash dari userID dan tetap masalah
Saya harap Anda akan belajar dari kesalahan saya ;-)