MySQL cluster yang seimbang tanpa penyeimbang beban

10

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:

  1. Memiliki pengaturan master-master untuk MySQL

  2. 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?


sumber
Saya ingin tahu, untuk apa Anda akan menggunakannya?
Saya mencoba menambahkan HA ke solusi kami, tanpa melibatkan load-balancers dan hal-hal serupa.

Jawaban:

3

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.

MySQL Proxy adalah program sederhana yang berada di antara klien Anda dan server MySQL yang dapat memantau, menganalisis, atau mengubah komunikasi mereka. Fleksibilitasnya memungkinkan penggunaan tanpa batas; yang umum termasuk: load balancing; kegagalan; analisis permintaan; pemfilteran dan modifikasi permintaan; dan masih banyak lagi.

.

HAProxy adalah solusi gratis, sangat cepat dan andal yang menawarkan ketersediaan tinggi, penyeimbangan beban, dan proksi untuk aplikasi berbasis TCP dan HTTP

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
Hanya untuk memverifikasi: 1) HAProxy akan membutuhkan mesin tambahan / 2 mesin untuk HA 2) Wackamole hanya dapat mendukung 2 server per pengaturan? Salam.
Pola penggunaan standar Wackamole (sebenarnya satu-satunya yang saya tahu) adalah memiliki serverA dan serverB saling mengawasi dan mengambil IP yang lain jika mati. Situs web Wackamole mengatakan bahwa itu dapat digunakan untuk menjaga sekelompok IP ... Tapi saya harus mengatakan bahwa Wackamole tidak memberikan stabilitas seperti yang diinginkan, jadi saya tidak menyarankan itu. Tentang HAProxy, Anda akan menempatkan 2 di antaranya pada 2 mesin khusus untuk redundansi, atau Anda bahkan dapat menempatkan satu di setiap node, seperti yang Anda katakan dalam pertanyaan. Jika sebagian besar pertanyaan Anda membaca, maka saya pikir itu akan berfungsi dengan baik.
Hai Karang. Sedikit terakhir tentang Wackamole - dari pengalaman Anda, itu tidak cukup stabil pada dua mesin?
2 mesin ping satu sama lain ok, tapi salah satu dari mereka memuat 200, semua CPU pada penggunaan 100%, semua ram digunakan. MySQL macet. <- wackamole TIDAK akan bekerja di sana. HAProxy dapat memeriksa apakah APLIKASI jarak jauh naik, Wackamole hanya jika server naik dan application_uptime <server_uptime. Kami memiliki banyak kasus di mana Kami mengandalkan wackamole dan itu mengecewakan kami.
4

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

Vinay Joosery
sumber
Penting bagi Anda untuk mengungkapkan keterkaitan Anda dengan produk yang Anda rekomendasikan dengan sangat jelas. Juga, situs ini bukan untuk promosi diri. Jika Anda memiliki produk yang akan memecahkan masalah yang diposting, hebat! Jika semua jawaban Anda berkisar pada produk Anda, maka Anda mungkin ingin berbicara dengan seseorang tentang mendapatkan ruang iklan alih-alih memposting jawaban. Silakan lihat faq kami .
JNK
3

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 ;-)


sumber
Hai. Terima kasih telah berbagi. Saya berpikir tentang Wackamole, yang sebenarnya bagus untuk HA. Masalah saya dengan itu bahwa semua beban akan berada di salah satu server master, ketika yang kedua akan menganggur, pada dasarnya membuat aktif / pasive, sementara saya sedang mencari aktif / aktif. Mungkin lebih baik untuk menempatkan beberapa solusi LB ringan pada setiap klien, untuk memungkinkannya untuk beralih permintaan antara server? Adakah ide jika alat tersebut ada?
Jika Anda membutuhkan redundansi, maka "satu bekerja, satu menganggur" adalah baik. Katakanlah salah satu dari 2 server mati (saya ingatkan Anda, bahwa Anda membeli yang lain jadi jika yang pertama rusak Anda masih bisa berfungsi). Jika server kedua tidak dapat menangani semua lalu lintas, maka itu untuk skala, bukan untuk HA! Juga: hanya mengandalkan Wackamole adalah solusi yang buruk (ping ok! = Mysqld ok).
3

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
3

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

dvb
sumber
2

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
Masuk akal, tetapi masalahnya adalah satu-satunya titik kegagalan - bahkan dengan 2 LB ... Dalam kasus salah satu klien turun, hanya itu berdampak dan tidak ada orang lain.
Sulit untuk mempertahankan LB pada setiap node. Jika Anda menginstal LB pada 12 server dan kemudian Anda ingin mengubah sesuatu (alamat salah satu DB atau menambahkan DB atau sesuatu) - Anda akan melihat masalah. Aku melakukannya.
1

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
0

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
Ya, secara teori, wackamole dapat mendukung lebih dari 2 server, tetapi apakah Anda pernah mencoba ini pada produksi? Kita telah melakukannya. Kami sekarang menyesal.
Sejauh ini saya tidak punya masalah, selain dari fakta saya tidak bisa mengkompilasinya di bawah centos 5 64 bit
0

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.

Bagian ini menjelaskan replikasi berbasis transaksi menggunakan pengidentifikasi transaksi global (GTID). Saat menggunakan GTID, setiap transaksi dapat diidentifikasi dan dilacak karena dilakukan pada server asal dan diterapkan oleh budak apa pun; ini berarti bahwa tidak perlu ketika menggunakan GTID untuk merujuk file log atau posisi dalam file tersebut ketika memulai budak baru atau gagal ke master baru, yang sangat menyederhanakan tugas-tugas ini. Karena replikasi berbasis GTID sepenuhnya berbasis transaksi, mudah untuk menentukan apakah master dan slave konsisten; selama semua transaksi yang dilakukan pada master juga dilakukan pada budak, konsistensi antara keduanya dijamin. Anda dapat menggunakan replikasi berbasis pernyataan atau berbasis baris dengan GTID (lihat Bagian 16.2.1, “Format Replikasi”); Namun, untuk hasil terbaik,

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.

Jérôme B
sumber