Server MySQL mana yang memberikan kinerja yang lebih baik untuk Magento

30

Apa yang Anda gunakan sebagai Server MySQL untuk Magento?

  • MySQL (Oracle)
  • Percona
  • lainnya (MariaDB)

Percona menyediakan serangkaian perbaikan untuk penyimpanan InnoDB yang digunakan oleh Magento secara intensif, tetapi peningkatan ini membuat perbedaan ketika menjalankan toko Magento.

Bagaimana Anda meningkatkan kinerja (pendekatan umum tentang arsitektur, bukan info spesifik tentang pengaturan variabel spesifik suka innodb_flush_log_at_trx_commit=2dan sebagainya). Saya tahu NBS mencoba-coba replikasi master-master tetapi itu tidak stabil.

Saya memang menghadapi beberapa masalah dengan replikasi master-slave dengan membaca diarahkan ke budak, karena ada beberapa keterlambatan dalam mereplikasi data.

Pindah sebanyak mungkin dari MySQL? (cari solr dan sebagainya).

FlorinelChis
sumber
1
FlorinelChis, Terima kasih atas pertanyaannya, tetapi ini adalah topik yang sangat luas (peningkatan kinerja), dan pemilihan mesin basis data adalah bidang tersendiri. Kecuali ada komponen kuat dari pertanyaan ini yang terkait secara khusus dengan Magento, ini mungkin lebih baik ditanyakan dalam Tanya Jawab DBA kami . Tetapi di mana pun Anda mengajukan pertanyaan, Anda harus memberikan lebih banyak informasi tentang masalah spesifik yang Anda temui. Maaf tentang kebingungan, dan semoga berhasil!
Robert Cartaino
Saya mengerti bahwa pertanyaannya ambigu dan sepertinya topik yang sangat luas. Mengenai Magento tidak seluas itu, itu terkait dengan detail yang sangat spesifik. MySQL adalah hambatan ketika Anda perlu skala Magento dan dari pengalaman saya hanya mengubah ke percona dalam beberapa pengaturan meningkatkan kinerja. Saya ingin tahu bagaimana sysadmin Magento lainnya. Saya tidak mencari informasi yang sangat spesifik seperti Anda perlu mengatur innodb-flush-log-at-trx-commit = 2, tetapi lebih ke arah pendekatan tentang menggunakan Mysql, percona atau lainnya (MariaDB) untuk mencapai kinerja yang lebih baik.
FlorinelC
FlorinelChris, saya bukan pakar domain, tetapi berdasarkan pemungutan suara dan bendera, saya menduga pertanyaan ini membutuhkan / memerlukan informasi lebih lanjut untuk mendapatkan respons yang bermanfaat. Tetapi saya senang untuk membukanya kembali agar masyarakat menanganinya dengan tepat. Anda mungkin ingin melihat informasi apa yang dapat Anda tambahkan sehingga orang tidak perlu menebak bagaimana cara terbaik untuk membantu Anda.
Robert Cartaino

Jawaban:

73

Anda memasuki dunia optimasi yang luas dan luas di sana-sini tentu saja tidak ada satu pendekatan yang cocok untuk semua.

Tentukan kinerja

Apakah maksud Anda waktu pemuatan halaman untuk satu pengguna, atau kapasitas total / total konkurensi? Keduanya sangat berbeda - dan tidak terkait erat. Sangat mungkin untuk memiliki toko cepat dengan kapasitas terbatas; atau toko yang lambat dengan banyak kapasitas.

Jadi saat menyikapi salah satu jenis kinerja:

  1. Waktu buka halaman yang dirasakan pengguna tunggal
  2. Total kapasitas / konkurensi

Anda harus mengatasi masing-masing secara independen dengan solusi mereka sendiri - terutama karena masing-masing memiliki hambatan sendiri.

Mari kita membuat asumsi Anda dengan host yang kompeten yang telah mengkonfigurasi aspek-aspek lain dari server Anda secara optimal untuk toko Anda.

Waktu buka halaman yang dirasakan pengguna tunggal

