раздел (Partition
)
Что такое раздел?
Разделение в основном дляМасштабируемость. Различные разделы могут быть размещены на разных узлах кластера без общего доступа.
Зачем раздел?
- Улучшить масштабируемость системы
- Улучшите доступность системы (отказ узла вызовет только часть потери данных)
*Горизонтальная перегородка и вертикальная перегородка
Горизонтальные срезы часто используются в распределенных системах.
- Нет узких мест в производительности, связанных с чрезмерным объемом данных и высокой степенью параллелизма в одной базе данных, что повышает стабильность системы и нагрузочную способность.
- Преобразование стороны приложения небольшое, и нет необходимости разделять бизнес-модуль
Вертикальные срезы часто используются дляDBMS
- Решите связь на уровне бизнес-системы, и бизнес будет понятен
- Подобно управлению микросервисами, он также может выполнять иерархическое управление, обслуживание, мониторинг и расширение данных в различных компаниях.
- В сценариях с высоким параллелизмом вертикальная сегментация в определенной степени устраняет узкие места операций ввода-вывода, соединений с базами данных и аппаратных ресурсов одной машины.
Синонимы
разделpartition
Разные названия в разных базах
-
Shard
[Фрагментация]MongoDB
,Elasticsearch
-
Region
[площадь]HBase
-
tablet
[табличный блок]BigTable
-
vnode
[виртуальный узел]Cassandra
,Riak
Разделение и репликация
Разделение часто используется в сочетании с репликацией, так что копии каждого раздела хранятся на нескольких узлах. Это означает, что даже если каждая запись принадлежит разделу, ее можно хранить на нескольких разных узлах для обеспечения отказоустойчивости.
Разделение данных типа "ключ-значение"
Цель секционирования — равномерно распределить данные и запросы по узлам. Если каждый узел совместно использует данные и загружается равномерно, то теоретически 10 узлов должны быть в состоянии обрабатывать в 10 раз больше данных и в 10 раз больше пропускной способности чтения и записи, чем один узел.
две концепцииskew
&hot spot
-
skew
: некоторые разделы имеют больше данных или запросов, чем другие, мы называем это перекосом -
hot spot
: Разделы с высокой нагрузкой, вызванной дисбалансом, называются горячими точками.
Разделение диапазона по ключу
Один из способов разделения — назначить каждому разделу непрерывный диапазон ключей (от минимального до максимального).
братьmysql range partition
Например, создайтеemployees
поверхность
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
можно увидетьstore_id
= 1~5 назначаютсяp0
Дивизия 6-11 закреплена заp2
раздел и тд
range partition
Преимущества и недостатки
- Поддержка запросов диапазона, таких как хеширование по времени
load skew
Разделение на основе хеша ключей
hash partition
хэш хэш
Map the (skewed) range of keys to a uniformly distributed range of hashes
Согласованный хэш
Последовательность была введена в предыдущей статьеhash
содержание и не будет повторяться здесь.
Разделение и вторичные индексы
разделение на основе документов (document-based
) и на основе ключевых слов (term-based
) раздел.
local index
Every partition manages its own index with all pointers to local data items
- Вертикально секционированный индекс
- Insert/update/delete: performed locally
- Select: queries all partition indexes
Применимо к обработке транзакций в режиме онлайн
global index
Index entries are partitioned by their key independently from local data items
- Horizontally partitioned index
- Insert/update/delete: require remote updates
- Select: queries only one partition index
Для аналитической обработки в режиме онлайн
Перебалансировка разделов
Things change:
- Загрузка запроса → добавить больше процессоров
- Размер данных → добавить больше дисков и оперативной памяти
- Узлы выходят из строя → другие узлы должны взять на себя управление
- Require to move data around (rebalancing)!
Отрицательный примерhash mod N
еслиn
изменилось, то дляmod n
Значение также изменится с
Например:
123456 % 10 = 6, 123456 % 11 = 3, 123456 % 12 = 0,
Фиксированное количество разделов
Если узел добавляется в кластер, новый узел может украсть некоторые разделы с каждого текущего узла до тех пор, пока разделы снова не будут распределены справедливо.
динамический раздел
- Создайте некоторое начальное количество разделов
- Разделить раздел, если он превышает определенный порог максимального размера
- Если раздел меньше минимального порога, объедините его
похожий наB
древовидная структура данных
Разделение по пропорции узла
маршрутизация запросов
Теперь мы разделили набор данных на несколько узлов, работающих на нескольких машинах. Но есть еще нерешенный вопрос. Когда клиент хочет сделать запрос, как он узнает, к какому узлу подключаться? По мере перебалансировки раздела назначение раздела узлам также меняется.
Эту проблему можно обобщить какобнаружение службы (service discovery
)
- Балансировка нагрузки с циклической политикой (
Round-Robin Load Balancer
) если на узле есть запрошенный раздел, обработайте его напрямую, в противном случае перенаправьте на соответствующий узел - Все запросы от клиентов сначала отправляются на уровень маршрутизации, который решает, какой узел должен обрабатывать запрос и соответствующим образом маршрутизировать.
- Требовать от клиентов знания назначения разделов и узлов
Многие распределенные системы данных полагаются на независимую службу координации, такую какZooKeeper
для отслеживания метаданных кластера. каждый узел вZooKeeper
зарегистрируйтесь вZooKeeper
Поддерживайте надежное сопоставление разделов с узлами.
Cassandra
иRiak
Используйте другой подход: они используют протокол сплетен между узлами (gossip protocol
) для распространения изменений состояния кластера. Запросы могут быть отправлены на любой узел, который перенаправляется на соответствующий узел, содержащий запрошенный раздел.