CitusDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:07, 21 января 2019.
Open book.svg Авторство
Н. C. Прудковский
Согласовано: 20.01.2019
CitusDB
Citus-logo-3f0a4363.png
Создатели: Umur Cubukcu, Ozgun Erdogan, Sumedh Pathak
Разработчики: Citus Data
Выпущена: 2010
Постоянный выпуск: 7.5.1 / 28.08.2018
Состояние разработки: Активная
Написана на: C
Операционная система: Кросс-платформенная
Локализация: Английский язык
Тип ПО: СУБД
Лицензия: GNU AGPL
Веб-сайт github.com

CitusDB – это реляционная база данных, созданная на основе PostgreSQL компанией Citus Data [Источник 1]. Написана на языке C.

Обзор

CitusDB поставляется в форме расширения к PostgreSQL, работающего поверх штатных выпусков PostgreSQL 9.6 и 10. Эта база данных позволяет перейти от использования PostgreSQL на отдельном узле к параллельной обработке данных сразу на нескольких вычислительных узлах.

Устройство

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

Рисунок 1 - Master-slave схема CitusDB

Шардирование

Citrus использует модульную блочную архитектуру, которая похожа на блоки распределенной файловой системы Hadoop, но вместо файлов используются таблицы PostgreSQL. Каждая из этих таблиц представляет собой так называемый горизонтальный шард, то есть сегмент одной таблицы и располагается на одном из рабочих. Координатор Citus ведет таблицы метаданных, которые отслеживают работников и расположение сегментов на них. В свою очередь, каждый сегмент реплицируется по крайней мере на двух рабочих элементах (пользователь может задать для него более высокое значение). Архитектура логического сегментирования Citus также позволяет добавлять новых рабочих в любое время для увеличения емкости и вычислительной мощности кластера.

Таблицы метаданных

Координатор Citus ведет таблицы метаданных для отслеживания всех работников и расположения на них сегментов базы данных. Эти таблицы также поддерживают статистику, такую как размер и мин/макс значения о сегментах, которые помогают распределенному планировщику запросов Citus оптимизировать входящие запросы. Таблицы метаданных имеют небольшой размер (обычно несколько мегабайт) и могут быть реплицированы и быстро восстановлены в случае сбоя координатора.

Обработка запроса

Когда пользователь выполняет запрос, координатор Citus разбивает его на более мелкие фрагменты запроса, где каждый фрагмент запроса может выполняться независимо. Это позволяет Citus распределять каждый запрос по кластеру, используя вычислительную мощность всех задействованных узлов, а также отдельных ядер на каждом узле. Затем координатор назначает фрагменты запроса работникам, контролирует их выполнение, объединяет результаты и возвращает конечный результат пользователю. Для обеспечения масштабируемого выполнения всех запросов координатор также применяет различные оптимизации, которые минимизируют объем данных, передаваемых по сети.

Отказоустойчивость

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

Автофрагментация

В релизе CitusDB 5.0 появилась функция автофрагментации (auto-sharding capability). Данное нововведение позволяет фрагментировать таблицы в реальном времени при параллельном выполнении операций чтения и записи. Прикладное значение нового механизма в том, что он позволяет разделить СУБД на фрагменты и поддерживать параллельно работу с хранилищем с выполнением транзакционных запросов на передачу данных, с одной стороны, и обработку запросов для подсистемы аналитики, с другой.

Область применения

В большинстве случаев CitusDB предназначена для двух вариантов использования:

  1. Многопользовательская база данных (Multi-Tenant Database)
  2. Аналитика реального времени (Real-Time Analytics)

Многопользовательская база данных

В первой модели база данных используется в B2B приложениях и обслуживает множество клиентов, данные которых отделены друг от друга. Citus обеспечивает полное покрытие SQL для данной рабочей нагрузки и позволяет масштабировать СУБД до 100 тыс. клиентов.

Аналитика реального времени

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

Проблема PostgreSQL

По словам, Крейга Керстиенса, бывшего сотрудника компании Heroku, поставщика услуг PostgreSQL-as-a-Service, интенсивный поток данных в реальном времени ведет к быстрой перегруженности отдельной СУБД PostgreSQL. Приложение начинает собирать данные в общую таблицу, размеры которой прогрессируют очень быстро. Проблемы с PostgreSQL начинаются, когда объем накопленных данных переваливает за 100 Гб. Для исправления ситуации приходится фрагментировались данные PostgreSQL вручную или запускать другой экземпляр СУБД. Однако полностью выправить ситуацию удается редко.

Предназначение

Как считает основатель Citus Data - Umur Cubukcu, CitusDB пригодится для обработки данных объемом в 1 Тб или хотя бы в несколько сотен гигабайт, которые не удается разместить все вместе в оперативной памяти отдельного компьютера. Система CitusDB заполняет тем самым нишу, связанную с быстрой обработкой процессов в реальном времени при высокой скорости генерации исходных данных.

Установка

Установка CitusDB происходит на Linux с использованием Docker Compose для запуска и подключения контейнеров[Источник 2]

  • Устанавливаем Docker Community Edition и Docker Compose
$ curl -sSL https://get.docker.com/ | sh
$ sudo usermod -aG docker $USER && exec sg docker newgrp `id -gn`
$ sudo systemctl start docker

$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
  • Чтобы создать локальный кластер Citus, качаем конфигурационный файл Docker Compose и запускаем его
$ curl -L https://raw.githubusercontent.com/citusdata/docker/master/docker-compose.yml > docker-compose.yml
$ COMPOSE_PROJECT_NAME=citus docker-compose up -d

Замечание: Если на машине запущен PostgreSQL на 5432 порту, необходимо изменить последнюю команду:

$ MASTER_EXTERNAL_PORT=5433 COMPOSE_PROJECT_NAME=citus docker-compose up -d
  • Увеличим кол-во рабочих узлов до 3х:
$ sudo docker-compose -p citus scale worker=3
  • Убедимся, что инсталляция прошла успешно
$ docker exec -it citus_master psql -U postgres

В открывшемся терминале введем запрос:

postgres=# SELECT * FROM master_get_active_worker_nodes();

   node_name    | node_port 
----------------+-----------
 citus_worker_1 |      5432
 citus_worker_2 |      5432
 citus_worker_3 |      5432
(3 row)

Должны увидеть строку для каждого рабочего узла, включая имя узла и порт.

  • Закрытие кластера
$ COMPOSE_PROJECT_NAME=citus docker-compose down -v

Видео установки и работы с CitusDB

Источник

  1. Home page Citus Data company // URL: https://www.citusdata.com/ (дата обращения 21.09.2018)
  2. Страница установки CitusDB // URL: https://docs.citusdata.com/en/v7.5/installation/single_machine_docker.html (дата обращения 25.09.2018)