digital-garden/_inbox/Шардирование в БД.md

80 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- Шардинг
tags:
- зрелость/🌱
date:
- - 2024-03-12
zero-link:
- "[[00 HighLoad]]"
- "[[00 Базы Данных]]"
parents:
linked:
- "[[Партиционирование в БД]]"
---
## Тезисы
- Один из вариантов масштабирования.
- Данные разбиваются на части. Части размещаются на разных серверах.
- Не является [репликацией](_inbox/Репликация.md) и [партиционированием](Партиционирование%20в%20БД.md).
- Шардирование последняя мера по улучшению производительности.
***
Шардирование — это метод разделения и распределения больших объёмов данных по разным базам данных или узлам в рамках одной распределённой системы, чтобы облегчить их управление, обеспечить масштабируемость и повысить производительность. Каждая часть данных, или "шард", функционирует как отдельная база данных, и все шарды вместе образуют логически единую базу данных.
Основные принципы шардирования включают в себя:
- **Горизонтальное разделение данных**: Вместо того чтобы хранить все данные в одной таблице или базе данных, они разделяются на меньшие части. Каждый шард содержит часть данных, например, пользователей с идентификаторами от 1 до 1000 в одном шарде и от 1001 до 2000 в другом.
- **Распределение нагрузки**: Поскольку запросы к данным могут обрабатываться параллельно разными шардами, это способствует балансировке нагрузки и увеличению производительности системы.
- **Масштабируемость**: По мере роста объёмов данных новые шарды могут быть добавлены в систему, что позволяет масштабировать приложение горизонтально.
- **Локализация данных**: Шардирование может быть использовано для локализации данных, чтобы уменьшить задержки, связанные с географическим расположением пользователей и баз данных.
**Плюсы:**
- [Горизонтальное масштабирование](Горизонтальное%20масштабирование.md)
- **Улучшение производительности**: Единственный метод ускоряющий запись в БД.
- **Высокая доступность и устойчивость к отказам**: Отказ одного шарда не приводит к полному сбою системы. Данные в остальных шардах остаются доступными, что повышает общую устойчивость системы к отказам.
**Минусы:**
- **Сложность управления**: Нет стандартных механизмов по управлению шардами. В случае добавления или удаления шардов может потребоваться перераспределение больших объемов данных, что может быть ресурсоемкой операцией и повлиять на производительность системы.
- **Трудности с транзакциями и согласованностью**: Шардирование может затруднить обеспечение атомарности и согласованности транзакций, охватывающих несколько шардов, что может потребовать дополнительных усилий для поддержания целостности данных.
**Проблемы**
- [Согласованное префиксное чтение](Согласованное%20префиксное%20чтение.md)
Стратегии разбиения на шарды
- [Key Based Sharding](Key%20Based%20Sharding.md). Наиболее распространенный способ.
- [Range Base Sharding](Range%20Base%20Sharding.md).
- [Directory Based Sharding](Directory%20Based%20Sharding.md)
Роутинг на шарды:
- Умный клиент. Приложение само решает в какой шард идти
- Нет дополнительной точки отказа. Нет лишнего хопа.
- Как обновлять при изменении количества шардов?
- Прокси
- Сервисы вообще не знают о шардинге
- Дополнительная точка отказа. Лишний хоп.
- Координатор
- Сервисы вообще не знают о шардинге.
- Дополнительная точка отказа. Лишний хоп.
- Не отдает сами данные, а указывает сервису в какой шард сходить.
Проблемы:
- Данные неравномерно распределились.
- Попробовать подобрать лучше ключ шардирования/кэш функцию
- Решардинг
- [JOIN SQL](JOIN%20SQL.md)
- Держать нужные данные на одном шарде
- Делать вычисления в одном сервисе
## Решардинг
При добавлении/удалении ноды нужно провести решардинг. Перенести старые данные на новые узлы.
Лучше если количество нод будет равно степени 2. Формула shard_Id % count.
- 16 записей на 8 шардов -> 2 записи на шард
- 16 записей на 16 шардов -> 1 запись на шард
- [Consistent hashing](Consistent%20hashing.md)
## Заметки
- Как и в случае [партиционирования](Партиционирование%20в%20БД.md) запросы по ключу шардирования ускорятся.
- Запросы не по ключу пройдут по всем узлам.
- Запросы по диапазону ключей хэширования могут обойти все шарды.
- Можно создавать различные индексы на узлах. При этом может оказаться так, что индексы на исходной таблице могут не подойди для шардирования.
- В [PostgreSQL](00%20PostgreSQL.md) есть шардирование из коробки, но оно реализовано на базе [партиционирования](Партиционирование%20в%20БД.md). Фактически партиции уезжают на отдельные сервера. Решардинг это боль, так как должен выполняться вручную.