Apakah MySQL yang menjadi hambatan
. Tidak secara langsung. Ini semua tentang latensi, dalam sebagian besar kasus ketika menguji waktu buka halaman - hanya cache yang akan dipukul. Jadi kuncinya di sini adalah untuk meminimalkan latensi.

  • Tune ukuran cache MySQL dengan tepat (tidak ada jawaban yang tepat, kami menyetel pengaturan yang sama sekali berbeda, bulanan, per toko)
  • Kurangi latensi jaringan. Untuk frame 64 byte; 51.2μs untuk 10Mbps, 5.12μs untuk 100Mbps dan 4.096μs untuk 1Gbps. Ini memberikan peningkatan 20% hanya dengan transisi dari 100Mbps ke 1Gbps. s1
  • Meningkatkan kapasitas jaringan. Anda akan terkejut dengan banyaknya megabita per detik yang dipertukarkan antara Web dan server DB, biasanya lebih dari 10MB / s - sehingga minimum 100Mb / s diperlukan s1 . Atau, cukup pindahkan server DB secara lokal.
  • Menggunakan SOLR. Mesin eksternal kadang-kadang lebih cocok, SOLR tentu lebih cepat untuk katalog BESAR (dan saya akan menekankan, katalog lebih besar ). Bahkan SOLR yang tidak disetel akan menghasilkan navigasi berlapis dan hasil pencarian lebih cepat daripada yang bisa dilakukan MySQL.

Tetapi perubahan ini akan memiliki dampak fraksional pada waktu buka halaman - di mana hambatannya benar-benar di tempat lain.

  • Tune aplikasi. Magento memiliki beberapa bug yang cukup besar dengan cara membangun koleksi dan menyimpannya; kami telah menemukan sejumlah masalah kode inti besar yang dapat melumpuhkan kinerja. Dalam beberapa kasus, cukup lepaskan tampilan jumlah produk pada hasil navigasi berlapis yang dicukur 2 detik dari pemuatan koleksi besar.
  • Tinjau log lambat MySQL. Periksa kueri lambat dan tambahkan indeks seperlunya. Perbedaan antara menjalankan kueri yang kompleks dengan beberapa gabungan dengan dan tanpa indeks yang sesuai dapat menjadi puluhan detik .

Aplikasi adalah hambatannya. Bukan perangkat lunak. Jadi hanya meningkatkan core-code atau membuat template Anda lebih ringan akan memiliki efek yang jauh lebih dramatis pada kinerja daripada perubahan konfigurasi MySQL APA PUN .

Apa yang tidak akan kita pedulikan

  • Mengubah mesin penyimpanan. MariaDB dan Percona berbagi mesin InnoDB yang sama - Percona XtraDB. Mereka dapat diperlakukan sebagai satu dan sama. Dalam hal waktu eksekusi permintaan tunggal - kinerja akan persis mencerminkan pembuatan MySQL vanilla. Ini ikut bermain di bawah beban / konkurensi.
  • Menjalankan budak MySQL. Ini tidak akan meningkatkan kinerja kecuali jika budak secara fisik lebih dekat (dari perspektif jaringan), atau bahwa budak memiliki perangkat keras yang lebih baik daripada master. Ini ikut bermain di bawah beban / konkurensi.
  • Menjalankan server DB eksternal. Sejauh ini, ini adalah saran terburuk yang kami lihat berulang kali diberikan oleh banyak tuan rumah / agensi. Sampai Anda mencapai puncak pada perangkat keras / sumber daya atau Anda memiliki beberapa server web (baca: ketersediaan tinggi), MySQL di mesin lokal untuk toko Magento adalah A Good Idea. Ini memotong semua overhead jaringan dan latensi. Bahkan jaringan 100 Gb / s (ya, seratus gigabit per detik) tidak akan dibandingkan dengan soket unix lokal untuk volume, throughput, dan latensi mentah.

s1 Untuk server database terpisah saja. Tidak berlaku untuk server DB lokal.

Total kapasitas / konkurensi

Apakah MySQL yang menjadi hambatan
Mungkin. Tetapi hanya sekali Anda telah memakukan kinerja dan kapasitas PHP Anda ke titik di mana MySQL memperlambat segalanya. Jika Varnish dan FPC Anda telah terkonfigurasi dengan benar (jangan mulaii kami tentang berapa banyak upaya gagal yang telah kita lihat) - maka MySQL menjadi hambatan.

