Co to jest sharding?
Jeżeli jeszcze nie wiesz, czym jest sharding, ten artykuł jest właśnie dla Ciebie!
Kilka słów tytułem wprowadzenia
Jako, że ten artykuł skupia się na zagadnieniu shardingu, który znajduje zastosowanie w technologii łańcucha bloków, w pierwszej kolejności powinniśmy poświęcić chwilę na podstawowe wyjaśnienie tego, czym jest blockchain. Jeżeli jesteś nowy w tym temacie, warto przypomnieć sobie i usystematyzować kilka kluczowych kwestii, dzięki czemu będziemy mogli płynnie przejść do omówienia shardingu.
Co to jest Blockchain?
Łańcuch bloków (ang. blockchain) to zasadniczo internetowa baza danych rozumiana jako wspólny rejestr danych o transakcjach. To, co sprawia, że ta baza danych jest wyjątkowa, to bloki, hash i kwestia jej rozproszonej natury.
Bloki
Blockchain to rosnąca lista rekordów, zwanych blokami, które są ze sobą powiązane. Każdy blok ma hash, zawiera w sobie również hash poprzedniego bloku. Wszystkie bloki są przechowywane w sposób rozproszony, co bardzo utrudnia zmianę dowolnego bloku danych bez świadomości, że dane się zmieniły, zapobiegając w ten sposób nieautoryzowanym zmianom danych.
Hash
Hash (skrót) to wyliczony klucz, charakterystyczny dla każdego bloku. To jak odcisk palca; żadne dwa bloki nie mają tego samego skrótu. Możesz myśleć o hashu i bloku jako o dwóch częściach całości; manipulowanie czymkolwiek wewnątrz bloku powoduje zmianę skrótu. W konsekwencji, takie „grzebanie” przy bloku prowadzi do tego, że łańcuch będzie nieważny, ponieważ „poprzedni skrót” następnego bloku nie będzie pasował do skrótu aktualnego bloku.
Wizualizuje to poniższy obrazek. Jeśli zmieniono blok 2, skrót bloku 2 nie będzie już wynosił 6BQ1, a „poprzedni skrót” bloku 3 nie będzie już pasował do skrótu bloku 2. Ta niezgodność spowoduje, że cały łańcuch będzie nieważny.
Rozproszona księga (rejestr)
Rozproszona księga to dowolna baza danych, którą można replikować i udostępniać członkom zdecentralizowanej sieci. Jest to wysoce bezpieczna baza danych. Eliminuje ona potrzebę korzystania z usług strony trzeciej (np. banku), który miałby weryfikować autentyczność danych.
***
Aby zapobiegać nieautoryzowanym zmianom, blockchain wykorzystuje mechanizmy konsensusu, głównie proof-of-work (POW) lub proof-of-stake (POS) – opóźnienie w obliczaniu hashu każdego bloku danych, który podlega zmianom – do walidacji transakcji, a także do tworzenia nowych bloków. Opóźnienie to zapobiega fałszywym zmianom danych, ponieważ każdą nieuczciwą zmianę można wykryć i wyeliminować, zanim zostanie ona zreplikowana do wszystkich kopii danych w rozproszonej sieci.
Blockchain to technologia stojąca za kryptowalutami, które są internetowym środkiem wymiany. Mówiąc prościej, są to pieniądze o prawdziwej wartości, którymi można handlować cyfrowo bez angażowania w transakcję strony trzeciej, takiej jak bank.
Traktując blockchain jako bazę danych, o wiele prościej będzie zrozumieć założenia shardingu.
Do rzeczy…
Co to jest sharding?
Teraz, gdy wiemy, czym jest blockchain, przejdźmy do shardingu. Samo słowo „shard” oznacza po angielski odłamek, mały fragment całości. Sharding to zatem nic innego, jak po prostu podział pojedynczej bazy danych oraz oddzielanie i przechowywanie jej w mniejszych bazach danych.
Załóżmy, że musisz znaleźć informacje o kimś, kto przypisany jest do bazy zawierającej w sobie 20 000 rekordów, reprezentowanych w postaci zestawu danych o osobach. Zamiast samodzielnie przeszukiwać 20 000 rekordów, byłoby znacznie szybciej, gdyby 5 osób przeszukało po 4000, prawda?
To samo dotyczy shardingu, w którym każda baza danych ma tylko podzbiór całkowitej liczby rekordów, co ułatwia sortowanie.
Dlaczego jest to korzystne?
- Jeśli zestaw danych jest zbyt duży, aby zmieścić się w jednej bazie, fragmentacja (sharding) może rozwiązać ten problem, dzieląc dane i umieszczając je w innych bazach
- Może zapewnić prawie nieograniczoną pojemność pamięci
- Pozwala na przetworzenie większej liczby transakcji na sekundę (może zwiększyć prędkość działania bazy danych)
Wyzwania i problemy
Chociaż założenia stojące za zastosowaniem shardingu są oczywiście zasadne i potrzebne, sam pomysł wykorzystania tej technologii w ramach blockchain jest stosunkowo nowy. Chociaż sharding może pomóc w zwiększeniu szybkości i zmniejszeniu obciążenia bazy danych, nadal istnieje ryzyko włamania.
Jakkolwiek włamać się do łańcucha bloków jest dosyć trudno, naruszenie bezpieczeństwa shardu nie stanowi już tak wielkiego wyzwania. Haker może potencjalnie wprowadzić do shardu fałszywe dane lub całe transakcje, co może zrujnować autentyczność całego łańcucha bloków.
Łańcuchy bloków wykorzystujące konsensus proof-of-stake mogą potencjalnie rozwiązać ten problem, przypisując losowo węzły (punkt danych w sieci) do każdego shardu, a następnie – po określonym czasie – ponownie je „odpisywać”.
Strategie związane z shardingiem
Z shardingiem wiążą się ściśle określone strategie, w ramach których poszczególne „shardy” znajdują zastosowanie. Oto kilka z nich.
Horizontal Based Sharding, czyli „fragmentacja w poziomie”
Ta strategia jest prawdopodobnie najbardziej powszechna i obejmuje dzielenie tabeli w jednej bazie danych na mniejsze tabele w wielu bazach danych.
Załóżmy, że w jednej tabeli na serwerze bazy danych mamy informacje o 20 000 klientów. Sharding podzieliłby tę jedną tabelę i umieściłby informacje o klientach w różnych bazach danych na różnych serwerach. Jest to również nazywane fragmentowaniem w poziomie lub partycjonowaniem poziomym. Oryginalna tabela na powyższym rysunku o zawiera wszystkie wiersze, podczas gdy w tabelach HS1 i HS2 wiersze zostały podzielone na dwie różne tabele.
Taka strategia może jednak nie działać, jeśli podział danych w poziomie prowadzi do różnej liczby wierszy w różnych bazach danych. Na przykład, jeśli dane klientów zostały podzielone na różne bazy danych na podstawie pierwszej litery ich nazwiska, dane klientów o nazwiskach rozpoczynających się na litery AH przejdą do bazy 1, dane od klientów o nazwiskach na literach I-P powędrują do bazy danych 2, a reszta do bazy 3, w efekcie czego każda baza danych może otrzymać nierówną liczbę wierszy.
Vertical Based Sharding, czyli „fragmentacja w pionie”
Fragmentacja oparta na pionie dzieli dane według kolumn, a nie wierszy. Załóżmy, że ponownie chcesz podzielić dane dla każdego rekordu (członka) w 20-tysięcznej bazie danych. Baza 1 może mieć swój numer identyfikacyjny wraz z informacją, na jakim stanowisku pracuje dana osoba, podczas gdy Baza 2 może mieć swój identyfikator i imię i nazwisko, a Baza 3 może mieć swój identyfikator i numer telefonu. W ten sposób będziesz mógł równo podzielić wszystkie dane i zachować taką samą liczbę kolumn. Na powyższym obrazku oryginalna tabela zawiera wszystkie kolumny, podczas gdy w tabelach VS1 i VS2 kolumny zostały podzielone na dwie różne tabele.
Haczyk polega na tym, że jeśli masz zbyt wiele kolumn w zbyt wielu bazach danych, to w celu znalezienia każdej informacji musisz przejść do każdej bazy z osobna. Powiedzmy, że chciałbyś skontaktować się z osobą, która szefem wszystkich, którzy znajdują się w bazie. W tym celu, w pierwszej kolejności należałoby przejść do bazy danych 1, aby znaleźć jego numer identyfikacyjny. Następnie, trzeba by było przejść do bazy danych 2, aby dopasować identyfikator do nazwy. Na koniec konieczne byłoby przejście do bazy danych 3, aby znaleźć numer telefonu. Cały ten proces byłby bardzo czasochłonny, zwłaszcza jeśli chciałbyś uzyskać informacje na temat więcej niż jednej osoby.
Hash Based Sharding, czyli „fragmentacja na podstawie skrótu”
Inną powszechną strategią jest sharding oparty na hashu. Taka fragmentacja dzieli dane na podstawie obliczonego skrótu. Dane są dzielone równomiernie między wszystkie dostępne bazy danych. Za każdym razem tworzona jest metoda decydowania o serwerze, do którego należy dodać nowe dane.
Na powyższym zdjęciu mamy 4 serwery baz danych. Załóżmy, że każdorazowemu żądaniu dodania nowych danych towarzyszy klucz, który jest zwiększany o 1. Zastosowanie prostej funkcji modulo daje możliwość przyporządkowania bazom konktretnych identyfikatorów. Wyniki można wykorzystać do skierowania nowego żądania do odpowiedniej bazy danych. Baza danych 0 zostanie wybrana do przechowywania danych, którym nadano numer 0 lub 4. Baza danych 1 zostanie wybrana do przechowywania danych o numerach 1 i 5. To samo z pozostałymi dwoma numerami 2 i 6 dla bazy danych 2 i 3 i 7 dla bazy danych 3. W ten sposób nowe dane mogą być nadal równomiernie dystrybuowane do różnych serwerów baz danych.
Wadą tego rozwiązania jest to, że gdybyśmy chcieli dodać kolejną bazę danych (nazwijmy ją serwer 4). musielibyśmy ponownie ponumerować i zreorganizować wszystkie dane. Zmieniłby się także sposób przypisywania nowych danych do serwerów.
Podsumujmy kluczowe kwestie
- Blockchain to technologia stojąca za kryptowalutami. To internetowa baza danych, rodzaj wspólnego rejestru transakcji
- Sharding oznacza podzielenie jednej bazy danych na wiele mniejszych, co daje nieograniczone miejsce na dane
- O wiele łatwiej jest włamać się do shardu niż do łańcucha bloków i nie ma obecnie zbyt wielu opcji, aby temu zapobiec
- Istnieje wiele strategii, których możesz użyć do shardingu, niektóre z nich to sharding w orientacji poziomej, pionowej i sharding w oparciu o hash
Wnioski
Sharding jest jedną z tych koncepcji, które są ostatnio „na tapecie” zwłaszcza w odniesieniu do blockchainu Ethereum. Zastosowanie takiej koncepcji w praktyce daje możliwości zwiększenia szybkości działania łańcucha bloków, jak również przyczynia się do zmniejszenia przeciążeń sieci.
Modeli, w których można zastosować to rozwiązanie, jest co najmniej kilka. Każda ze strategii ma jednak zarówno wady jak i zalety. W związku z powyższym, zastosowanie konkretnej strategii zależy od okoliczności i musi być starannie określone w oparciu o charakteryzujący je przypadek użycia.
***
Opracowano na podstawie:
- https://www.acodersjourney.com/database-sharding/
- https://hazelcast.com/glossary/sharding/
- https://docs.oracle.com/en/database/oracle/oracle-database/21/shard/index.html
- https://www.geeksforgeeks.org/what-is-sharding/
- https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6