Middle
Kas yra sharding?
sobes.tech AI
Atsakymas iš AI
Skaldymas – tai procesas, kai dideli duomenų rinkiniai yra padalijami į mažesnes, valdomas dalis, vadinamas skaldais. Kiekvienas skaldas yra nepriklausoma duomenų bazė arba lentelė su dalimi duomenų. Tai horizontalaus mastelio keitimo būdas, leidžiantis paskirstyti apkrovą ir saugyklą tarp kelių serverių arba duomenų bazės instancijų, taip didinant sistemos našumą, prieinamumą ir talpą.
Pagrindiniai aspektai:
- Skaldymo raktas: Duomenų atributas (pavyzdžiui, naudotojo ID, geografinė vieta), naudojamas nustatyti, į kurį skaldą įdėti konkretų įrašą. Tinkamo rakto pasirinkimas yra kritiškai svarbus duomenų tolygiam paskirstymui.
- Skaldymo strategijos: Skirtingi metodai, kaip duomenys yra paskirstomi tarp skaldų:
- Range Sharding: Duomenys paskirstomi pagal skaldymo rakto reikšmių diapazonus.
- Hash Sharding: Skaldymo raktas yra maišos funkcija, ir rezultatas nustato skaldą.
- Directory-Based Sharding: Naudojama katalogo lentelė, kuri susieja skaldymo raktą su skaldą.
- Maršrutizavimas: Mechanizmas, nustatantis, kuris skaldas turi reikiamus duomenis.
- Balansavimas: Duomenų perkėlimas tarp skaldų, pavyzdžiui, pridedant arba pašalinant skaldus.
Privalumai:
- Mastelio keitimas: leidžia apdoroti augančius duomenų ir apkrovos kiekius.
- Našumas: sumažina apkrovą atskiruose serveriuose, pagreitina užklausų vykdymą.
- Prieinamumas: vieno skaldo gedimas nebūtinai nutraukia visą sistemą.
- Valdymas: palengvina didelių duomenų rinkinių valdymą.
Trūkumai:
- Sudėtingumas: skaldymo sistemos įgyvendinimas ir valdymas yra sudėtingesnis.
- Daugiašaldės užklausos: užklausos, reikalaujančios duomenų iš kelių skaldų, gali būti lėtesnės ir sudėtingesnės.
- Schemos keitimas: duomenų schemos keitimas gali reikalauti koordinacijos tarp visų skaldų.
Pavyzdys paprasto maršrutizavimo Golang su maišos funkcijos naudojimu:
package main
import (
"fmt"
"hash/fnv"
)
// determineShard nustato skaldą pagal raktą
func determineShard(key string, numShards int) uint32 {
h := fnv.New32a() // naudojame FNV maišos funkciją
h.Write([]byte(key))
return h.Sum32() % uint32(numShards) // gauname likutį pagal modulį
}
func main() {
numShards := 4
raktai := []string{"user1", "user2", "user3", "user4", "user5", "user6"}
for _, raktas := range raktai {
shard := determineShard(raktas, numShards)
fmt.Printf("Raktas '%s' eina į skaldą %d\n", raktas, shard)
}
}