Jadi selain modifikasi di atas.

  • Ubah mesin MySQL. XtraDB dapat unggul di bawah beban dan memang menunjukkan manfaat asli dibandingkan distribusi MySQL stok.
  • Tetap terbarui dengan MySQL. 5.5 berkinerja lebih baik dari 5.0 di bawah beban.
  • Ubah driver PHP PHP. PHP 5.3 dan yang lebih baru memiliki driver MySQL asli, tetapi dalam beberapa keadaan, kami telah menemukan PHP 5.2 dengan driver terpisah untuk mengungguli MySQLND untuk Magento. Uji sendiri
  • Ubah mesin pencari. Memindahkan pencarian ke SOLR / Sphinx (atau bahkan beberapa layanan eksternal pihak ketiga) dapat benar-benar mengurangi beban beban non-transaksional (mis. Orang tidak melakukan pemesanan)
  • Ubah mesin navigasi berlapis. Sekali lagi, SOLR adalah mesin yang brilian untuk navigasi berlapis dan karena sifatnya yang tidak terkunci jauh lebih cepat daripada MySQL.
  • Tambahkan budak MySQL. Ini tidak membantu penjelajahan (non-transaksional) beban, tetapi tidak akan membantu Anda memproses lebih banyak pesanan per jam - karena bergantung pada Guru untuk proses dan mereplikasi data ini

Apa yang tidak akan kita pedulikan

  • Master / Master. Karena titik jenuh yang cukup tinggi dari kejenuhan perangkat keras dari pengaturan Master / Slave (lebih dari 1000 pesanan per jam) - kami tidak pernah menemukan persyaratan untuk menggunakan Master / Master dalam produksi. Kami telah melakukan pengujian ekstensif, tetapi tidak pernah menemukan itu menguntungkan dari perspektif kinerja dan dengan risiko yang melekat dan masalah Master / Master, itu tidak layak.

Baca vs Skalabilitas Tulis

Paragraf terakhir benar-benar mengarah pada bidang utama skalabilitas baca dan tulis. Pembacaan skala dapat dilakukan tanpa batas tanpa terlalu banyak komplikasi dengan penambahan lebih banyak budak.

Mengingat rasio Magento tentang Baca untuk Menulis adalah sekitar 0,1% - mengingat menulis seharusnya tidak terlalu menjadi perhatian. Itu sebabnya saya tidak repot menyebutkan MySQL Cluster dan fitur-fiturnya pintar seperti auto-sharding (memisahkan tabel ke mesin yang terpisah).

Perangkat keras, perangkat keras, perangkat keras

Perangkat keras adalah jawaban tercepat untuk perbaikan, jadi saya sengaja tidak menyebutkannya di atas dalam kedua skenario.

Tetapi semua perubahan perangkat lunak di dunia tidak akan membuat perbedaan jika perangkat keras Anda tidak memadai. Itu bisa berarti ...

  • Switch berkualitas rendah dengan buffer terbatas
  • Tautan jaringan yang terlalu jenuh
  • Server yang jauh secara geografis
  • QoS / CoS jaringan buruk
  • Jumlah total RAM yang terbatas
  • RAM bandwidth memori rendah
  • Subsistem IOP HDD rendah
  • Pengontrol RAID perangkat lunak
  • CPU kecepatan clock rendah
  • Chipset bandwidth rendah
  • Virtualisasi perangkat keras (hampir semua jenis selain Virtualisasi Tingkat Kernel)

Saat ini, ada langit-langit sangat tinggi pada seberapa tinggi Anda dapat benar-benar skala pada perangkat keras. Mari kita mengabaikan mitos penskalaan tak terbatas "di awan" karena perangkat keras cloud cenderung cukup biasa-biasa saja. Contohnya model andalan Amazon hanya 12 Cores @ 3.3GHz. Tetapi di luar ini, ada beberapa server yang sangat kuat yang tersedia - server teratas kami memiliki 160 core dan 2TB (ya, Terabytes) RAM. Kami belum melihat ada yang melampaui kemampuan itu.

