Infrastruktur untuk DB Penulisan Sangat Konkuren, Tinggi

17

Persyaratan saya adalah:

  • 3000 Koneksi
  • 70-85% Tulis vs Baca

Saat ini, kami memaksimalkan CPU-Tinggi, Mesin Virtual Ekstra Besar pada koneksi 700. Semua 8 core maksimal. Kami pikir ini adalah jumlah koneksi bersamaan karena ingatannya baik-baik saja. Tulisan itu sendiri sangat sederhana (validasi hal-hal lambat). Untuk skala ke 3000, kita perlu pergi ke beberapa server, opsi saat ini:

  • MySQL Sharding
  • Cluster MongoDB
  • Cassandra
  • Hadoop & MySQL (Cache Hadoop, dump tunggal ke MySQL)
  • MongoDB & MySQL (bukan Hadoop, kami menggunakan mongo untuk cache)

Untuk menangani jumlah koneksi ini, sejumlah pertanyaan:

  1. Dapatkah MySQL Sharding menangani koneksi bersamaan?
  2. Bisakah satu master menangani koneksi konkuren ini, atau apakah multi-head seperti Mongo pilihan yang lebih baik?

Saya minta maaf jika saya tidak menggambarkan masalah saya dengan baik. Tolong tanyakan.

Justin
sumber
4
Apa beban kerjanya? Koneksi yang tidak berfungsi menghabiskan memori tetapi tidak ada CPU, aplikasi yang dibatasi pada penulisan juga mengkonsumsi sedikit CPU karena selalu menunggu di I / O. Jika CPU Anda maksimal, itu artinya Anda melakukan semacam perhitungan; di situlah kemacetan Anda, bukan pada jumlah koneksi per se, atau pada aktivitas menulis.
Gayus
Terima kasih balasannya. Tes mysqlslap Sayangnya, saat Anda mendapatkan lebih banyak koneksi, semuanya dikenakan pajak. 1 -> 100 -> 500 -> 1000. Pada 3000 koneksi bersamaan mysqlslap cukup bunuh diri. CPU dan I / O melalui tes sederhana ini mulai terhapus di 700 koneksi. Yang kami lihat adalah lebih buruk karena kami lebih banyak data.
Justin

Jawaban:

5

Jika Anda menggunakan MySQL sebagai basis data utama, Anda mungkin ingin mempertimbangkan untuk menggunakan Topologi Star melalui Replikasi MySQL.

Sekarang, sebelum Anda mengatakan UGHHH, ROFL dan OMG ke MySQL Replication, dengarkan aku.

Topologi bintang memungkinkan Anda menulis ke satu server DB (disebut Distribution Mster [DM]) dan mengirim perintah SQL ke beberapa server DB. Bagaimana Anda mengatur infrastruktur DB seperti itu?

Berikut ini Deskripsi

Anda memiliki 5 server DB (server A, B, C, D, E)

Server A

  • Dalam pengaturan Replikasi MySQL, itu akan menjadi Master
  • Memainkan peran khusus sebagai DM
  • Master server B, C, D, E
  • Semua tabel menggunakan mesin penyimpanan BLACKHOLE (/ dev / null)
  • Hanya menyimpan log biner
  • Mesin Logam Bare
  • Manfaat
    • Sangat cepat menulis karena semua tabel pada DM menggunakan BLACKHOLE
    • Network Latency kurang menjadi masalah karena bacaan adalah 15-30% dari Kegiatan DB
    • Semua budak diperbarui secara ketat dari DM

Server B, C, D, E

  • Budak A
  • Server basis untuk SELECT berat
  • Server Dapat Menjadi Virtual atau Bare Metal
  • Untuk semua server yang tabel penggunanya menggunakan mesin penyimpanan InnoDB
    • Ini bisa server sebagai server DB siaga hangat
    • Pencadangan yang tidak mengganggu dapat dijalankan untuk mencegahnya
  • Untuk semua server yang tabel penggunanya menggunakan mesin penyimpanan MyISAM
    • Atur dengan oprion hanya-baca
    • Tabel dapat meminta format barisnya untuk mempercepat pembacaan

Saya telah menulis posting tentang ini sebelumnya

