Mengapa RDBM tidak bisa mengelompokkan seperti yang dilakukan NoSQL?


88

Salah satu plusses besar untuk nosql DBMS adalah mereka dapat lebih mudah dikelompokkan. Seharusnya dengan NoSQL Anda dapat membuat ratusan mesin murah yang menyimpan berbagai data dan meminta semuanya sekaligus.

Pertanyaan saya adalah ini, mengapa DBMS relasional tidak dapat melakukan ini seperti server mysql atau sql? Apakah itu karena vendor belum menemukan cara teknis untuk melakukan ini dengan produk mereka yang sudah ada, atau ada beberapa masalah dengan model relasional yang mencegah ini menjadi layak? Apa yang hebat tentang cara NoSQL untuk menyimpan dan mengakses data (kunci / nilai, dokumen, dll) yang membuat pengelompokan menjadi lebih mudah, jika ini benar?


8
Menyimpan bit data yang berbeda melalui mesin yang berbeda (sharding) secara teknis sangat mudah, dibandingkan dengan sesuatu seperti Oracle RAC yang dapat berjalan hingga 63 node, masing-masing menghadirkan database yang sama, semuanya sesuai ACID dll. "Clustering" di NoSQL mudah karena tidak ada ACID, mereka menggunakan API milik mereka sendiri dan mereka relatif sederhana.
Philᵀᴹ

6
+ RAC masih merupakan arsitektur disk bersama. Itu masih membutuhkan switch SAN pusat sehingga setiap node DBMS dapat melihat penyimpanan apa pun. Anda dapat memiliki beberapa pengontrol SAN menjadikannya arsitektur M: M. Teradata adalah arsitektur shared-nothing tetapi dioptimalkan untuk aplikasi data warehouse dan Anda masih dapat mereplikasi bagian dari database (misalnya tabel dimensi) di semua node. Netezza bahkan lebih tidak membantu. Anda harus memuat segmen individu dari tabel dipartisi secara terpisah.
ConcernedOfTunbridgeWells

1
Jadi saya telah membaca dan mengerti (sebagian besar) jawaban terkait di bawah ini. Masalahnya tampaknya lebih banyak berkaitan dengan ACID daripada hubungannya dengan model relasional. Apakah ada solusi yang menggunakan model relasional, bahkan jika mereka tidak sepenuhnya sesuai dengan asam, dengan cara yang sama dengan NoSQL? Sepertinya NoSQL harus benar-benar dinamai NoACID karena tidak ada hubungannya dengan sql atau model relasional, dan semuanya berkaitan dengan konsistensi, atomicity, akses data dan lokasi penyimpanan, dll.
fregas

6
@regregas - NoSQL tidak memiliki definisi formal. Itu hanya kata kunci yang diterapkan ke berbagai sistem manajemen basis data. Replikasi kuorum (AKA akhirnya konsistensi) digunakan oleh banyak sistem seperti itu (meskipun tidak berarti semua) sebagai optimasi kinerja. Saya tidak mengetahui adanya produk RDBMS yang menggunakan replikasi kuorum - tentu saja tidak ada yang mainstream. Tidak ada alasan teoritis mengapa itu tidak bisa dilakukan, tetapi itu akan menjadi agak kompleks dan bernilai dipertanyakan mengingat tingkat skalabilitas yang dapat dicapai oleh sistem disk bersama.
ConcernedOfTunbridgeWells

@ConcernedOfTunbridgeWells Quorum Replikasi tidak konsisten dengan ACID, oleh karena itu tidak akan dilakukan.
Chris Travers

Jawaban:


141

Sistem Basis Data Terdistribusi 101

Atau, Basis Data Terdistribusi - apa arti sebenarnya ' skala web ' dari FK ?

Sistem basis data terdistribusi adalah makhluk yang kompleks dan memiliki berbagai rasa. Jika saya menggali lebih dalam dari studi samar-samar saya ingat tentang ini di universitas saya akan mencoba menjelaskan beberapa masalah teknik kunci untuk membangun sistem database terdistribusi.

Pertama, beberapa terminologi

Properti ACID (Atomicity, Consistency, Isolasi dan Durability): Ini adalah invarian kunci yang harus diberlakukan untuk transaksi yang dapat diimplementasikan dengan andal tanpa menyebabkan efek samping yang tidak diinginkan.

Atomicity mensyaratkan bahwa transaksi lengkap atau kembalikan sepenuhnya. Transaksi yang diselesaikan sebagian tidak boleh terlihat, dan sistem harus dibangun dengan cara yang mencegah hal ini terjadi.

Konsistensi mensyaratkan bahwa transaksi tidak boleh melanggar invarian (seperti integritas referensial deklaratif) yang dijamin oleh skema database. Misalnya, jika kunci asing ada, seharusnya tidak mungkin untuk memasukkan catatan anak dengan penghormatan kepada orangtua yang tidak ada.

Isolasi mensyaratkan bahwa transaksi tidak boleh saling mengganggu. Sistem harus menjamin hasil yang sama jika transaksi dieksekusi secara paralel atau berurutan. Dalam praktiknya sebagian besar produk RDBMS memungkinkan mode yang menukar isolasi dengan kinerja.

Daya tahan mensyaratkan bahwa sekali dilakukan, transaksi tetap dalam penyimpanan persisten dengan cara yang kuat untuk kegagalan perangkat keras atau perangkat lunak.

