Быстрый старт#

В этой главе описывается установка и минимальная настройка кластера.

Подробнее об архитектуре вы можете узнать в разделе Архитектура YaXAHA Cluster, если кратко то YaXAHA Cluster состоит из: расширения для PostgreSQL, приложения-сервера и специальной измененной версии PgBouncer, как опционально рекомендуемое решение.

Системные требования#

Аппаратные требования YaXAHA Cluster перекрываются требованиями PostgreSQL сервера. Кластер может быть запущен на сервере под управлением одной из поддерживаемой версии Linux, на котором установлен PostgreSQL сервер.

  • Сервер под управлением основанного на Debian или RedHat дистрибутива Linux
  • Платформа x86-64
  • PostgreSQL версии 13, 14, 15

Установка ноды#

Каждая нода кластера это сервер PostgreSQL и установленный и настроенный пакет YaXAHA Cluster.

В этом разделе описываются действия которые необходимо выполнить чтобы из сервера PostgreSQL сделать ноду YaXAHA Cluster.

Установка пакета#

Мы рекомендуем устанавливать YaXAHA Cluster используя менеджер пакетов всегда когда это возможно, это упрощает обновления программного обеспечения.

Если у вас уже установлен PostgreSQL, вы можете сразу перейти к установке YaXAHA Cluster. Иначе необходимо сначала установить PostgreSQL и его клиента коммандной строки:

sudo apt install postgresql postgresql-client

Перед установкой YaXAHA Cluster, пожалуйста скачайте бупличный ключ:

wget -O - https://www.dbinvent.com/dist/DBinventLLC.gpg.key | sudo tee /etc/apt/trusted.gpg.d/DBinventLLC.asc

Затем добавьте наш репозиторий в ваш sources.list:

sudo sh -c 'echo "deb http://apt.dbinvent.com/focal focal non-free" > /etc/apt/sources.list.d/dbinvent.list'

Обновите список пакетов и установите YaXAHA Cluster:

sudo apt update && sudo apt install yaxaha

Установка расширения PostgreSQL#

После того как YaXAHA Cluster установлен, необходимо установить его расширение для PostgreSQL сервера и произвести минимальную настройку.

Расширение контролирует жизненный цикл транзакции и позволяет YaXAHA Cluster реализовать его функционал.

В данный момент мы не рекомендуем устанавливать расширение в работающий под нагрузкой PostgreSQL server. Перед установкой расширения, пожалуйста остановите сервер.

Для того чтобы упростить процесс установки расширения PostgreSQL и его настойку, мы включили в пакет утилиту ytsetup. Обычно достаточно запустить ytsetup без дополнительных параметров:

ytsetup

Если все прошло нормально, данная копия PostgreSQL уже может быть частью кластера. Осталось сообщить всем нодам кластера друг о друге и настроить репликацию.

Настройка ноды#

Чтобы нода стала частью кластера, необходимо сообщить ей и другим нодам друг о друге.

Каждая нода должна иметь уникальный идентификатор, который по умолчанию генерируется утилитой ytsetup и сохраняется в файле yt.conf. Обычно он находится там где, хранит свои настройки PostgreSQL, например:

/etc/postgresql/13/main/conf.d/yt.conf

Вы так же можете получить идентификатор ноды выполнив SQL-запрос:

show yt.node;

По умолчанию, используется Universally Unique Identifier версии 4, но вы можете установить любую другую строку в качестве идентификатора ноды.

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

Положим, что вы установили YaXAHA Cluster на три ноды с именами Node1, Node2 and Node3 которые имеют IP адреса 192.168.10.195, 192.168.10.196 и 192.168.10.197 и мы решили что ноды будут общаться на порту 2000. Тогда, на каждой ноде, необходимо добавить в таблицу настроек public.yt_config следующее:

Table: public.yt_config
insert into public.yt_config (name, module, value) values
('Node1','N','192.168.10.195:2000'),
('Node2','N','192.168.10.196:2000'),
('Node3','N','192.168.10.197:2000');

После чего, перезапустить каждую ноду:

systemctl restart ytserver

Настройка репликации#

Для настройки репликации необходимо вызвать функцию yt_setup которая создается в файле ytpgxt--1.1.sql когда устанавливается расширение для PostgreSQL.

Функция принимает в качестве пераметров включающие и исключающие шаблоны, флаг install и опционально имя таблицы настроек.

yt_setup(include varchar, exclude varchar, install bool, cfg_table_name varchar)

The шаблоны имеют синтаксис похожий на LIKE. В общем случае, имя таблицы указывается с ее схемой точно так же как когда вы пишете обычный SQL-запрос, например:

Шаблон Результат
%.nice_% Любая схема, имя таблицы начинается с "nice_"
yt.% Любая таблица схемы "yt"
%_log Любая таблица заканчивающая на "_log"
yt. Тоже самое что и yt.%, смотрите выше

Note: Включающий шаблон должен иметь хотя бы одну часть, пустое значение не допустимо. Пропущенные части шаблона быдут восприняты как "включая любое". Исключающий шаблон может быть пустой строкой.

Пример вызова функции yt_setup, на каждой ноде кластера:

select * from yt_setup('public.%', '%_log', true);

Такой запрос включит в репликацию все таблицы схемы public текущей базы данных, за исключением таблиц имена которых заканчиваются на _log. Аналогичным образом можно отключить репликацию установив флаг install=false.

Пример:

Давайте попробуем включить репликацию данных на примере только что созданной таблицы. Если кластер запущен, остановим его:

systemctl stop ytserver

В командной строке psql создадим таблицу yt_test:

create table yt_test(id serial primary key, name varchar(20), value varchar(80));

Теперь включим репликацию таблицы yt_test. Обратите внимание т.к. ноды выключены нам необходимо указать таблицу настроек последним параметром функции yt_setup:

select * from yt_setup('%.yt_test', '', true, 'public.yt_config');

Теперь запустим ytserver на всех нодах:

systemctl start ytserver

После запуска кластера, можно переходить к вставке данных в таблицу.

Сейчас наш продукт находится в стадии MVP и мы позволили себе допущение, что пользователь использует PgBouncer или транзакционный ORM фреймворк. Поэтому при использовании psql нам необходимо эмулировать транзакцию.

На любой из нод выполните:

 
begin;
insert into yt_test(name, value) values ('test', 'first');
select yt_complete(true);
commit;

Для проверки того что репликация работает, выполните на других нодах:

select * from yt_test where name='test';

Так как ноды повторили транзакцию за нодой-инициатором, у вас должен получится следующий вывод:

id | name | value
----+------+-------
 1 | test | first
(1 row)

Разворачивание кластера#

В данный момент, мы не предоставляем автоматизированных средств для удобных манипуляций с кластером в runtime или превращения существующей базы данных в кластер.

К моменту выхода релиза, мы реализуем часть наших планов в этом направлении.

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

Для дублирования всех данных сервера на другие ноды мы рекомендуем использовать pg_basebackup, как надёжное решение использующее встроенный протокол репликации PostgreSQL.

Когда нужно скопировать весь сервер, pg_basebackup намного более эффективен чем перенос данных с помощью pg_dump или pg_dumpall. Однако он не предназначен для выборочного дублирования отдельных баз данных.

Разворачивание нового кластера это повторение шагов описанного в главе Установка ноды на всех нодах.