Ответ
Шардирование (Sharding) — это практика горизонтального партиционирования данных в базе данных, при которой строки одной таблицы распределяются по нескольким независимым базам данных (шардам) на разных серверах. Каждый шард является автономной единицей хранения со своей схемой, но все вместе они представляют логически единый набор данных.
Ключевые концепции:
- Шард-ключ: Поле, по значению которого определяется целевой шард (например,
customer_id,country_code). - Локатор шардов: Сервис или функция, которая по шард-ключу возвращает соединение с нужным шардом.
Пример архитектуры с локатором:
class ShardLocator {
private array $shardConnections;
public function __construct(array $shardConfigs) {
foreach ($shardConfigs as $id => $config) {
$this->shardConnections[$id] = new PDO(
$config['dsn'],
$config['user'],
$config['password']
);
}
}
public function getShardByKey(int $key): PDO {
$shardId = $this->calculateShardId($key);
return $this->shardConnections[$shardId];
}
private function calculateShardId(int $key): int {
// Пример: равномерное распределение по 4 шардам
return $key % 4;
}
}
// Использование
$locator = new ShardLocator($config);
$userShard = $locator->getShardByKey($userId);
$stmt = $userShard->query("SELECT * FROM users WHERE id = {$userId}");
| Сравнение с репликацией: | Аспект | Репликация | Шардирование |
|---|---|---|---|
| Цель | Отказоустойчивость, чтение | Масштабирование записи и хранения | |
| Данные | Полная копия на каждой ноде | Уникальное подмножество на каждой ноде | |
| Сложность запросов | Просто (все данные локально) | Сложно (данные распределены) |
Шардирование — это мощный, но сложный паттерн, который вводится, когда вертикальное масштабирование (увеличение мощности сервера) становится слишком дорогим или невозможным.
Видео-ответы
▶
Собеседование на позицию Senior Python Developer 5000$ #12
▶
Python собеседование на 10000$
▶
Mock-собеседование по Golang и PostgreSQL от Senior из Ozon
▶
Открытое интервью на Middle Go-разработчика
▶
Открытое интервью на Go-разработчика | Эйч Навыки
▶
Миддл или же чего-то не хватает? / Техсобес на позицию Middle Python Developer / Mock interview
▶
Собеседование на позицию Backend Developer Python Middle #7
▶
Открытое интервью на Go-разработчика
▶
Открытое интервью на Go разработчика | Эйч Навыки
▶
Открытое тестовое интервью на Go разработчика | Эйч Навыки