Saya akan menjelaskan beberapa kendala teknis yang dipersyaratkan oleh sistem ini di bawah ini.

Shared Disk Architecture: Arsitektur di mana semua node pemrosesan dalam sebuah cluster memiliki akses ke semua penyimpanan. Ini dapat menghadirkan hambatan utama untuk akses data. Contoh dari sistem disk bersama adalah Oracle RAC atau Exadata .

Shared Nothing Architecture: Arsitektur di mana pemrosesan node dalam sebuah cluster memiliki penyimpanan lokal yang tidak terlihat oleh node cluster lainnya. Contoh sistem shared-nothing adalah Teradata dan Netezza .

Shared Memory Architecture: Arsitektur di mana banyak CPU (atau node) dapat mengakses kumpulan memori bersama. Sebagian besar server modern adalah tipe memori bersama. Memori bersama memfasilitasi operasi tertentu seperti cache atau primitif sinkronisasi atom yang jauh lebih sulit dilakukan pada sistem terdistribusi.

Sinkronisasi: Istilah umum yang menjelaskan berbagai metode untuk memastikan akses yang konsisten ke sumber daya bersama dengan beberapa proses atau utas. Ini jauh lebih sulit dilakukan pada sistem terdistribusi daripada pada sistem memori bersama, meskipun beberapa arsitektur jaringan (misalnya BYNET dari Teradata) memiliki primitif sinkronisasi dalam protokol jaringan. Sinkronisasi juga dapat datang dengan sejumlah besar overhead.

Semi-Join: Suatu primitif yang digunakan dalam menggabungkan data yang disimpan dalam dua node berbeda dari sistem terdistribusi. Pada dasarnya itu terdiri dari informasi yang cukup tentang baris untuk bergabung dibundel dan dilewatkan oleh satu node ke yang lain untuk menyelesaikan bergabung. Pada kueri besar ini dapat melibatkan lalu lintas jaringan yang signifikan.

Konsistensi Akhirnya: Suatu istilah yang digunakan untuk menggambarkan semantik transaksi yang menukar pembaruan segera (konsistensi saat dibaca) pada semua node sistem terdistribusi untuk kinerja (dan karenanya throughput transaksi yang lebih tinggi) pada penulisan. Konsistensi akhirnya adalah efek samping dari menggunakan Quorum Replication sebagai optimasi kinerja untuk mempercepat transaksi yang dilakukan dalam database terdistribusi di mana banyak salinan data disimpan pada node yang terpisah.

Algoritma Lamport: Algoritma untuk menerapkan saling pengecualian (sinkronisasi) lintas sistem tanpa memori bersama. Biasanya saling mengecualikan dalam suatu sistem membutuhkan atom baca-bandingkan-tulis atau instruksi serupa dari jenis yang biasanya hanya praktis pada sistem memori bersama. Algoritma sinkronisasi terdistribusi lain ada, tetapi Lamport adalah salah satu yang pertama dan paling terkenal. Seperti kebanyakan mekanisme sinkronisasi terdistribusi, algoritma Lamport sangat bergantung pada waktu dan sinkronisasi jam yang akurat antara node cluster.

Two Phase Commit (2PC): Rangkaian protokol yang memastikan bahwa pembaruan basis data yang melibatkan banyak sistem fisik melakukan atau memutar kembali secara konsisten. Apakah 2PC digunakan dalam suatu sistem atau lintas beberapa sistem melalui manajer transaksi, itu membawa overhead yang signifikan.

Dalam protokol komit dua fase, manajer transaksi meminta node yang berpartisipasi untuk bertahan dalam transaksi sedemikian rupa sehingga mereka dapat menjamin bahwa itu akan melakukan, kemudian memberi sinyal status ini. Ketika semua node telah mengembalikan status 'bahagia', maka sinyal node untuk melakukan. Transaksi masih dianggap terbuka sampai semua node mengirim balasan yang menunjukkan komit selesai. Jika sebuah node turun sebelum pensinyalan komit selesai, manajer transaksi akan menanyakan kembali node tersebut ketika kembali ke atas hingga mendapat balasan positif yang mengindikasikan transaksi telah dilakukan.

Multi-Version Concurrency Control (MVCC): Mengelola pertikaian dengan menulis versi baru data ke lokasi yang berbeda dan memungkinkan transaksi lain untuk melihat versi data yang lama hingga versi baru dilakukan. Ini mengurangi pertentangan basis data dengan mengorbankan beberapa lalu lintas tulis tambahan untuk menulis versi baru dan kemudian menandai versi lama sebagai usang.

Algoritma Pemilihan: Sistem terdistribusi yang melibatkan banyak node secara inheren kurang dapat diandalkan daripada sistem tunggal karena ada lebih banyak mode kegagalan. Dalam banyak kasus beberapa mekanisme diperlukan untuk sistem cluster untuk menangani kegagalan sebuah node. Algoritma pemilihan adalah kelas algoritme yang digunakan untuk memilih pemimpin untuk mengoordinasikan perhitungan terdistribusi dalam situasi di mana simpul 'pemimpin' tidak 100% ditentukan atau dapat diandalkan.

