← Назад к вопросам

Что таке вертикальное шардирование?

2.0 Middle🔥 51 комментариев
#Архитектура и паттерны#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое вертикальное шардирование?

Вертикальное шардирование — это метод горизонтального масштабирования базы данных, при котором разные таблицы или наборы колонок размещаются на отдельных серверах или кластерах. В отличие от горизонтального шардирования (разделения строк одной таблицы), вертикальное шардирование разделяет схему данных по функциональным доменам или сущностям. Основная цель — изолировать нагрузку, улучшить производительность и упростить управление за счёт специализации серверов.

Ключевые принципы и отличия

  • Разделение по таблицам или атрибутам: Например, таблицы users, orders и logs размещаются на разных физических серверах. Иногда внутри одной таблицы редко используемые колонки (например, user_metadata в формате JSON) выносят на отдельный сервер.
  • Основа на доменной логике: Группировка данных происходит по бизнес-контексту — пользователи, транзакции, аналитика и т.д.
  • Сравнение с горизонтальным шардированием:
    ВертикальноеГоризонтальное
    Разделение по схемам/колонкамРазделение по строкам (например, по диапазону ID)
    Данные разных типов на разных серверахДанные одного типа распределены
    Часто требует изменения структуры запросовТребует шардинг-ключа для маршрутизации

Пример реализации в контексте PHP-приложения

Представьте интернет-магазин с монолитной базой данных. При росте нагрузки можно применить вертикальное шардирование:

// Конфигурация подключений к разным шардам
$databaseConfig = [
    'users_shard' => [
        'host' => 'user-db-server',
        'database' => 'users_db',
        // таблицы: users, profiles, sessions
    ],
    'orders_shard' => [
        'host' => 'order-db-server',
        'database' => 'orders_db',
        // таблицы: orders, order_items, payments
    ],
    'analytics_shard' => [
        'host' => 'analytics-db-server',
        'database' => 'analytics_db',
        // таблицы: logs, page_views, metrics
    ]
];

// Класс для управления подключениями
class ShardManager {
    private $connections = [];
    
    public function __construct(array $config) {
        foreach ($config as $shardName => $shardConfig) {
            $this->connections[$shardName] = new PDO(
                "mysql:host={$shardConfig['host']};dbname={$shardConfig['database']}",
                $shardConfig['username'],
                $shardConfig['password']
            );
        }
    }
    
    public function getShardConnection(string $shardName): PDO {
        if (!isset($this->connections[$shardName])) {
            throw new InvalidArgumentException("Unknown shard: $shardName");
        }
        return $this->connections[$shardName];
    }
}

// Использование
$shardManager = new ShardManager($databaseConfig);
$userShard = $shardManager->getShardConnection('users_shard');
$orderShard = $shardManager->getShardConnection('orders_shard');

// Запрос к шарду пользователей
$userQuery = $userShard->query("SELECT * FROM users WHERE id = 123");
// Запрос к шарду заказов  
$orderQuery = $orderShard->query("SELECT * FROM orders WHERE user_id = 123");

Преимущества вертикального шардирования

  1. Улучшение производительности: Нагрузка распределяется между серверами, уменьшаются блокировки и конкуренция за ресурсы.
  2. Специализация инфраструктуры: Для разных типов данных можно использовать:
    • Оптимизированные СУБД (например, PostgreSQL для транзакций, MongoDB для документов)
    • Различные конфигурации hardware (больше RAM для кэширования, быстрые SSD для транзакций)
  3. Упрощение резервного копирования и обслуживания: Можно выполнять операции на отдельных шардах без остановки всей системы.
  4. Повышение отказоустойчивости: Сбой одного шарда не обязательно затрагивает другие домены данных.

Недостатки и вызовы

  • Сложность JOIN-операций между шардами: Запросы, требующие соединения данных из разных шардов, становятся нетривиальными и медленными:
// ПРОБЛЕМА: Невозможно выполнить обычный SQL JOIN между разными серверами
// Вместо этого нужен двухэтапный запрос:
$userId = 123;

// 1. Получаем данные пользователя
$userStmt = $userShard->prepare("SELECT id, name, email FROM users WHERE id = ?");
$userStmt->execute([$userId]);
$user = $userStmt->fetch();

// 2. Получаем заказы пользователя
$ordersStmt = $orderShard->prepare("SELECT * FROM orders WHERE user_id = ?");
$ordersStmt->execute([$userId]);
$orders = $ordersStmt->fetchAll();

// 3. Собираем результат вручную в приложении
$result = [
    'user' => $user,
    'orders' => $orders
];
  • Транзакции ACID между шардами: Требуют распределённых транзакций (2PC, Saga), что добавляет сложности.
  • Сложность миграции: Перенос существующей схемы требует перепроектирования приложения и тщательного планирования.
  • Неравномерность нагрузки: Если один домен данных становится "горячим", вертикальное шардирование само по себе не решает проблему — может потребоваться дополнительное горизонтальное шардирование внутри этого домена.

Когда использовать вертикальное шардирование?

  1. Чётко разделяемые домены данных с минимальными cross-domain запросами.
  2. Разные требования к данным: OLTP vs OLAP, структурированные vs документоориентированные данные.
  3. Потребность в различных СУБД в рамках одного приложения.
  4. Этап перед горизонтальным шардированием как промежуточная оптимизация.

Паттерны работы в PHP-приложениях

  1. Шард-ориентированные репозитории: Каждый репозиторий знает, к какому шарду обращаться.
  2. Агрегация на уровне приложения: Сборка связанных данных выполняется в PHP-коде, а не в СУБД.
  3. Дублирование ключевых данных: Иногда целесообразно дублировать минимальный набор данных (например, user_id и user_name) между шардами для упрощения запросов.
  4. Использование очередей для консистентности: Асинхронная синхронизация изменений между шардами через message queue.

Вертикальное шардирование — мощный инструмент архитектора БД, но требует тщательного проектирования и понимания доменной логики приложения. В PHP-экосистеме его часто комбинируют с ORM-библиотеками (например, Doctrine), расширяя их для поддержки многобазовых конфигураций, или используют специализированные библиотеки шардинга.