Apa itu sharding dan mengapa itu penting?

196

Saya pikir saya mengerti sharding akan mengembalikan data Anda yang teriris (pecahan) ke dalam agregat yang mudah ditangani yang masuk akal dalam konteksnya. Apakah ini benar?

Pembaruan : Saya kira saya berjuang di sini. Menurut pendapat saya tier aplikasi seharusnya tidak memiliki bisnis yang menentukan di mana data harus disimpan. Paling-paling itu harus semacam shard client. Kedua jawaban menjawab apa tapi bukan mengapa itu penting. Apa implikasi yang dimilikinya di luar dari pencapaian kinerja yang jelas? Apakah keuntungan ini cukup untuk mengimbangi pelanggaran MVC? Apakah sharding sebagian besar penting dalam aplikasi skala yang sangat besar atau apakah itu berlaku untuk aplikasi skala yang lebih kecil?

ojblass
sumber
1
Apakah salah satu webinar ini bermanfaat? vimeo.com/26742356 slideshare.net/rightscale/… vimeo.com/32541189

Jawaban:

193

Sharding hanyalah nama lain untuk "partisi horisontal" dari suatu basis data. Anda mungkin ingin mencari istilah itu untuk membuatnya lebih jelas.

Dari Wikipedia :

Partisi horisontal adalah prinsip desain di mana baris tabel database diadakan secara terpisah, bukan dipecah oleh kolom (seperti untuk normalisasi). Setiap partisi membentuk bagian dari beling, yang pada gilirannya terletak di server database atau lokasi fisik yang terpisah. Keuntungannya adalah jumlah baris di setiap tabel berkurang (ini mengurangi ukuran indeks, sehingga meningkatkan kinerja pencarian). Jika pecahan didasarkan pada beberapa aspek dunia nyata dari data (misalnya pelanggan Eropa vs pelanggan Amerika) maka dimungkinkan untuk menyimpulkan keanggotaan beling yang sesuai dengan mudah dan otomatis, dan hanya meminta beling yang relevan.

Beberapa informasi lebih lanjut tentang sharding:

Pertama, setiap server database identik, memiliki struktur tabel yang sama. Kedua, catatan data secara logis dibagi menjadi database yang terbelenggu. Tidak seperti database yang dipartisi, setiap catatan data lengkap hanya ada dalam satu shard (kecuali ada mirroring untuk cadangan / redundansi) dengan semua operasi CRUD dilakukan hanya dalam database itu. Anda mungkin tidak menyukai terminologi yang digunakan, tetapi ini mewakili cara yang berbeda dalam mengatur basis data logis menjadi bagian-bagian yang lebih kecil.

Pembaruan: Anda tidak akan merusak MVC. Pekerjaan menentukan shard yang benar tempat menyimpan data akan dilakukan secara transparan oleh lapisan akses data Anda. Di sana Anda harus menentukan shard yang benar berdasarkan kriteria yang Anda gunakan untuk shard database Anda. (Karena Anda harus secara manual membuang database ke beberapa pecahan yang berbeda berdasarkan beberapa aspek konkret dari aplikasi Anda.) Kemudian Anda harus berhati-hati ketika memuat dan menyimpan data dari / ke dalam database untuk menggunakan pecahan yang benar.

Mungkin contoh ini dengan kode Java membuatnya lebih jelas (ini tentang proyek Hibernate Shards ), bagaimana ini akan bekerja dalam skenario dunia nyata.

Untuk mengatasi " why sharding": Ini terutama hanya untuk aplikasi skala sangat besar, dengan banyak data. Pertama, ini membantu meminimalkan waktu respons untuk permintaan basis data. Kedua, Anda dapat menggunakan mesin "lower-end" yang lebih murah untuk meng-host data Anda, alih-alih satu server besar, yang mungkin tidak cukup lagi.