Partisi Horisontal: Sebuah tabel dapat dipecah menjadi beberapa node atau volume penyimpanan berdasarkan kuncinya. Ini memungkinkan volume data besar untuk dipecah menjadi potongan yang lebih kecil dan didistribusikan di seluruh node penyimpanan.

Sharding: Kumpulan data dapat dipartisi secara horizontal melintasi beberapa node fisik dalam arsitektur shared-nothing. Di mana partisi ini tidak transparan (yaitu klien harus menyadari skema partisi dan mencari tahu node mana yang akan ditanyakan secara eksplisit) ini dikenal sebagai sharding. Beberapa sistem (misalnya Teradata) melakukan pemisahan data antar node tetapi lokasi transparan untuk klien; istilah ini biasanya tidak digunakan bersama dengan jenis sistem ini.

Konsisten Hashing: Algoritma yang digunakan untuk mengalokasikan data ke partisi berdasarkan kunci. Hal ini ditandai dengan distribusi kunci hash yang merata dan kemampuan untuk memperluas atau mengurangi jumlah bucket secara efisien. Atribut-atribut ini membuatnya berguna untuk mempartisi data atau memuat melintasi sekelompok node di mana ukurannya dapat berubah secara dinamis dengan node yang ditambahkan atau diturunkan dari cluster (mungkin karena kegagalan).

Multi-Master Replication: Suatu teknik yang memungkinkan penulisan di beberapa node dalam sebuah cluster untuk direplikasi ke node lain. Teknik ini memfasilitasi penskalaan dengan memungkinkan beberapa tabel untuk dipartisi atau dibelokkan di server dan yang lainnya disinkronkan di seluruh cluster. Menulis harus direplikasi ke semua node yang bertentangan dengan kuorum, sehingga komit transaksi lebih mahal pada arsitektur multi-master direplikasi daripada pada sistem replikasi kuorum.

Non-Blocking Switch: Sebuah switch jaringan yang menggunakan paralelisme perangkat keras internal untuk mencapai throughput yang sebanding dengan jumlah port tanpa hambatan internal. Implementasi naif dapat menggunakan mekanisme palang, tetapi ini memiliki kompleksitas O (N ^ 2) untuk port N, membatasi ke switch yang lebih kecil. Sakelar yang lebih besar dapat menggunakan lebih banyak topologi internal yang kompleks yang disebut sakelar spanning minimal non-blocking untuk mencapai penskalaan throughput linier tanpa memerlukan perangkat keras O (N ^ 2).

Membuat DBMS yang terdistribusi - seberapa sulitkah itu?

Beberapa tantangan teknis membuat ini cukup sulit dilakukan dalam praktek. Selain menambah kompleksitas membangun sistem terdistribusi, arsitek DBMS terdistribusi harus mengatasi beberapa masalah teknik yang rumit.

Atomicity pada sistem terdistribusi: Jika data diperbarui oleh transaksi tersebar di beberapa node, komit / kembalikan dari node harus dikoordinasikan. Ini menambahkan overhead yang signifikan pada sistem shared-nothing. Pada sistem shared-disk, ini bukan masalah karena semua penyimpanan dapat dilihat oleh semua node sehingga satu node dapat mengoordinasikan komit.

Konsistensi pada sistem terdistribusi: Untuk mengambil contoh kunci asing yang dikutip di atas, sistem harus dapat mengevaluasi keadaan yang konsisten. Misalnya, jika orang tua dan anak dari hubungan kunci asing dapat berada pada node yang berbeda diperlukan beberapa jenis mekanisme penguncian terdistribusi untuk memastikan bahwa informasi yang sudah usang tidak digunakan untuk memvalidasi transaksi. Jika ini tidak diberlakukan, Anda dapat memiliki (misalnya) kondisi ras tempat orang tua dihapus setelah keberadaannya diverifikasi sebelum mengizinkan penyisipan anak.

Penegakan kendala yang tertunda (yaitu menunggu hingga berkomitmen untuk memvalidasi DRI) membutuhkan kunci yang akan ditahan selama durasi transaksi. Jenis penguncian terdistribusi ini dilengkapi dengan overhead yang signifikan.

Jika banyak salinan data disimpan (ini mungkin diperlukan pada sistem shared-nothing untuk menghindari lalu lintas jaringan yang tidak perlu dari setengah bergabung) maka semua salinan data harus diperbarui.

Isolasi pada sistem terdistribusi: Jika data yang terpengaruh pada transaksi berada pada beberapa node sistem, kunci dan versi (jika MVCC sedang digunakan) harus disinkronkan di seluruh node. Menjamin serialisasi operasi, khususnya pada arsitektur tanpa-berbagi di mana salinan data yang berlebihan dapat disimpan memerlukan mekanisme sinkronisasi terdistribusi seperti Algoritma Lamport, yang juga dilengkapi dengan overhead signifikan dalam lalu lintas jaringan.

Daya tahan pada sistem terdistribusi: Pada sistem disk bersama, masalah daya tahan pada dasarnya sama dengan sistem memori bersama, dengan pengecualian bahwa protokol sinkronisasi terdistribusi masih diperlukan di seluruh node. DBMS harus menulis jurnal pada log dan menulis data secara konsisten. Pada sistem shared-nothing mungkin ada beberapa salinan data atau bagian dari data yang disimpan pada node yang berbeda. Protokol komit dua fase diperlukan untuk memastikan bahwa komit terjadi dengan benar di seluruh node. Ini juga menimbulkan overhead yang signifikan.

