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:
- Dapatkah MySQL Sharding menangani koneksi bersamaan?
- 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.
mysql
replication
mongodb
cassandra
Justin
sumber
sumber
Jawaban:
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
Server B, C, D, E
Saya telah menulis posting tentang ini sebelumnya
Untuk menjaga Replikasi MySQL dalam kondisi prima
sumber
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.
sumber
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.
sumber
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
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.
sumber