MicSim
sumber
1
Maafkan saya, tetapi sebaiknya database tidak menentukan tempat menyimpan data. Apakah ini memengaruhi kode pada tingkat aplikasi?
ojblass
6
Saya sudah lama mencoba memahami perbedaannya dengan partisi horizontal, dan tautan dalam jawaban Anda agak membuktikan tidak ada perbedaan. Seperti yang dikatakan seseorang dalam komentar di posting Theo Schlossnagle, "... Jika Anda berasal dari budaya basis data tradisional, Anda melakukan partisi horizontal, jika Anda berasal dari kultur Web, itu adalah 'Sharding' ..."
andreister
@andreister Dari apa yang saya baca, sharding secara konseptual berbeda karena didefinisikan oleh penskalaan horizontal di beberapa node logis atau fisik (dalam kasus beberapa database mySQL), kemungkinan besar terdapat pada hardware logis yang berbeda). Partisi horisontal adalah istilah yang kurang spesifik, di mana "Sharding" adalah subset. Sekali lagi menggunakan mySQL sebagai contoh, partisi mySQL ditangani oleh instance db tunggal, yang 100% transparan untuk aplikasi. Pendekatan pecahan akan melibatkan proksi atau aplikasi yang secara cerdas memilih contoh mana.
NateDSaint
Menurut wikipedia "Setiap partisi individual disebut sebagai shard atau database shard." Yang sedikit berbeda dari teks dalam jawaban yang mengatakan "Setiap partisi membentuk bagian dari beling".
Kevin Wheeler
Artikel wiki yang Anda referensikan membuat sedikit perbedaan antara kedua istilah itu. Partisi horizontal membagi satu atau lebih tabel per baris, biasanya dalam satu contoh skema dan server database. / *** / Sharding melampaui ini: ia mem-partisi tabel-tabel yang bermasalah dengan cara yang sama, tetapi melakukan hal ini di beberapa contoh skema yang berpotensi. en.wikipedia.org/wiki/…
Peeter Kokk
38

Jika Anda memiliki kueri ke DBMS yang wilayahnya cukup terbatas (katakanlah, pengguna hanya memecat selektif dengan 'di mana nama pengguna = $ my_username'), masuk akal untuk meletakkan semua nama pengguna mulai dengan AM pada satu server dan semua dari NZ di sisi lain Dengan ini Anda mendekati skala linear untuk beberapa permintaan.

Singkat cerita : Sharding pada dasarnya adalah proses mendistribusikan tabel ke server yang berbeda untuk menyeimbangkan beban ke keduanya secara merata.

Tentu saja, ini jauh lebih rumit dalam kenyataan. :)

bayer
sumber
Jadi sharding memengaruhi desain data yang Anda simpan ... maaf jika saya tidak begitu mengerti.
ojblass
Bukankah ini partisi horizontal?
harunurhan
18

Sharding adalah partisi database horizontal ( baris bijaksana ) yang bertentangan dengan partisi vertikal ( kolom bijaksana ) yang Normalisasi . Ini memisahkan database yang sangat besar menjadi bagian yang lebih kecil, lebih cepat dan lebih mudah dikelola yang disebut pecahan data. Ini adalah mekanisme untuk mencapai sistem terdistribusi.

Mengapa kita membutuhkan sistem terdistribusi?

  • Peningkatan ketersediaan.
  • Ekspansi yang lebih mudah.
  • Ekonomi: Biayanya lebih murah untuk membuat jaringan komputer yang lebih kecil dengan kekuatan satu komputer besar.

Anda dapat membaca lebih lanjut di sini: Keuntungan dari database Terdistribusi

Bagaimana sharding membantu mencapai sistem terdistribusi?

Anda dapat mempartisi indeks pencarian menjadi N partisi dan memuat setiap indeks pada server terpisah. Jika Anda query satu server, Anda akan mendapatkan 1 / Nth dari hasilnya. Jadi untuk mendapatkan set hasil yang lengkap, sistem pencarian terdistribusi yang khas menggunakan agregator yang akan mengakumulasi hasil dari setiap server dan menggabungkannya. Agregator juga mendistribusikan kueri ke setiap server. Program agregator ini disebut MapReduce dalam terminologi big data. Dengan kata lain, Sistem Terdistribusi = Sharding + MapReduce (Meskipun ada hal-hal lain juga).

Representasi visual di bawah ini. Sistem Terdistribusi

Himanshu Kansal
sumber
7

Apakah sharding sebagian besar penting dalam aplikasi skala yang sangat besar atau apakah itu berlaku untuk aplikasi skala yang lebih kecil?

Sharding adalah masalah jika dan hanya jika kebutuhan Anda melebihi apa yang dapat dilayani oleh server database tunggal. Ini adalah alat swell jika Anda memiliki data yang dapat diakses dan Anda memiliki skalabilitas yang sangat tinggi dan persyaratan kinerja. Saya akan menebak bahwa selama 12 tahun saya menjadi seorang profesional perangkat lunak, saya telah menghadapi satu situasi yang bisa mendapat manfaat dari sharding. Ini adalah teknik canggih dengan penerapan yang sangat terbatas.