Pada sistem shared-nothing, hilangnya sebuah node dapat berarti data tidak tersedia untuk sistem. Untuk mengurangi data ini dapat direplikasi di lebih dari satu node. Konsistensi dalam situasi ini berarti bahwa data harus direplikasi ke semua node di mana ia biasanya berada. Ini dapat menimbulkan biaya besar pada menulis.

Salah satu optimasi umum yang dibuat dalam sistem NoSQL adalah penggunaan replikasi kuorum dan konsistensi akhirnya untuk memungkinkan data untuk direplikasi dengan malas sambil menjamin tingkat ketahanan data tertentu dengan menulis ke kuorum sebelum melaporkan transaksi yang dilakukan. Data kemudian direplikasi dengan malas ke node lain di mana salinan data berada.

Perhatikan bahwa 'akhirnya konsistensi' adalah trade-off utama pada konsistensi yang mungkin tidak dapat diterima jika data harus dilihat secara konsisten segera setelah transaksi dilakukan. Misalnya, pada aplikasi keuangan, saldo yang diperbarui harus segera tersedia.

Sistem Shared-Disk

Sistem disk bersama adalah sistem di mana semua node memiliki akses ke semua penyimpanan. Dengan demikian, perhitungan tidak tergantung pada lokasi. Banyak platform DBMS juga dapat berfungsi dalam mode ini - Oracle RAC adalah contoh arsitektur seperti itu.

