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.