Перейти к содержанию

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

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

Принципы работы

Принципы работы распределенного SQL согласуются с требованиями стандарта SQL (Structured Query Language, язык структурированных запросов) для хранения и управления данными в виде таблиц:

  • Любая таблица представляет собой именованный набор строк
  • Все строки таблицы имеют одинаковый набор именованных столбцов
  • Каждому столбцу соответствует определённый тип данных
  • У каждой таблицы есть первичный ключ — набор столбцов, значения в которых уникально определяют местоположение каждой строки в таблице
  • Стандарт SQL не гарантирует какой-либо порядок строк при чтении из таблицы

Реализация распределенного SQL в Picodata

Picodata предоставляет функции планировщика и модуля исполнения SQL-запросов в рамках всего кластера. При выполнении распределенный запрос разбивается на части для опроса всех узлов, после чего собранные данные консолидируются и возвращаются пользователю.

Детали архитектуры планировщика доступны в отдельной PDF-презентации.

Схема выполнения запросов

На схеме ниже показан общий принцип работы распределенного SQL-запроса в кластере с одним роутером.

Distributed query

На схеме красным показан исходный пользовательский запрос, желтым — план запроса (IR, intermediate representation), зеленым — собранные фрагменты ответов, голубым — консолидированный ответ на пользовательский запрос в виде списка кортежей, обработанного функцией MapReduce.

Распределение данных

Распределенный SQL требует собственно распределения данных между различными репликасетами (шардами) кластера. Это достигается за счет использования встроенной библиотеки Vshard. Взаимодействие Picodata SQL и Vshard заключается в разделении функций:

  • Picodata SQL работает с шардированными таблицами, отдельные строки (кортежи) которых распределяются по разным бакетам
  • Vshard работает с распределением бакетов по репликасетам

У каждой распределенной таблицы в схеме данных всегда есть два признака:

  • наличие столбца bucket_id, связывающего каждую строку таблицы с определенным номером бакета
  • наличие ключа шардирования, состоящего минимум из одного столбца, по которому производится расчет значения bucket_id

Picodata SQL включает внутреннюю функцию по вычислению bucket_id на основе хешей значений, которые передаются в распределенных запросах. В шардированной таблице bucket_id хранит вычисленное значение (номер бакета) от функции шардирования (на вход подается набор колонок, по которым происходит шардирование, и количество бакетов в кластере). Для запроса SELECT значение bucket_id нужно чтобы узел с ролью vshard.router мог понять, на каком узле с ролью vshard.storage расположены искомые данные. Соответственно, для запроса INSERT требуется знать, на какой узел записывать данные. В общем случае, две записи с одинаковыми значениями в столбцах, относящихся к sharding_key, попадут в один бакет.