Sistem disk bersama dapat skala secara substansial karena mereka dapat mendukung hubungan M: M antara node penyimpanan dan node pemrosesan. SAN dapat memiliki beberapa pengontrol dan beberapa server dapat menjalankan database. Arsitektur ini memiliki sakelar sebagai hambatan utama tetapi sakelar palang memungkinkan sakelar ini memiliki banyak bandwidth. Beberapa pemrosesan dapat diturunkan ke node penyimpanan (seperti dalam kasus Oracle's Exadata) yang dapat mengurangi lalu lintas pada bandwidth penyimpanan.

Meskipun secara teoritis beralih merupakan hambatan, bandwidth yang tersedia berarti bahwa arsitektur disk bersama akan cukup efektif untuk volume transaksi yang besar. Sebagian besar arsitektur DBMS arus utama mengambil pendekatan ini karena memberikan skalabilitas 'cukup baik' dan keandalan tinggi. Dengan arsitektur penyimpanan yang berlebihan seperti saluran serat, tidak ada titik kegagalan tunggal karena setidaknya ada dua jalur antara setiap node pemrosesan dan semua node penyimpanan.

Sistem Shared-Nothing

Sistem Shared-nothing adalah sistem di mana setidaknya sebagian data disimpan secara lokal ke suatu simpul dan tidak secara langsung terlihat oleh simpul lain. Ini menghilangkan hambatan dari saklar sentral, yang memungkinkan basis data untuk skala (setidaknya secara teori) dengan jumlah node. Partisi horizontal memungkinkan data untuk dipisah antar node; ini mungkin transparan untuk klien atau tidak (lihat Pecah di atas).

Karena data didistribusikan secara inheren, kueri mungkin memerlukan data dari lebih dari satu node. Jika gabungan membutuhkan data dari node yang berbeda, operasi semi-gabungan digunakan untuk mentransfer data yang cukup untuk mendukung gabungan dari satu node ke node lainnya. Ini dapat menghasilkan sejumlah besar lalu lintas jaringan, sehingga mengoptimalkan distribusi data dapat membuat perbedaan besar untuk kinerja permintaan.

Seringkali, data direplikasi melintasi node dari sistem shared-nothing untuk mengurangi keperluan semi-joins. Ini bekerja cukup baik pada peralatan gudang data karena dimensi biasanya banyak pesanan besarnya lebih kecil dari tabel fakta dan dapat dengan mudah direplikasi di seluruh node. Mereka juga biasanya dimuat dalam batch sehingga overhead replikasi kurang dari masalah daripada pada aplikasi transaksional.

Paralelisme yang melekat dari arsitektur shared-nothing membuat mereka cocok untuk jenis pemindaian tabel / agregat karakteristik dari data warehouse. Operasi semacam ini dapat skala hampir linier dengan jumlah node pemrosesan. Gabungan besar di seluruh node cenderung menimbulkan lebih banyak overhead karena operasi semi-gabungan dapat menghasilkan banyak lalu lintas jaringan.

Memindahkan volume data yang besar kurang berguna untuk aplikasi pemrosesan transaksi, di mana overhead dari beberapa pembaruan membuat jenis arsitektur ini kurang menarik daripada disk bersama. Dengan demikian, jenis arsitektur ini cenderung tidak digunakan secara luas dari aplikasi data warehouse.

Sharding, Replikasi Kuorum, dan Konsistensi Akhirnya

Replikasi Kuorum adalah fasilitas di mana DBMS mereplikasi data untuk ketersediaan tinggi. Ini berguna untuk sistem yang dimaksudkan untuk bekerja pada perangkat keras komoditas yang lebih murah yang tidak memiliki fitur ketersediaan tinggi bawaan seperti SAN. Dalam jenis sistem data direplikasi di beberapa node penyimpanan untuk kinerja membaca dan penyimpanan berlebihan untuk membuat sistem tangguh terhadap kegagalan perangkat keras dari sebuah node.

Namun, replikasi dari penulisan ke semua simpul adalah O (M x N) untuk simpul M dan N menulis. Ini membuat penulisan menjadi mahal jika penulisan harus direplikasi ke semua node sebelum transaksi diizinkan untuk melakukan. Replikasi kuorum adalah kompromi yang memungkinkan menulis untuk direplikasi ke subset dari node segera dan kemudian malas menulis ke node lain dengan tugas latar belakang. Menulis dapat dilakukan lebih cepat, sambil memberikan tingkat redundansi dengan memastikan bahwa mereka direplikasi ke subset minimal (kuorum) node sebelum transaksi dilaporkan sebagai komitmen kepada klien.

Ini berarti bahwa pembacaan node di luar kuorum dapat melihat versi data yang usang sampai proses latar belakang selesai menulis data ke seluruh node. Semantik dikenal sebagai 'Konsistensi Akhirnya' dan mungkin atau mungkin tidak dapat diterima tergantung pada persyaratan aplikasi Anda tetapi berarti bahwa komit transaksi lebih dekat dengan O (1) daripada O (n) dalam penggunaan sumber daya.

Sharding mengharuskan klien untuk mengetahui pembagian data di dalam basis data, seringkali menggunakan jenis algoritma yang dikenal sebagai 'hashing konsisten'. Dalam database yang di-shard, klien hash kunci untuk menentukan server mana di cluster untuk mengeluarkan permintaan. Karena permintaan didistribusikan di seluruh node di cluster, tidak ada hambatan dengan simpul koordinator permintaan tunggal.

Teknik-teknik ini memungkinkan basis data untuk skala pada tingkat dekat-linear dengan menambahkan node ke cluster. Secara teoritis, replikasi kuorum hanya diperlukan jika media penyimpanan yang mendasarinya dianggap tidak dapat diandalkan. Ini berguna jika server komoditas akan digunakan tetapi bernilai kurang jika mekanisme penyimpanan yang mendasarinya memiliki skema ketersediaan tinggi sendiri (misalnya SAN dengan pengendali cermin dan konektivitas multi-jalur ke host).

Sebagai contoh, BigTable Google tidak mengimplementasikan Quorum Replication dengan sendirinya, meskipun ia berada di GFS, sistem file berkerumun yang tidak menggunakan replikasi kuorum. BigTable (atau sistem apa pun yang tidak dibagi apa pun) dapat menggunakan sistem penyimpanan yang andal dengan banyak pengontrol dan mempartisi data di antara pengontrol. Akses paralel kemudian akan dicapai melalui partisi data.

Kembali ke platform RDBMS

Tidak ada alasan yang melekat bahwa teknik ini tidak dapat digunakan dengan RDBMS. Namun kunci dan manajemen versi akan sangat kompleks pada sistem seperti itu dan pasar apa pun untuk sistem seperti itu kemungkinan besar akan sangat khusus. Tak satu pun dari platform RDBMS mainstream menggunakan replikasi kuorum dan saya tidak secara khusus mengetahui produk RDBMS (setidaknya tidak satu dengan serapan signifikan) yang melakukannya.

Shared-disk dan shared-nothing sistem dapat meningkatkan beban kerja yang sangat besar. Sebagai contoh, Oracle RAC dapat mendukung 63 node pemrosesan (yang bisa berupa mesin SMP besar dengan hak mereka sendiri) dan sejumlah pengontrol penyimpanan sewenang-wenang di SAN. IBM Sysplex (sekelompok mainframe zSeries) dapat mendukung banyak mainframe (masing-masing dengan kekuatan pemrosesan substansial dan bandwidth I / O sendiri) dan beberapa pengontrol SAN. Arsitektur ini dapat mendukung volume transaksi yang sangat besar dengan semantik ACID, meskipun mereka menganggap penyimpanan yang dapat diandalkan. Teradata, Netezza, dan vendor lainnya membuat platform analitik berkinerja tinggi berdasarkan desain berbagi apa pun yang berskala ke volume data yang sangat besar.

Sejauh ini, pasar untuk platform RDBMS ACID yang sepenuhnya murah tapi sangat volume didominasi oleh MySQL, yang mendukung replikasi sharding dan multi-master. MySQL tidak menggunakan replikasi kuorum untuk mengoptimalkan throughput tulis, jadi komit transaksi lebih mahal daripada pada sistem NoSQL. Sharding memungkinkan throughput baca yang sangat tinggi (misalnya Facebook menggunakan MySQL secara luas), sehingga jenis arsitektur ini berskala baik pada beban kerja baca-berat.

Debat yang menarik

BigTable adalah arsitektur shared-nothing (dasarnya pasangan kunci-nilai yang didistribusikan) seperti yang ditunjukkan oleh Michael Hausenblas di bawah ini . Evaluasi awal saya tentang itu termasuk mesin MapReduce, yang bukan merupakan bagian dari BigTable tetapi biasanya akan digunakan bersama dengan itu dalam implementasi yang paling umum (misalnya Hadoop / HBase dan kerangka kerja Google MapReduce).

Membandingkan arsitektur ini dengan Teradata, yang memiliki afinitas fisik antara penyimpanan dan pemrosesan (yaitu, node memiliki penyimpanan lokal daripada SAN yang dibagikan) Anda dapat berargumen bahwa BigTable / MapReduce adalah arsitektur disk bersama melalui sistem penyimpanan paralel yang terlihat secara global.

Throughput pemrosesan sistem gaya MapReduce seperti Hadoop dibatasi oleh bandwidth dari switch jaringan non-blocking. 1 Non-blocking switch, bagaimanapun, dapat menangani agregat bandwidth besar karena paralelisme yang melekat dalam desain, sehingga mereka jarang menjadi kendala praktis yang signifikan pada kinerja. Ini berarti bahwa arsitektur disk bersama (mungkin lebih baik disebut sebagai sistem penyimpanan bersama) dapat skala ke beban kerja yang besar meskipun switch jaringan secara teoritis merupakan hambatan utama.

Poin asli adalah untuk mencatat bahwa meskipun hambatan utama ini ada dalam sistem disk bersama, subsistem penyimpanan dipartisi dengan beberapa node penyimpanan (misalnya server tablet BigTable atau pengontrol SAN) masih dapat meningkatkan beban kerja yang besar. Arsitektur switch non-blocking dapat (secara teori) menangani koneksi saat ini sebanyak yang dimiliki port.

1 Tentu saja pemrosesan dan throughput I / O yang tersedia juga merupakan batasan pada kinerja tetapi saklar jaringan adalah titik sentral di mana semua lalu lintas berlalu.


10
Epik. Kerja bagus, bocah tua.
Mark Storey-Smith

8
Jawaban yang luar biasa!
Philᵀᴹ

1
Wow, saya pikir Anda cukup banyak membahasnya di sana!
Mr.Brownstone

2
@Michael Hausenblas Pikiran kedua, jika Anda mengambil BigTable DB secara terpisah aku akan pergi dengan klaim shared-nothing. Saya telah menggabungkannya dengan seluruh tumpukan MapReduce / Hadoop (di mana tidak ada afinitas khusus antara pemrosesan dan penyimpanan) dalam artikel ini. Anda bisa berargumen dengan wajar ketidaksesuaian dari perselisihan itu.
ConcernedOfTunbridgeWells

3
Beberapa pemikiran teknis. Sebenarnya replikasi kuorum adalah apa yang dilakukan pada replikasi streaming PostgreSQL untuk pengaturan master / slave. Data harus komit ke master hanya secara default tetapi Anda juga dapat mengharuskan itu juga ditulis ke n budak sebelum komit dikembalikan.
Chris Travers

21

Database relasional dapat berkelompok seperti solusi NoSQL. Mempertahankan properti ACID dapat membuat ini lebih kompleks dan orang harus menyadari pertukaran yang dilakukan untuk mempertahankan properti ini. Sayangnya, apa sebenarnya trade-off tergantung pada beban kerja dan tentu saja keputusan yang diambil saat merancang perangkat lunak database.

Misalnya, beban kerja OLTP utama mungkin memiliki latensi kueri tunggal tambahan bahkan saat throughput gugus berjalan dengan baik. Latensi ekstra itu bisa tidak diketahui atau menjadi pemecah masalah nyata, semua tergantung pada aplikasi. Secara umum, pengelompokan akan meningkatkan throughput dan menyakiti latensi, tetapi bahkan 'aturan' itu dicurigai jika permintaan suatu aplikasi secara khusus dapat diterima untuk pemrosesan paralel.

Apa yang ditawarkan oleh perusahaan tempat saya bekerja, Clustrix , adalah serangkaian node penghitungan dan penyimpanan yang homogen yang dihubungkan oleh jaringan berkecepatan relatif tinggi. Data relasional adalah hash yang didistribusikan di seluruh node pada basis per-indeks dalam potongan yang kita sebut 'irisan'. Setiap slice akan memiliki dua atau lebih replika yang tersebar di seluruh cluster untuk ketahanan jika terjadi kegagalan node atau disk. Klien dapat terhubung ke sembarang simpul dalam gugus untuk mengeluarkan kueri menggunakan protokol kawat MySQL.

Agak tidak wajar untuk memikirkan komponen-komponen basis data ACID secara independen karena begitu banyak yang menyatu, tetapi begini:

Atomicity - Clustrix menggunakan komitmen dua fase untuk memastikan atomicity. Operasi UPDATE dan DELETE juga akan mengunci baris melalui manajer kunci terdistribusi kami karena kami secara internal mengubah operasi menjadi SELECT diikuti oleh operasi UPDATE / DELETE yang tepat.

Atomicity jelas meningkatkan jumlah pengiriman pesan antara node yang berpartisipasi dalam transaksi dan meningkatkan beban pada node tersebut untuk memproses protokol komit. Ini adalah bagian dari overhead untuk memiliki sistem terdistribusi dan akan membatasi skalabilitas jika setiap node berpartisipasi dalam setiap transaksi, tetapi node hanya berpartisipasi dalam transaksi jika mereka memiliki salah satu replika yang ditulis.

Konsistensi - Kunci asing diimplementasikan sebagai pemicu, yang dievaluasi pada waktu komit. Operasi UPDATE dan DELETE rentang besar dapat merusak kinerja kita karena penguncian, tetapi untungnya kita tidak sering melihatnya. Jauh lebih umum untuk melihat pembaruan transaksi / menghapus beberapa baris dan kemudian melakukan.

Bagian lain dari konsistensi adalah mempertahankan kuorum melalui protokol konsensus PAXOS yang memastikan bahwa hanya cluster dengan mayoritas node yang diketahui yang dapat menerima penulisan. Tentu saja mungkin bagi sebuah cluster untuk memiliki kuorum tetapi masih memiliki data yang hilang (semua replika slice offline), yang akan menyebabkan transaksi yang gagal mengakses salah satu irisan tersebut.

Isolasi - Clustrix menyediakan isolasi MVCC di tingkat wadah. Atomicity kami menjamin bahwa semua replika yang berlaku menerima tulisan tertentu sebelum kami melaporkan transaksi yang dilakukan sebagian besar mengurangi masalah isolasi dengan apa yang Anda miliki dalam kasus non-cluster.

Daya tahan - Setiap irisan data relasional disimpan ke dua atau lebih node untuk memberikan ketahanan jika terjadi kegagalan node atau disk. Mungkin juga perlu dicatat di sini bahwa versi alat dari produk kami memiliki kartu NVRAM di mana WAL disimpan untuk alasan kinerja. Banyak database contoh tunggal akan meningkatkan kinerja WAL mereka dengan memeriksa titik pada interval bukannya pada setiap komit. Pendekatan itu bermasalah dalam sistem terdistribusi karena membuat 'memutar ulang ke mana?' pertanyaan yang rumit. Kami menghindari ini dalam alat dengan memberikan jaminan daya tahan yang keras.


2
Terima kasih @Matt - ini hanya jawaban yang kami cari. Sebagai tambahan, saya setuju bahwa memisahkan komponen-komponen ACID tidak terlalu alami karena saya menemukan sesuatu yang serupa ketika saya sedang menulis artikel saya. Sekali lagi, terima kasih atas waktu Anda dan kami akan senang melihat kontribusi lebih lanjut dari Anda dan tim Anda.
ConcernedOfTunbridgeWells

14

Jawaban mendasarnya adalah bahwa model konsistensi berbeda. Saya menulis ini untuk memperluas jawaban ConcernedOfTunbridge yang benar-benar harus menjadi titik referensi untuk ini.

Titik dasar dari model konsistensi ACID adalah bahwa ia membuat banyak jaminan mendasar mengenai keadaan data secara global dalam sistem. Jaminan ini tunduk pada batasan teorema CAP yang berarti, pada dasarnya, bahwa untuk membuatnya berfungsi, Anda harus memiliki semua sumber otoritatif pada halaman yang sama sebelum Anda memberi tahu aplikasi bahwa Anda telah melakukan transaksi. Replikasi multi-master dengan demikian sangat sulit dilakukan tanpa mengalami kendala-kendala ini. Tentu saja setelah Anda mulai melakukan replikasi asinkron dalam lingkungan multi-master, jaminan ini keluar jendela. Model konsistensi ACID adalah model konsistensi kuat yang ditujukan untuk informasi penting atau kritis.

Model konsistensi BASE adalah model konsistensi yang lemah yang ditujukan untuk informasi yang tidak penting. Karena jaminan secara signifikan lebih lemah, kemampuan untuk menawarkan jaminan yang lemah seperti itu dalam sistem multi-master lebih mudah dicapai karena jaminan, yah, lemah.

RDBMS dapat dan lakukan skala serta solusi NoSQL!

Namun ada beberapa kasus di mana RDBMS dapat dan melakukan peningkatan hingga NoSQL bahkan mungkin tidak dapat menyamai. Itu hanya melakukannya secara berbeda. Saya akan melihat Postgres-XC sebagai contoh bagaimana meningkatkan kemungkinan tanpa mengorbankan jaminan konsistensi yang kuat.

Cara yang dilakukan RDBMS khusus ini adalah mengimplementasikan sesuatu seperti solusi sharding dengan proxy dan jenis seperti arsitektur disk bersama tetapi secara signifikan lebih kompleks daripada keduanya. Ini tidak skala dengan cara yang sama seperti solusi NoSQL dan karenanya pengorbanan berbeda.

Model Postgres-XC, saya mengerti, terinspirasi oleh Teradata. Terdiri dari node dalam dua peran yang berbeda, sebagai node penyimpanan atau koordinator. Koordinator adalah multi-master (tidak ada replikasi nyata yang terlibat) dan mereka terhubung ke node penyimpanan untuk menangani pemrosesan data aktual. Node penyimpanan mereplikasi dalam pengaturan master-slave. Setiap node penyimpanan berisi apa yang pada dasarnya adalah pecahan dari database, tetapi koordinator mempertahankan gambaran data yang konsisten.

Pemisahan tanggung jawab yang signifikan dilibatkan di sini. Node penyimpanan mengelola data, memeriksa kendala, batasan kunci asing yang dapat diterapkan secara lokal, dan menangani setidaknya beberapa agregasi data. Koordinator menangani kunci-kunci asing yang tidak dapat ditegakkan secara lokal, serta windowing dan pertimbangan data lainnya yang mungkin menarik dari beberapa node data. Intinya koordinator memungkinkan ACID dalam transaksi terdistribusi dalam pengaturan multi-master di mana pengguna bahkan tidak tahu transaksi didistribusikan.

Dalam hal ini, Postgres-XC menawarkan sesuatu yang mirip dengan opsi penskalaan NoSQL tetapi ada beberapa kerumitan tambahan karena jaminan konsistensi tambahan. Saya mengerti bahwa ada RDBMS komersial yang menawarkan skalabilitas semacam ini di luar sana. Teradata melakukan ini. Selain itu, sistem disk bersama dapat meningkatkan skala dengan cara yang serupa dan DB2 dan Oracle menawarkan solusi tersebut. Jadi sama sekali tidak adil untuk mengatakan bahwa RDBMS tidak dapat melakukan ini. Mereka bisa. Namun kebutuhannya sangat kecil di masa lalu sehingga skala ekonomi tidak cukup untuk membuat solusi berpemilik sangat terjangkau bagi sebagian besar pemain.

Akhirnya sebuah catatan tentang VoltDB. Seperti solusi NoSQL, saya melihat VoltDB sebagai alat yang sangat khusus. Ini sangat cepat tetapi dengan mengorbankan transaksi multi-round-trip dan daya tahan pada disk. Ini berarti Anda memiliki serangkaian kekhawatiran yang sangat berbeda. VoltDB adalah apa yang Anda dapatkan ketika perintis RDBMS membangun solusi NoSQL ;-). VoltDB sebagian cepat karena mendefinisikan konkurensi dan daya tahan dari persamaan. Daya tahan menjadi properti jaringan, bukan properti intra-host dan konkurensi dikelola dengan menjalankan kueri satu per satu, paralel secara internal, dalam urutan berurutan. Ini bukan RDBMS tradisional (dan itu adalah hal yang baik karena ia bisa pergi ke tempat-tempat RDBMS tradisional tidak bisa, tetapi sebaliknya juga sangat benar).

