Быстрый старт#
В этой главе описывается установка и минимальная настройка кластера.
Подробнее об архитектуре вы можете узнать в разделе Архитектура 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 следующее:
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. Однако он не предназначен для выборочного дублирования отдельных баз данных.
Разворачивание нового кластера это повторение шагов описанного в главе Установка ноды на всех нодах.