Wow, Anda memiliki beberapa perangkat keras yang sangat gemuk untuk masalah ini. Tidak banyak lagi yang bisa Anda berikan pada perangkat keras, dengan pengecualian meningkatkan ke mungkin Sandy / Ivy Bridge CPUs untuk kinerja 20-50% lebih baik dari pencarian Btree, dll.
Harap dicatat bahwa keahlian saya adalah Innodb, jadi saya akan melakukannya
- Abaikan bahwa Anda adalah myisam dan bertindaklah seolah-olah itu tidak akan membuat perbedaan.
- Asumsikan masalah ini cukup mendorong Anda untuk meningkatkan. Ya, ini merupakan peningkatan.
Innodb dapat membantu memanfaatkan semua memori dengan menyimpan baris yang sering diakses ini di buffer pool. Anda dapat menyetelnya menjadi sebesar yang Anda inginkan (katakanlah 80% dari memori) dan baca / tulis baru tetap dalam memori sampai perlu mendorong mereka ke disk untuk membuat lebih banyak ruang untuk data terbaru yang diakses. Dalam memori adalah urutan besarnya lebih cepat daripada FusionIO Anda.
Ada banyak fitur Innodb lainnya, seperti hash adaptif, mekanisme penguncian otomatis, dll. Yang dapat menjadi keuntungan bagi lingkungan Anda. Namun, Anda tahu data Anda lebih baik daripada saya.
Di dunia innodb, solusi jangka pendek yang bagus adalah dengan mengoptimalkan budak Anda - apakah Anda benar-benar membutuhkan setiap indeks pada budak Anda yang Anda miliki di master Anda? Indeks adalah bola dan rantai pada sisipan / pembaruan / penghapusan, BAHKAN dengan kartu Fusion IO. IOPS bukanlah segalanya di sini. Procs Sandy / Ivy bridge memiliki throughput memori dan kinerja komputasi yang jauh lebih baik - mereka dapat membuat perbedaan besar dari Westmer yang Anda miliki sekarang. (Gambar 20-50% keseluruhan). Hapus semua indeks yang tidak Anda butuhkan pada slave!
Kedua, dan hampir pasti hanya berlaku untuk innodb, adalah bahwa mk-prefetch dapat mengetahui pembaruan mana dan sebelum budak menulisnya. Ini memungkinkan mk-prefetch untuk menjalankan kueri baca terlebih dahulu, sehingga memaksa data berada di memori pada saat repl tunggal menjalankan kueri tulis. Ini berarti data ada di memori dan bukan di fusionIO, urutan cepat dari peningkatan kinerja. Ini membuat perbedaan BESAR , lebih dari yang mungkin diharapkan. Banyak perusahaan menggunakan ini sebagai solusi permanen. Cari tahu lebih lanjut dengan memeriksa Percona Toolkit .
Ketiga, dan yang paling penting, setelah Anda meningkatkan ke Innodb, pasti checkout Tokutek. Orang-orang ini memiliki beberapa hal yang luar biasa jahat yang melebihi kinerja menulis / memperbarui / menghapus Innodb. Mereka memuji kecepatan replikasi yang ditingkatkan sebagai salah satu manfaat utama, dan Anda dapat melihat dari tolok ukur mereka mengapa Fusions crazy IOPS masih tidak akan membantu Anda dalam kasus Btrees . (Catatan: Tidak diverifikasi secara independen oleh saya.) Mereka menggunakan pengganti drop-in dari indeks btree yang, meskipun jauh lebih kompleks, memperbaiki banyak batasan kecepatan algoritmik dari indeks btree.
Saya sedang dalam proses mempertimbangkan adopsi Tokutek. Jika mereka membebaskan begitu banyak kecepatan tulis, itu memungkinkan saya untuk menambahkan lebih banyak indeks. Karena mereka mengompres data dan indeks pada rasio yang sangat bagus (25x mereka kutip), Anda bahkan tidak membayar harga (kinerja, pemeliharaan) untuk peningkatan data. Anda membayar ($) untuk mesin mereka, $ 2500 / tahun per GB pra-kompresi, IIRC. Mereka memiliki diskon jika Anda memiliki data yang direplikasi, tetapi Anda bahkan dapat menginstal Tokutek pada budak Anda dan membiarkan master Anda apa adanya. Lihat detail teknis di kuliah Algoritme Open Courseware MIT . Atau, mereka memiliki banyak hal teknis di blog mereka dan whitepaper reguler untuk mereka yang tidak memiliki 1:20 untuk menonton video. Saya percaya video ini juga memberikan rumus Big-O untuk seberapa cepat membaca. Saya punyauntuk menganggap bahwa membaca lebih lambat (Selalu ada tradeoff!), tetapi rumusnya terlalu rumit bagi saya untuk mengukur berapa banyak. Mereka mengklaim itu kira-kira sama, tetapi saya lebih suka memahami matematika (tidak mungkin!). Anda mungkin berada dalam situasi yang lebih baik untuk menemukan ini daripada saya.
PS Saya tidak berafiliasi dengan Tokutek, saya tidak pernah menjalankan produk mereka dan mereka bahkan tidak tahu saya sedang melihat mereka.
Perbarui :
Saya melihat Anda memiliki beberapa pertanyaan lain di halaman ini dan berpikir saya akan memasukkan:
Pertama, pra-pengambilan budak hampir pasti tidak akan bekerja untuk myisam kecuali Anda memiliki lingkungan yang luar biasa. Ini sebagian besar karena prefetching akan mengunci tabel yang ingin Anda tulis, atau slave thread mengunci tabel yang diperlukan oleh daemon pre-fetch. Jika tabel Anda sangat seimbang untuk replikasi dan tabel yang berbeda sedang ditulis dengan cara round-robin, ini mungkin berhasil - tetapi perlu diingat ini sangat teoretis. Buku "Mysql Kinerja Tinggi" memiliki informasi lebih lanjut di bagian "Masalah Replikasi".
Kedua, mungkin budak Anda menahan beban 1,0-1,5, mungkin lebih tinggi jika Anda memiliki procs atau kueri lain yang berjalan tetapi garis dasar 1,0. Ini berarti Anda kemungkinan terikat dengan CPU, yang kemungkinan besar terjadi pada FusionIO Anda. Seperti yang saya sebutkan sebelumnya, Sandy / Ivy Bridge akan memberi sedikit lebih banyak semangat, tetapi mungkin tidak cukup untuk membuat Anda melewati masa-masa sulit dengan jeda yang minimal. Jika beban pada slave ini sebagian besar hanya menulis (yaitu tidak banyak membaca), CPU Anda hampir pasti menghabiskan waktunya menghitung posisi untuk memasukkan / menghapus btree. Ini harus memperkuat poin saya di atas tentang menghapus indeks tidak kritis - Anda selalu dapat menambahkannya kembali nanti. Menonaktifkan hyperthreading tidak akan berfungsi, lebih banyak CPU bukan musuh Anda. Setelah Anda mendapatkan ram di atas 32GB, katakanlah 64GB, Anda perlu khawatir tentang distribusi ram, tetapi meskipun begitu gejalanya berbeda.
Akhirnya, dan yang paling penting (jangan lewatkan bagian ini;)), saya berasumsi Anda sekarang menjalankan RBR (replikasi berbasis baris) karena Anda menyebutkan peningkatan kinerja non-sepele ketika beralih juga. Namun - mungkin ada cara untuk mendapatkan lebih banyak kinerja di sini. Mysql bug 53375 dapat bermanifestasi jika Anda memiliki tabel yang direplikasi tanpa kunci primer. Budak pada dasarnya tidak cukup pintar untuk menggunakan apa pun kecuali kunci utama, sehingga tidak adanya satu kekuatan thread ulangan untuk melakukan pemindaian tabel penuh untuk setiap pembaruan. Perbaikan hanyalah menambahkan kunci primer jinak, pengganti otomatis. Saya hanya akan melakukan ini jika meja besar (katakanlah 10s dari ribuan baris atau lebih besar). Ini, tentu saja, datang pada biaya memiliki indeks lain di atas meja, yang memunculkan harga yang Anda bayar dalam CPU. Perhatikan ada sangat sedikit argumen teoretis yang menentang hal ini, karena InnoDB menambahkan satu di belakang layar jika tidak. Namun, hantu itu bukan pertahanan yang berguna melawan 53375. Tungsten juga dapat mengatasi masalah ini, tetapi Anda harus yakin saat menggunakan Tungsten bahwa Anda memiliki penyandian yang lurus. Terakhir kali saya bermain dengannya, itu akan mati mengerikan ketika string non-UTF8 perlu direplikasi. Itu tentang waktu saya menyerah.