Sobes.tech
Middle

Mi az a sharding?

sobes.tech MI

Válasz az MI-től

A sharding a nagy adathalmazok kisebb, kezelhető részekre, úgynevezett shardokra bontásának folyamata. Minden shard egy független adatbázis vagy táblázat, amely az adatok egy részét tartalmazza. Ez horizontális skálázás, amely lehetővé teszi a terhelés és a tárolás elosztását több szerver vagy adatbázis példány között, javítva a rendszer teljesítményét, rendelkezésre állását és kapacitását.

Főbb szempontok:

  • Shard kulcs: Az adatok attribútuma (pl. felhasználói azonosító, földrajzi hely), amely meghatározza, hogy melyik shardba kerül egy adott rekord. A megfelelő kulcs kiválasztása kritikus az adatok egyenletes elosztásához.
  • Shard stratégiák: Különböző módszerek arra, hogy meghatározzuk, hogyan oszlanak el az adatok a shardok között:
    • Range sharding: Az adatok a shard kulcs értéktartományai szerint oszlanak el.
    • Hash sharding: A shard kulcs hash-elve van, és az eredmény határozza meg a shardot.
    • Directory-alapú sharding: Egy referencia táblát használnak a shard kulcs és a shard közötti megfeleltetéshez.
  • Routing: Mechanizmus annak meghatározására, hogy melyik shard tartalmazza a szükséges adatokat a lekérdezéshez.
  • Rebalanszolás: Az adatok újraelosztása a shardok között, például shard hozzáadása vagy eltávolítása esetén.

Előnyök:

  • Skálázhatóság: Lehetővé teszi a növekvő adatmennyiség és terhelés kezelését.
  • Teljesítmény: Csökkenti az egyes szerverek terhelését, gyorsítva a lekérdezéseket.
  • Elérhetőség: Egy shard meghibásodása nem feltétlenül állítja le az egész rendszert.
  • Kezelhetőség: Egyszerűsíti a nagy adathalmazok kezelését.

Hátrányok:

  • Bonyolultság: A sharding rendszer megvalósítása és kezelése bonyolultabb.
  • Több shardra vonatkozó lekérdezések: Az olyan lekérdezések, amelyek több shard adatait igénylik, lassabbak és bonyolultabbak lehetnek.
  • Séma módosítás: A séma módosítása megkövetelheti az összes shard koordinációját.

Egyszerű routing példája Golang-ban hash használatával:

package main

import (
	"fmt"
	"hash/fnv"
)

// determineShard meghatározza a shard-ot egy kulcs számára
func determineShard(key string, numShards int) uint32 {
	h := fnv.New32a() // az FNV hash függvényt használjuk
	h.Write([]byte(key))
	return h.Sum32() % uint32(numShards) // maradék a shard számával
}

func main() {
	numShards := 4
	keys := []string{"user1", "user2", "user3", "user4", "user5", "user6"}

	for _, key := range keys {
		shard := determineShard(key, numShards)
		fmt.Printf("A '%s' kulcs a %d shardba kerül\n", key, shard)
	}
}