Batasan skalabilitas PostgreSQL dan MySQL

43

Saya pernah mendengar bahwa kinerja basis data relasional non-sharded seperti MySQL atau PostgreSQL "istirahat" melebihi 10 TB.

Saya menduga bahwa batasan seperti itu ada karena seseorang tidak akan datang dengan Netezza, Greenplum, atau Vertica, dll. Namun, saya ingin bertanya apakah ada orang di sini yang memiliki referensi ke makalah penelitian atau studi kasus formal di mana batasan ini dikuantifikasi.

Edmon
sumber

Jawaban:

52

Tidak ada jawaban sederhana untuk pertanyaan Anda, tetapi di sini ada beberapa hal untuk dipikirkan.

Pertama, skala bukanlah satu-satunya hal yang perlu dikhawatirkan. Apa yang Anda lakukan dengan data Anda. Jika Anda memiliki 500 tabel 30 TB data, dan Anda melakukan OLTP sederhana dengan pelaporan yang sangat sedikit, saya tidak berpikir Anda akan memiliki terlalu banyak masalah. Ada database 32TB di PostgreSQL di luar sana. Namun, pada saat yang sama kinerja akan agak menurun karena harus menabrak disk pada segalanya. Demikian pula jika Anda memiliki 50TB jika data tetapi memiliki set yang biasanya mencapai sekitar 100GB, maka Anda dapat membangun server dengan RAM yang cukup untuk menjaga bagian db dalam memori dan Anda berwarna emas.

Di sisi lain jika Anda mencoba untuk mengambil mode (nilai paling umum) dari 1TB data, tidak masalah sistem apa yang Anda gunakan, ini akan terasa menyakitkan dengan atau tanpa sharding. (Sunting: Sharding mungkin malah memperburuk masalah ini . )

Masalah utama yang akan Anda hadapi dengan db besar di MySQL dan PostgreSQL melibatkan fakta bahwa tidak ada yang mendukung paralelisme intraquery. Dengan kata lain, kueri dijalankan sebagai satu blok oleh satu utas, dan tidak dapat dipecah menjadi beberapa bagian dan dijalankan secara terpisah. Ini paling sering menjadi masalah ketika menjalankan kueri analitik besar atas sejumlah besar data. Di sinilah Postgres-XC dan Green Plum datang untuk menyelamatkan karena mereka memisahkan penyimpanan dari eksekusi, dan dapat melakukan ini di tingkat koordinator. Perhatikan bahwa Postgres-XC dan Green Plum pada dasarnya menggunakan sharding secara internal tetapi koordinator menegakkan semua konsistensi secara global.

Dengan paralelisme intraquery, Anda dapat memecah kueri, memiliki prosesor yang berbeda / saluran I / O disk menjalankan bagian dari itu, dan melaporkan kembali potongan-potongan hasil yang ditetapkan untuk dirakit dan dikembalikan ke aplikasi. Sekali lagi, ini biasanya paling membantu dalam analitik daripada beban pemrosesan transaksi.

Hal kedua adalah bahwa beberapa sistem, seperti Vertica atau Greenplum, menyimpan kolom informasi bersama. Ini membuat sistem lebih sulit untuk digunakan dari perspektif OLTP dan menurunkan kinerja di sana, tetapi secara drastis meningkatkan kinerja untuk beban kerja analitik yang besar. Jadi ini adalah tradeoff khusus beban kerja.

Jadi jawabannya adalah begitu Anda mendapatkan ukuran di atas 1-2 TB, Anda mungkin menemukan diri Anda dihadapkan dengan sejumlah pertukaran antara sistem dan beban kerja. Sekali lagi ini khusus untuk database, ukuran set kerja, dll. Namun pada titik ini Anda benar-benar harus pergi dengan sistem kepingan salju, yaitu yang unik dan disesuaikan dengan beban kerja Anda.

Ini tentu saja berarti bahwa batas umumnya tidak dapat diukur.

Sunting : Saya sekarang telah bekerja dengan basis data 9TB yang menangani campuran dukungan keputusan dan beban kerja pemrosesan transaksional dalam PostgreSQL. Tantangan tunggal terbesar adalah bahwa jika Anda memiliki pertanyaan yang mengenai sebagian besar kumpulan data, Anda harus menunggu beberapa saat untuk jawabannya.

Namun dengan perhatian yang hati-hati pada fundamental (termasuk indeks, autovacuum, bagaimana ini bekerja pada level rendah, dll) dan sumber daya komputasi yang memadai, ini sepenuhnya dapat dikelola (dan saya perkirakan akan dapat dikelola dengan baik hingga kisaran 30TB dalam Pg).

Sunting2 : Setelah Anda menuju 100TB meskipun apa yang berhasil akan tergantung pada set data Anda. Saya sedang mengerjakan satu sekarang yang tidak akan skala ke kisaran ini karena akan mencapai batas 32TB per tabel di PostgreSQL terlebih dahulu.

Chris Travers
sumber
2
Tampaknya Postgres 9.6 akan mendapatkan beberapa peningkatan paralelisme intra-kueri (paralel seq scan, parallel join).
a_horse_with_no_name
1
Saya pikir akan butuh beberapa rilis lagi untuk mendapatkan ini menjadi sangat berguna.
Chris Travers
@ ChrisTravers Apakah ada basis data lain yang mendukung situasi seperti ini lebih baik? Mungkin belum tentu RDBMS? Terima kasih
konung
1
@konung, aku tidak tahu harus jujur. Saya pikir layak bermain-main dengan mesin MapReduce pada skala tertentu karena ini membantu membentuk cara Anda berpikir tentang data Anda. Pada skala yang sangat besar Anda benar-benar harus tahu apa yang Anda lakukan. Solusi seperti Teradata dan Postgres-XL membantu tetapi mereka adalah solusi yang menuntut pengetahuan yang jelas tentang apa yang Anda lakukan (dan Anda selalu dapat membangun sendiri pada titik yang dibangun pada RDBMS di luar sana).
Chris Travers
1
Juga salah satu alasan saya merekomendasikan bermain dengan Mongo adalah bahwa meskipun (mungkin bahkan karena) tidak skala dengan baik, itu mengajarkan Anda bagaimana berpikir tentang data gabungan dan MapReduce ketika Anda sampai ke titik itu.
Chris Travers