Распределенная система — раздел

распределенный

раздел (Partition)

Что такое раздел?

Разделение в основном дляМасштабируемость. Различные разделы могут быть размещены на разных узлах кластера без общего доступа.

Зачем раздел?

  • Улучшить масштабируемость системы
  • Улучшите доступность системы (отказ узла вызовет только часть потери данных)

*Горизонтальная перегородка и вертикальная перегородка

图

Горизонтальные срезы часто используются в распределенных системах.

  • Нет узких мест в производительности, связанных с чрезмерным объемом данных и высокой степенью параллелизма в одной базе данных, что повышает стабильность системы и нагрузочную способность.
  • Преобразование стороны приложения небольшое, и нет необходимости разделять бизнес-модуль

Вертикальные срезы часто используются дляDBMS

  • Решите связь на уровне бизнес-системы, и бизнес будет понятен
  • Подобно управлению микросервисами, он также может выполнять иерархическое управление, обслуживание, мониторинг и расширение данных в различных компаниях.
  • В сценариях с высоким параллелизмом вертикальная сегментация в определенной степени устраняет узкие места операций ввода-вывода, соединений с базами данных и аппаратных ресурсов одной машины.
Синонимы

разделpartitionРазные названия в разных базах

  • Shard[Фрагментация]MongoDB,Elasticsearch
  • Region[площадь]HBase
  • tablet[табличный блок]BigTable
  • vnode[виртуальный узел]Cassandra,Riak

Разделение и репликация

Разделение часто используется в сочетании с репликацией, так что копии каждого раздела хранятся на нескольких узлах. Это означает, что даже если каждая запись принадлежит разделу, ее можно хранить на нескольких разных узлах для обеспечения отказоустойчивости.

pic

Разделение данных типа "ключ-значение"

Цель секционирования — равномерно распределить данные и запросы по узлам. Если каждый узел совместно использует данные и загружается равномерно, то теоретически 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) для распространения изменений состояния кластера. Запросы могут быть отправлены на любой узел, который перенаправляется на соответствующий узел, содержащий запрошенный раздел.