Sobes.tech
Middle

Čo je sharding?

sobes.tech AI

Odpoveď od AI

Shardovanie je proces rozdeľovania veľkých súborov údajov na menšie, spravovateľné časti, nazývané shardami. Každý shard je nezávislá databáza alebo tabuľka s časťou údajov. Ide o horizontálne škálovanie, ktoré umožňuje rozloženie záťaže a úložiska medzi viacerými servermi alebo inštanciami databázy, čím sa zvyšuje výkon, dostupnosť a kapacita systému.

Kľúčové aspekty:

  • Kľúč shardovania: Atribút údajov (napríklad ID používateľa, geolokácia), ktorý sa používa na určenie, do ktorého shardu umiestniť konkrétny záznam. Výber správneho kľúča je kritický pre rovnomerné rozdelenie údajov.
  • Strategie shardovania: Rôzne metódy určenia, ako sa údaje rozdeľujú medzi shardami:
    • Range Sharding: Údaje sa rozdeľujú podľa rozsahov hodnôt kľúča shardovania.
    • Hash Sharding: Kľúč shardovania sa hash-uje a výsledok určuje shard.
    • Directory-Based Sharding: Používa sa tabuľka-sprievodca na mapovanie kľúča shardovania na shard.
  • Routovanie: Mechanizmus určenia, ktorý shard obsahuje potrebné údaje na vykonanie požiadavky.
  • Rebalansovanie: Proces preusporiadania údajov medzi shardami, napríklad pri pridávaní alebo odstraňovaní shardov.

Výhody:

  • Škálovateľnosť: Umožňuje spracovanie rastúcich objemov údajov a záťaže.
  • Výkon: Znižuje záťaž na jednotlivé servery, zrýchľuje vykonávanie požiadaviek.
  • Dostupnosť: Zlyhanie jedného shardu nevyhnutne neznamená zlyhanie celého systému.
  • Spravovateľnosť: Uľahčuje správu veľkých súborov údajov.

Nevýhody:

  • Zložitosť: Implementácia a správa shardovacieho systému je zložitejšia.
  • Požiadavky na viacero shardov: Požiadavky vyžadujúce údaje z viacerých shardov môžu byť pomalšie a zložitejšie.
  • Zmeny schémy: Zmeny v schéme údajov môžu vyžadovať koordináciu medzi všetkými shardami.

Príklad jednoduchého implementácie routingu v Golangu s použitím hashovania:

package main

import (
	"fmt"
	"hash/fnv"
)

// determineShard určuje shard pre kľúč
func determineShard(key string, numShards int) uint32 {
	h := fnv.New32a() // používame hashovaciu funkciu FNV
	h.Write([]byte(key))
	return h.Sum32() % uint32(numShards) // berieme zvyšok modulo počtu shardov
}

func main() {
	numShards := 4
	kľúče := []string{"user1", "user2", "user3", "user4", "user5", "user6"}

	for _, kľúč := range kľúče {
		shard := determineShard(kľúč, numShards)
		fmt.Printf("Kľúč '%s' ide do shard %d\n", kľúč, shard)
	}
}