Untuk menjaga Replikasi MySQL dalam kondisi prima

RolandoMySQLDBA
sumber
2

MySQL Cluster mungkin merupakan pendekatan lain untuk sharding. Periksa pos di sini .

Saya juga penggemar berat Cassandra, tetapi itu sangat tergantung pada model data Anda dan pertanyaan yang ingin Anda lakukan. Cassandra dengan cepat menulis, karena mereka selalu berurutan pada disk.

GSB
sumber
2

Jika Anda akan pergi multi-heading (yang Anda mungkin perlu jika Anda benar-benar membutuhkan koneksi aktif 3K) Saya mungkin akan melihat Riak atau mungkin Cassandra. Itu benar-benar tergantung pada apa aplikasi Anda lakukan untuk seberapa cocok ini, tetapi dari apa yang Anda jelaskan saya pikir itu akan cocok dengan sesuatu seperti Riak.

Yang mengatakan, pendekatan beling tampaknya cukup bisa dilakukan, jika Anda dapat menemukan cara yang baik untuk mengelompokkan data, dan dapat meminimalkan segala kebutuhan untuk hal-hal lintas beling. Saya akan tinggal jauh dari cincin / bintang / hal mmm di mysql, dan hanya berpegang teguh pada sharding. Sebenarnya, jika Anda bersedia menggunakan Postgres, Anda bisa membuat prototipe dengan mudah menggunakan skema pada sesuatu seperti heroku, dan kemudian bercabang dan memisahkan database ketika mereka mulai tumbuh lebih besar dari masing-masing node.

Oh, dan sementara saya pikir Anda bisa mencoba skala sesuatu seperti ini secara vertikal (satu node menangani semua 3K sambs), saya tidak berpikir Anda bisa melakukannya di cloud.

xzilla
sumber
1

Jika itu pilihan untuk aplikasi spesifik Anda, mungkin Anda dapat menggunakan beberapa cara tidak sinkron untuk menulis data ke database Anda (antrian kerja, sisipan batched ...) dan / atau mengalihkan banyak koneksi klien dari database Anda dengan beberapa proxy di depan .

Dengan sharding, Anda biasanya dapat menskala baik-baik saja (2x db-server == 2x koneksi), tetapi sangat tergantung pada sifat dataset Anda dan bagaimana Anda dapat membaginya ke dalam pecahan.


sumber
1

Saya pribadi lebih suka MongoDB karena kemudahan administrasi, skalabilitas, kemudahan penggunaan umum. Juga, kecuali saya benar-benar membutuhkan RDBMS, saya akan menggunakan no-SQL.

Dengan itu, pilih DB yang paling masuk akal untuk aplikasi Anda. Jika Anda memerlukan Transaksi atau tidak dapat mendesain aplikasi Anda tanpa Bergabung (atau itu hanya lebih masuk akal dengan mereka) maka gunakan RDBMS (MySQL, PostGres, dll.)

Sementara saya pribadi lebih suka MongoDB, gagasan bahwa MySQL tidak skala atau tidak dapat menangani tingkat transaksi yang tinggi adalah murni salah. Tim Facebook Engineering (dan tim MySQL di dalamnya) membahasnya dengan sangat rinci. Lihat juga blog tim Etsy Ops; mereka juga mencintai MySQL.

Akhirnya, saya tidak akan menggunakan MongoDB untuk cache MySQL; gunakan Memcached untuk itu.

Redis juga merupakan toko nilai kunci dalam RAM yang baik untuk menangani kasus penggunaan tertentu. Ada beberapa entri blog di blog.agoragames.com yang menjelaskan beberapa kasus penggunaan.

Anda juga harus memeriksa CouchDB jika Anda berpikir No-SQL. Perlu diketahui bahwa ini memerlukan perawatan rutin untuk menjaga penggunaan disk tetap rendah. (Ini memperdagangkan kecepatan dan kenyamanan untuk penggunaan Disk ...)

Akhirnya, perencanaan kapasitas tidak mudah diprediksi. Anda perlu menguji dalam kondisi serealistis mungkin dan bersiap untuk memulihkan berdasarkan apa yang Anda lihat. Sayangnya "Ilmu Komputer" adalah Seni dan Sains.

gWaldo
sumber