Sunting: Penting juga untuk mempertimbangkan implikasi bergabung. Dalam sistem berkerumun, bergabung menjadi masalah kinerja yang sangat berbeda. Jika semuanya berada pada node yang sama, mereka dapat meningkatkan kinerja tetapi jika Anda harus melakukan perjalanan pulang-pergi ke node yang berbeda ini akan menimbulkan biaya yang sangat tinggi. Jadi model data memang membuat perbedaan dan pendekatan pengelompokan memiliki dampak kinerja. Pendekatan seperti Postgres-XC dan Postgres-XL berasumsi bahwa Anda dapat menghabiskan sedikit waktu untuk memikirkan berbagai hal sehingga Anda dapat dengan tepat membagi data Anda dan tetap menggabungkan data. Tapi itu memaksakan overhead desain. Di sisi lain, skala ini jauh lebih baik daripada banyak solusi NoSQL dan dapat disetel dengan tepat. Sebagai contoh, kami (di Adjust) menggunakan strategi pengelompokan seperti-NoSQL untuk data 3,5PB kami di PostgreSQL yang pada dasarnya adalah analisis log. Dan banyak dari desain kami sangat terinspirasi oleh strategi pengelompokan NoSQL. Jadi kadang-kadang model data tidak membatasi model pengelompokan juga.