Jadi Anda memiliki ruang lingkup besar untuk penskalaan vertikal, bahkan sebelum Anda perlu mempertimbangkan penskalaan horizontal.

Target yang selalu bergerak

Layak disebutkan bahwa dalam mengejar kinerja, bottleneck akan selalu bergerak.

Untuk toko Magento stok.

Nyalakan cache. PHP adalah penghambatnya.
Tambahkan cache backend. PHP adalah hambatannya.
Tambahkan cache halaman penuh level aplikasi. PHP adalah penghambatnya.
Tambahkan cache front-end tingkat server (mis. Varnish). MySQL adalah penghambatnya.
Tambahkan mesin pencari alternatif / navigasi berlapis (mis. SOLR / Sphinx). PHP adalah hambatan
Tambah server aplikasi lebih banyak. MySQL adalah hambatannya
Tambah budak MySQL. Cache front-end adalah hambatan
Tambah lebih banyak server cache front-end. PHP adalah hambatan
Tambah server aplikasi lebih banyak. SOLR / Sphinx adalah hambatannya

Dan sebagainya.

Ini cukup banyak menjadi kasus pengulangan bilas. Tetapi yang jelas untuk dipahami adalah bahwa MySQL tentu saja bukan pelabuhan panggilan pertama untuk optimasi - dan benar-benar hanya berperan ketika MySQL mengkonsumsi lebih banyak CPU secara proporsional ke PHP - dan ini HANYA terjadi ketika FPC dan Varnish digunakan dan server hanya memproses pesanan dan tidak banyak yang lain (karena semuanya ada dalam cache).

Jangan membuat perubahan secara membabi buta

Cukup menambahkan budak MySQL karena Anda membaca kami katakan di atas bahwa itu akan membantu, dapat biaya kinerja dan keandalan Anda pada tingkat yang sangat besar. Jaringan yang macet, server slave dengan spesifikasi rendah atau bahkan pengaturan yang tidak tepat dapat menyebabkan masalah replikasi yang dapat membuat toko Anda lebih lambat dari awalnya - atau menyebabkan masalah sinkronisasi antara Master dan Slave.

Untuk meletakkan segala sesuatu dalam perspektif - beberapa contoh dunia nyata.

Contoh 1 - 300 pesanan per jam

Kami telah menggunakan perangkat keras berikut untuk melayani 300 pesanan per jam ; dan hanya pada titik kritis - kami kemudian merasa perlu menambahkan server MySQL khusus dan budak MySQL lokal.

1 Server
CPU: 2x Intel E5-4620
RAM: 64GB HDD: 4x 80k IOP / s SSD
RAID: Perangkat Keras RAID 10
Versi Magento: Magento EE
OS: MageStack

Selama seluruh waktu, rata-rata beban tetap di bawah 3,00.

Contoh 2 - 180 pesanan per jam

Hanya dua hari yang lalu, klien baru kami dengan mudah menyerap lonjakan lalu lintas yang besar. Memproses 180 pesanan per jam dengan server tunggal dan Edisi Komunitas Magento .

1 Server
CPU: 2x Intel E5-4620
RAM: 64GB HDD: 4x 80k IOP / s SSD
RAID: Perangkat Keras RAID 10
Versi Magento: Magento CE
OS: MageStack
Situs web: Wellgosh.com

Selama keseluruhan, rata-rata memuat tetap di bawah 6,00. Beban lebih tinggi dalam skenario ini dan itu turun ke beberapa faktor.

  1. Tidak ada penyetelan sisi-toko yang dilakukan seperti pada Contoh 1
  2. Kurangnya FPC tingkat aplikasi

Dan mengingat hal ini, kami masih punya statistik terperinci untuk memberikan umpan balik melalui grafik. Ini menceritakan kisah luar biasa tentang bagaimana beban didistribusikan di antara komponen-komponen utama dari arsitektur Magento yang terpisah (penyeimbang beban, server web, server db dll. - menggunakan MageStack ).

Jadi dari depan ke belakang ... tanggal yang ingin Anda lihat adalah pukul 12:00 pagi pada 22 Februari.

Paket Firewall
Paket Firewall

Pernis Lalu Lintas
Pernis Lalu Lintas

Lalu Lintas Nginx
Lalu Lintas Nginx

