Saya mencari untuk membuat cluster MySQL load-seimbang, tetapi tanpa load-balancer yang sebenarnya, agar tidak menambah titik kegagalan atau kompleksitas.
Apa yang saya pikirkan adalah memiliki yang berikut:
Memiliki pengaturan master-master untuk MySQL
Pada setiap klien, tempatkan proxy round-robin sederhana yang akan merotasi permintaan antar server.
Apakah ini mungkin? Atau ada cara yang lebih baik untuk mencapai ini?
Jawaban:
Harap baca jawaban saya yang lain untuk pertanyaan ini sebelum benar-benar menggunakan proxy MySQL dalam bentuk apa pun. Jika Anda memiliki 2 server master-master tempat CMS menulis, dan 10 httpd yang hanya membacanya, Anda akan baik-baik saja, tetapi (seperti yang ditunjukkan dalam jawaban lain) itu tidak selalu demikian. Anda sudah diperingatkan.
.
Jika Anda menjalankannya dalam mode TCP, itu bisa lebih baik daripada Wackamole. Jika saya harus memilih di antara mereka, saya akan menggunakan HAProxy. Juga HAProxy dapat memiliki banyak backend, Waclamole hanya dapat memiliki 2. Perhatikan bahwa HAProxy adalah "bodoh", itu menghubungkan soket tanpa melihat apa yang ada di dalam aliran - MySQL Proxy yang berdedikasi mungkin memiliki opsi untuk mengarahkan berbagai permintaan ke server tertentu .
sumber
Mungkin perlu disebutkan, Galera Replication untuk MySQL untuk setup MySQL multi-master yang benar. Galera adalah protokol replikasi sinkron, sehingga aplikasi dapat membaca dan menulis ke salah satu Server MySQL. Berikut ini adalah tutorial singkatnya: http://www.severalnines.com/clustercontrol-mysql-galera-tutorial
Adapun memuat penyeimbang di depan Server MySQL, baik menggunakan konektor MySQL yang mendukung fungsi ini (misalnya Connector / J untuk Java, atau Mysqlnd untuk php)
Jika Anda tidak memiliki konektor yang dapat melakukan ini, maka gunakan sesuatu seperti Proxy HA. Skrip ini secara otomatis mengatur HA Proxy dan memelihara daftar Server MySQL yang bagus: https://github.com/severalnines/haproxy
Salam Hormat,
Vinay
www.severalnines.com
sumber
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
(
%
untukmodulo
)... 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 masalahSaya harap Anda akan belajar dari kesalahan saya ;-)
sumber
Kumpulan database MySQL yang seimbang (atau lainnya) cukup sia-sia. Jika Anda menulis ke lebih dari satu server, maka Anda akan mengalami masalah, atau Anda menggunakan replikasi sinkron (yang tetap tidak didukung oleh MySQL), dan itu sangat mengganggu kinerja karena perlu menyinkronkan kunci.
Saya sarankan Anda membagi banyak membaca / menulis, dan memuat keseimbangan membaca di antara budak mysql, dan memiliki master tunggal untuk menulis, atau menggunakan pasangan failover aktif / pasif untuk master Anda.
Pada dasarnya, Anda tidak dapat mengatur skala penulisan dengan menempatkan lebih banyak server dalam database sebagai budak, karena masing-masing masih harus menulis seluruh penulisan-penulisan aplikasi Anda.
Untuk menulis skala Anda perlu membagi data Anda secara logis di beberapa server, dengan mempartisi atau "sharding" dll. Ini biasanya memerlukan perubahan nontrivial (pikir sangat sulit untuk menguji) pada aplikasi Anda, jadi Anda tidak ingin melakukan ini kecuali Anda BENAR-BENAR Membutuhkannya.
Anda tentu saja dapat menggunakan MySQL cluster jika Anda benar-benar menginginkannya, tetapi itu adalah mesin yang sama sekali berbeda dengan fitur dan kekurangannya sendiri - ini agak rumit untuk diatur tetapi benar-benar memberikan database HA load-balance pada perangkat keras komoditas. Itu masih menderita hukuman kinerja menulis dari menggunakan replikasi sinkron, tetapi tidak memungkinkan Anda untuk skala menulis karena telah dibangun di partisi di server.
sumber
Panduan hebat lainnya tentang hal ini yang saya temukan ...
http://www.dancryer.com/2010/01/mysql-circular-replication
Ini adalah bagian 1 dari tiga seri posting:
MySQL Load-Balanced Cluster Guide - Bagian 1 - menyiapkan server sendiri dan mengkonfigurasi replikasi MySQL.
Panduan MySQL Load-Balanced Cluster - Bagian 2 - mengatur skrip untuk memantau status node cluster MySQL Anda, yang akan kami gunakan dalam panduan berikutnya untuk mengatur proxy kami.
Panduan MySQL Load-Balanced Cluster - Bagian 3 - mengatur penyeimbang beban dengan HAProxy, menggunakan skrip pemantauan
sumber
Secara pribadi, cara yang lebih baik adalah menggunakan load balancer!
Ya, itu memang menambah titik kegagalan lain, tetapi setiap rutinitas yang Anda lakukan, atau instal pada SETIAP klien, menambah lebih banyak kerumitan daripada penyeimbang beban standar ....
sumber
Connector / J memiliki kemampuan untuk memuat permintaan yang seimbang di beberapa server. Ini terutama ditujukan untuk MySQL NDB Cluster di mana semua node SQL akan memiliki tampilan data yang konsisten tetapi jika Anda dapat memastikan bahwa dua database master akan cukup konsisten antara dua master ini, mungkin aman untuk aplikasi Anda.
String hubungkan akan terlihat seperti:
jdbc: mysql: loadbalance: // host-1, host-2, ... host-n / dbname? loadBalanceStrategy = "acak" & loadBalanceBlacklistTimeout = 5000
sumber
Memisahkan penulisan tidak akan mengambil beban server karena penulisan masih harus direplikasi.
Jika Anda hanya menggunakan 2 server gunakan detak jantung dengan drbd dan biarkan drbd menangani replikasi. Jika server pertama gagal, server kedua akan mengambil alih. Jika Anda ingin menempatkan server kedua untuk digunakan, Anda dapat menggunakan gfs di atas drbd dan kemudian menjalankan server kedua sebagai hanya baca dan menggunakannya sebagai server baca. Ketika failover terjadi maka ubah server untuk membaca / menulis.
re: wackamole - wackamole tidak terbatas pada 2 server
Saya sedang mengerjakan seri tutorial yang membahas hal ini, tetapi sangat mudah untuk diatur.
sumber
Untuk memberikan jawaban yang lebih baru untuk pertanyaan ini, dengan versi 5.6 dari MySQL, ia memperkenalkan GTID (Global Transaction Identifieres) yang bertujuan untuk membuat replikasi asinkron lebih kuat dan menempatkan MySQL dalam perlombaan untuk HA (Ketersediaan Tinggi) lagi.
Referensi: 16.1.3 Replikasi dengan Pengidentifikasi Transaksi Global (Dokumentasi MySQL)
Saya berpikir bahwa penggunaan HAProxy untuk memuat pertanyaan keseimbangan memperkenalkan SPOF (Single Point Of Failure), dan menambah detak jantung membuat solusi ini rumit.
Solusi yang lebih sederhana adalah menghubungkan melalui konektor Java JConnector yang bertujuan untuk memuat kueri keseimbangan melalui url jdbc dengan semua node MySQL. Ia dapat menangani pengaturan master / slave atau master / master .
Itu memungkinkan untuk mengatur solusi cluster HA dari kotak dengan MySQL.
sumber