6

Jawaban saya tidak akan ditulis dengan baik seperti yang sebelumnya, tapi begini saja.

Michael Stonebraker dari Ingres fame telah menciptakan MPP shared-nothing kolom-store (Vertica) dan MPP shared-nothing New SQL database (VoltDB) yang mendistribusikan data antara berbagai node dalam sebuah cluster dan memelihara ACID. Sejak itu Vertica telah dibeli oleh HP.

Saya percaya database SQL baru lainnya memelihara ACID juga, meskipun saya tidak yakin berapa banyak dari mereka mendistribusikan baris mereka di atas sebuah cluster, dll.

Berikut ini ceramah yang diberikan Stonebraker tentang SQL Baru relatif ke NoSQL dan "SQL Lama". http://www.youtube.com/watch?v=uhDM4fcI2aI


2
Apa ini "SQL Baru" dan "SQL Lama"? Maukah Anda mengklarifikasi?
ypercubeᵀᴹ

1
"Old SQL" akan menjadi SQL Server, Oracle, MySQL, PostgreSQL, dll. Berikut ini definisi dari Wikipedia untuk NewSQL yang cukup bagus: "NewSQL adalah kelas sistem manajemen basis data relasional modern yang berupaya memberikan kinerja NoSQL scalable yang sama. sistem untuk beban kerja OLTP sambil tetap mempertahankan jaminan ACID dari sistem basis data simpul tunggal tradisional. " Saya sangat merekomendasikan video yang saya posting jika tertarik untuk mempelajari lebih lanjut.
geoffrobinson

Sebagai catatan di sini, dan seperti yang saya jelaskan dalam jawaban saya, VoltDB menangani skalabilitas dengan mendefinisikan daya tahan dan konkurensi dari persamaan. Intinya dengan VoltDB, Anda tidak mendapatkan ketahanan sistem intrasistem, dan tidak ada akses data bersamaan. SQL baru seperti mobil balap Indie 500, tetapi SQL lama masih merupakan truk semi atau mungkin mesin kereta barang.
Chris Travers

1

MySQL clustering dapat digunakan menggunakan replikasi multi mastering dan hashing shard di seluruh cluster.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.