Beban MySQL
Thread MySQL MySQL Bytes Pertanyaan MySQL

Beban CPU
Beban CPU

Dan yang terpenting, distribusi beban

Gambar ini benar-benar menceritakan semuanya. Dan itu adalah MySQL tentu bukan beban - setidaknya belum. Jadi saran kami, fokuskan kekhawatiran kinerja Anda di tempat lain, kecuali jika Anda memproses lebih dari beberapa ribu pesanan per jam.

Distribusi Beban

Dan dalam ringkasan

Membuat perubahan kinerja bukan "satu ukuran cocok untuk semua". Ini adalah kasus menganalisis kemacetan Anda saat ini dan membuat perubahan / penyesuaian halus agar sesuai dengan toko dan infrastruktur Anda.

Namun selain kinerja, ada manfaat lain menggunakan Percona

Kami menggunakan Percona XtraDB, hampir secara eksklusif. Kami menjalankan build yang dikompilasi khusus dari MySQL yang kami kembangkan secara khusus untuk Magento dan telah berkonsultasi dengan Percona selama proses tersebut. Tapi bukan hanya kinerja yang memengaruhi pilihan ini.

  • The Percona Toolkit
    • pt-query-digest
    • xtrabackup
    • dll.
  • Frekuensi rilis percona
  • Dukungan konsultasi percona
  • Cache hangat dimulai kembali dengan pelestarian pool InnoDB

Dan banyak lagi. Jadi menggunakannya melalui MySQL memiliki kelebihan lain selain kinerja. Bahkan - MySQL adalah dan selalu menjadi yang paling sedikit dari perhatian kami dalam mengejar kinerja dan stabilitas.

Atribusi: wellgosh.com , sonassi.com , iebmedia.com .

Ben Lessani - Sonassi
sumber
itu jawaban yang panjang :) Sangat dihargai, Terima kasih. Mengenai skala dan beban pada MySQL di sini adalah bagan munin dari MySQL: twitter.com/ze_m0n5t3r/status/232864932482396160 . Mengoptimalkan Magento adalah proses yang konstan (berbagai bug, kode yang tidak dioptimalkan, dll). Mengurangi beban (memindahkan pencarian / nav ke solr, caching yang lebih baik) adalah pendekatan pertama. Tetapi juga, DB harus berperilaku lebih baik dengan cache yang dingin. Dan ketika itu terjadi saya mencari situs web yang lebih lambat yang memiliki kapasitas lebih besar.
FlorinelChis
Sama sama. Tidak ada alasan untuk mengatakan Anda tidak dapat memiliki situs web yang cepat dan kapasitas besar - klien kami memilikinya . Jelas ada sedikit lebih banyak untuk kinerja MySQL daripada yang saya pilih untuk disebutkan di atas. Tapi itu akan sedikit memberikan 'saus rahasia' kita. Saya telah mengarahkan jawaban itu kepada pemilik toko kecil (<25k uniques / hari) sebagai panduan 'pemula' terhadap MySQL.
Ben Lessani - Sonassi
Sama seperti sidenote. Melihat grafik Anda, sisipan Anda memuncak sekitar 10x beban normal Anda, pembaruan tetap rendah dan pilihan menunjukkan beban terbesar. Saya akan mempertaruhkan sisipan adalah log pelanggan, relevansi pencarian / pertanyaan, atau dilarang, sesi. Namun jumlahnya masih cukup kecil untuk tidak menimbulkan masalah atau bahkan menganggap Master / Master. Jadi berdasarkan grafik Anda, penambahan sederhana lebih banyak perangkat keras akan lebih dari cukup; dengan seorang budak mengikuti itu. Dan menjaga cache tetap hangat di antara restart dengan mudah dengan Percona, s.onas.si/5g8s
Ben Lessani - Sonassi
cari dulu, sesi - memcache. Apakah Anda tahu ada yang menjalankan master-master yang sukses? (NBS gagal dalam hal ini, kami juga gagal dengan ini, tidak stabil dengan Magento, bekerja dengan baik pada aplikasi php yang lebih ringan)
FlorinelChis
1
Ini jawaban yang luar biasa. Hanya ingin mengatakan itu.
dustbuster