Sobes.tech
Middle

Sharding nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Shardlama, böyük məlumat dəstlərinin daha kiçik və idarəolunan hissələrə, yəni shardlara bölünməsi prosesidir. Hər bir shard müstəqil verilənlər bazası və ya cədvəl olub, məlumatların bir hissəsini ehtiva edir. Bu, yüklənmənin və yaddaşın bir neçə server və ya verilənlər bazası instansları arasında paylanmasını təmin edən üfüqi miqyaslandırmadır və sistemin performansını, əlçatanlığını və tutumunu artırır.

Əsas aspektlər:

  • Shard açarı: Məlumat atributu (məsələn, istifadəçi ID-si, coğrafi yerləşmə), hansı shardda yerləşdiriləcəyini müəyyən etmək üçün istifadə olunur. Doğru açarın seçilməsi məlumatların bərabər paylanması üçün çox vacibdir.
  • Shard strategiyaları: Məlumatların shardlar arasında necə paylanacağını müəyyən edən müxtəlif metodlar:
    • Aralıq Sharding: Məlumatlar shard açarının dəyər aralıqlarına görə paylanır.
    • Hash Sharding: Shard açarı hash-lənir və nəticə shardı müəyyən edir.
    • Directory-based Sharding: Shard açarı ilə shard arasında əlaqəni göstərən referans cədvəli istifadə olunur.
  • Yönləndirmə: Lazımi məlumatların hansı shardda olduğunu müəyyən edən mexanizm.
  • Yenidən balanslaşdırma: Məlumatların shardlar arasında yenidən paylanması prosesi, məsələn, shardların əlavə olunması və ya çıxarılması zamanı.

Üstünlüklər:

  • Miqyaslandırma: Artan məlumat həcmi və yüklərlə işləməyə imkan verir.
  • Performans: Tək serverdəki yükü azaldır, sorğuların icrasını sürətləndirir.
  • Əlçatanlıq: Bir shardın uğursuzluğu bütün sistemin işləməsini dayandırmaya bilər.
  • İdarəetmə: Böyük məlumat dəstələrinin idarə olunmasını asanlaşdırır.

Çətinliklər:

  • Mürəkkəblik: Shard sisteminin tətbiqi və idarə olunması daha mürəkkəbdir.
  • Çox shardlu sorğular: Bir neçə sharddan məlumat tələb edən sorğular daha yavaş və mürəkkəb ola bilər.
  • Sxem dəyişiklikləri: Məlumat sxemində dəyişikliklər bütün shardlar arasında koordinasiya tələb edə bilər.

Hash istifadə edilərək Golang-da sadə yönləndirmə nümunəsi:

package main

import (
	"fmt"
	"hash/fnv"
)

// determineShard açar üçün shard-u müəyyən edir
func determineShard(key string, numShards int) uint32 {
	h := fnv.New32a() // FNV hash funksiyasını istifadə edirik
	h.Write([]byte(key))
	return h.Sum32() % uint32(numShards) // bölmənin qalıq hissəsi
}

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

	for _, key := range keys {
		shard := determineShard(key, numShards)
		fmt.Printf("Açar '%s' shard %d-ə gedir\n", key, shard)
	}
}