Selain itu, masa depan mungkin akan menjadi sesuatu yang menyenangkan dan mengasyikkan seperti objek besar "cloud" yang menghapus semua keterbatasan kinerja potensial, bukan? :)

earino
sumber
dapatkah Anda berbagi situasi di mana Anda perlu sharding
Gagan Burde
4

Sharding pada awalnya diciptakan oleh para insinyur google dan Anda dapat melihatnya digunakan cukup banyak saat menulis aplikasi di Google App Engine. Karena ada batasan keras pada jumlah sumber daya yang dapat digunakan kueri Anda dan karena kueri itu sendiri memiliki batasan ketat, sharding tidak hanya didorong tetapi hampir dipaksakan oleh arsitektur.

Tempat sharding lain yang dapat digunakan adalah untuk mengurangi pertentangan pada entitas data. Hal ini sangat penting ketika membangun sistem scalable untuk berhati-hati terhadap potongan data yang sering ditulis karena mereka selalu menjadi hambatan. Solusi yang baik adalah dengan mengabaikan entitas tertentu dan menulis ke banyak salinan, kemudian baca totalnya. Contoh dari ini "counter berjerih wrt GAE: http://code.google.com/appengine/articles/sharding_counters.html

kap lampu
sumber
7
<< Sharding awalnya diciptakan oleh insinyur google >> - tidak benar. Google didirikan pada tahun 1998. scholar.google.com menemukan makalah dari tahun 1980-an seperti "Membuang informasi usang dalam sistem basis data yang direplikasi" ... Sistem Data Replikasi yang Sangat Tersedia (SHARD) dikembangkan di CCA ... Saya ingat pernah mendengar orang-orang berbicara tentang pecahan saat itu.
Krazy Glew
3

Sharding tidak lebih dari sekadar partisi horizontal. Menurut artikel wikipedia ,

Partisi horizontal membagi satu atau lebih tabel per baris, biasanya dalam satu contoh skema dan server database. Ini dapat menawarkan keuntungan dengan mengurangi ukuran indeks (dan dengan demikian upaya pencarian) asalkan ada beberapa cara yang jelas, kuat, dan implisit untuk mengidentifikasi di mana partisi baris tertentu akan ditemukan, tanpa terlebih dahulu perlu mencari indeks, misalnya, klasik contoh tabel 'CustomersEast' dan 'CustomersWest', di mana kode pos mereka sudah menunjukkan di mana mereka akan ditemukan.

Sharding melampaui ini: ia mem-partisi tabel-tabel yang bermasalah dengan cara yang sama, tetapi melakukan hal ini di beberapa contoh skema yang berpotensi. Keuntungan yang jelas adalah bahwa beban pencarian untuk tabel dipartisi besar sekarang dapat dibagi di beberapa server (logis atau fisik), bukan hanya beberapa indeks pada server logis yang sama.

Juga,

Membagi pecahan di beberapa instance yang terisolasi membutuhkan lebih dari sekadar partisi horisontal sederhana. Keuntungan yang diharapkan untuk efisiensi akan hilang, jika query database membutuhkan kedua contoh untuk dikueri, hanya untuk mengambil tabel dimensi sederhana. Selain mempartisi, sharding membagi tabel-tabel besar yang dapat dipartisi ke seluruh server, sementara tabel-tabel yang lebih kecil direplikasi sebagai unit yang lengkap

Krishna Rathi
sumber
1

Menurut pendapat saya tier aplikasi seharusnya tidak memiliki bisnis yang menentukan di mana data harus disimpan

Ini adalah aturan yang baik tetapi seperti kebanyakan hal tidak selalu benar.

Ketika Anda melakukan arsitektur, Anda mulai dengan tanggung jawab dan kolaborasi. Setelah Anda menentukan arsitektur fungsional Anda, Anda harus menyeimbangkan kekuatan non-fungsional.

Jika salah satu dari kekuatan non-fungsional ini skalabilitas besar, Anda harus menyesuaikan arsitektur Anda untuk memenuhi kekuatan ini bahkan jika itu berarti bahwa abstraksi penyimpanan data Anda sekarang bocor ke tingkat aplikasi Anda.

Hans Malherbe
sumber
1
Tingkat aplikasi masih dapat membuat pemisahan logika akses data dan aturan bisnis. Ini berarti Anda memiliki lapisan konseptual tambahan di dalam lapisan "lapisan aplikasi".
Eric