Установка Firebird 3 на современные версии Linux: CentOS8 и Ubuntu 19

8s5pvav8p1_ttb6nz-rmdggqo7m.png?v=1

В этой статье мы опишем минимальный набор действий, необходимых для оптимальной установки СУБД Firebird версии 3.0 на новые дистрибутивы Linux. Для примеров выбраны CentOS 8 и Ubuntu 19.

Для «доставки» дистрибутива Firebird на целевую систему, в этом руководстве, выбран вариант загрузки tar.gz архива по ссылке с официального сайта проекта (firebirdsql.org).

Для самых нетерпеливых — сразу в бой:

Быстрая установка

Редактируем файл /etc/sysctl.conf, добавляя строку:

vm.max_map_count = 256000


Сохраняем файл и применяем настройку:

sudo sysctl -p /etc/sysctl.conf


Дальнейшие инструкции различаются для CentOS 8 и Ubuntu 19, но ССЫЛКА и КАТАЛОГ обозначают ссылку с официального сайта проекта Firebird для загрузки дистрибутива и каталог, в который будет распакован дистрибутив в процессе загрузки.
На текущий момент (март 2020) актуален релиз Firebird 3.0.5 (вот ссылка на 64 битную версию).

CentOS 8

sudo yum -y install epel-release
sudo yum -y makecache
sudo yum -y install libicu libtommath tar
ln -s libncurses.so.5 \
/usr/lib64/libncurses.so.5
ln -s libtommath.so.1 \
/usr/lib64/libtommath.so.0
curl -L ССЫЛКА|tar -zxC /tmp


Ubuntu 19

sudo apt-get -y install libncurses5 libtommath1
ln -s libtommath.so.1 \
/usr/lib/x86_64-linux-gnu/libtommath.so.0
wget -O- ССЫЛКА|tar -zxC /tmp


Собственно установка СУБД Firebird:

cd /tmp/КАТАЛОГ
sudo ./install.sh


Если вы хотите лучше понимать, что чего служат эти действия — читайте дальше.

Основная часть

Небольшая преамбула

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

Предполагается, что у читателя есть базовые знания о Linux и, СУБД Firebird.

Планирование

На сервере СУБД рекомендуется выделять отдельные разделы для временных файлов (/tmp), файлов баз данных и локальных бэкапов.

К временным относятся lock-файлы, файлы сортировок, файлы «материализации» глобальных временных таблиц (GTT) и таблиц мониторинга. Файлы сортировок и глобальных временных таблиц расположены в /tmp, файлы mon$-таблиц и lock-файлы — в /tmp/firebird.

Файлы сортировок «удаляются» (unlink) сразу после создания, поэтому их нельзя «увидеть» в листинге каталога — только в списке описателей (handles) процесса (помечены как deleted):

sudo ls -lhF /proc/`pgrep firebird`/fd


В листинге псевдокаталога /proc/…/fd/ отображаются симлинки, а фактическую информацию о файле даёт:

sudo stat -L /proc/`pgrep firebird`/fd/НОМЕР


где НОМЕР — описатель (дескриптор) интересующего файла.

Вместо вызова »pgrep исполняемый-файл» можно сразу подставить идентификатор интересующего процесса.

Временные файлы могут быть очень большими, поэтому для /tmp рекомендуется выделять не менее 20–30 ГБ. Следует учитывать, что размер файлов сортировок зависит только от объёма данных, явно или неявно сортируемых в запросе и один-единственный пользователь может «создать» гигабайты временных файлов.

Раздел для файлов баз данных должен вмещать файлы всех баз плюс, как минимум, копию файла самой большой базы. Следует учитывать рост файлов баз в перспективе на несколько лет вперёд.

Раздел локальных бэкапов должен вмещать, как минимум, по одному архиву бэкапов всех баз плюс бэкап самой большой базы. Желательно, чтобы на этом разделе было и место для восстановления самой большой базы. Следует учитывать рост бэкапов и архивов бэкапов в перспективе на несколько лет вперёд.

Предварительная подготовка

Сервер СУБД Firebird 3.0 динамически выделяет и освобождает системную память, что может приводить к её фрагментации. Например, после единовременного отключения от суперсервера большого числа пользователей, могут возникают ошибки при новых подключениях.

Фрагментацию памяти контролирует системный параметр vm.max_map_count, по умолчанию — 64K. Рекомендуется увеличить его значение вчетверо:

sudo sysctl vm.max_map_count=256000


Чтобы новое значение устанавливалось при перезагрузке системы, добавляем в файл /etc/sysctl.conf строчку:

vm.max_map_count = 256000


Желательно сделать комментарий, чтобы была понятна причина изменения этого параметра. Можно сначала отредактировать файл, а затем применить сохранённые в нём установки:

sudo sysctl -p /etc/sysctl.conf


Установка необходимых пакетов

Исполняемые файлы СУБД Firebird 3.0 Linux зависят от библиотек ncurses (libncurses.so.5), ICU (без привязки к версии и без отображения в выводе ldd) и tommath (libtommath.so.0). Для загрузки и распаковки архива сборки потребуются утилиты gzip, tar и curl или wget. Версии ICU, gzip, tar и curl/wget — несущественны.

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

CentOS 8

CentOS 8 использует новый пакетный менеджер — dnf и он же «прозрачно» вызывается по команде yum. Поскольку для наших целей между ними нет разницы — в примерах будет yum.

Обновляем кэш метаданных: sudo yum makecache

Пакет libtomath находится в отдельном E (xtra)P (ackages for)E (nterprise)L (inux) репозитории, поэтому проверяем, что он уже подключен:

yum -C repolist


Опция «только из кэша» (-C или --cache-only) используется, чтобы исключить ненужные проверки и загрузки, ускорив работу yum. Если в списке нет epel-репозитория — устанавливаем его и обновляем кэш метаданных:

sudo yum install epel-release &&
sudo yum makecache


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

Если возникли проблемы при загрузке метаинформации репозитория с https-ресурсов, то редактируем файл /etc/yum.repos.d/epel.repo, заменяя https:// на http:// и повторяем команду обновления кэша.

Проверяем статус нужных пакетов (команда сложена, в примере вывода отфильтрован 32-разрядный пакет):

yum -C list \
ncurses libicu libtommath \
gzip tar curl wget |
grep -v i686
Installed Packages
curl.x86_64 7.61.1-11.el8 @anaconda
gzip.x86_64 1.9-9.el8 @anaconda
ncurses.x86_64 6.1-7.20180224.el8 @anaconda
Available Packages
libicu.x86_64 60.3-1.el8 BaseOS
libtommath.x86_64 1.1.0-1.el8 epel
tar.x86_64 2:1.30-4.el8 BaseOS
wget.x86_64 1.19.5-8.el8_1.1 AppStream


Видим, что curl, gzip и ncurses размещены в псевдорепозитории установщика (anaconda), а tar — исключён из минимальной установки системы. Мажорные версии libncurses и libtommath больше, чем требуется: 6 и 1 вместо 5 и 0, соответственно. Если один и тот же пакет и установлен и доступен — для него выпущено обновление. Устанавливаем недостающие пакеты:

sudo yum install \
libicu libtommath tar


Ubuntu 19

Для управления пакетами предназначены утилиты apt, apt‑get и apt‑cache. Первая рассчитана на интерактивную работу, а две последние — на использование в скриптах. Имена пакетов немного другие и включают версию.

Проверяем статус нужных пакетов (команда сложена, пример вывода сокращён и отфильтрованы 32-разрядные пакеты):

apt list libncurses? libicu?? libtommath? \
gzip tar curl wget |
grep -v i386
curl 7.65.3-1
gzip 1.10-0 [upgradable…]
libicu63 63.2-2 [installed]
libncurses5 6.1
libncurses6 6.1 [installed,automatic]
libtommath1 1.1.0
tar 1.30 [installed]
wget 1.20.3 [installed]


Пакеты, для которых в квадратных скобках указано installed/upgradable — установлены. Доступен, но не установлен ncurses5, вместо curl установлен wget. Устанавливаем недостающие пакеты:

sudo apt‑get install \
libncurses5 libtommath1


Создание симлинков

Поскольку libtommath.so.1 и libncurses.so.6 обратно совместимы с libtommath.so.0 и libncurses.so.5, то для Firebird достаточно создать симлинки на имеющиеся версии библиотек.

Находим libtommath.so.1 (libncurses.so.? расположены в этом же каталоге):

find /usr -name libtommath.so.1


CentOS:

/usr/lib64/libtommath.so.1


Ubuntu:

/usr/lib/x86_64-linux-gnu/libtommath.so.1


Создаём симлинки.

CentOS:

sudo ln -s libtommath.so.1 \
/usr/lib64/libtommath.so.0
sudo ln -s libncurses.so.6 \
/usr/lib64/libncurses.so.5


Ubuntu:

sudo ln -s libtommath.so.1 \
/usr/lib/x86_64-linux-gnu/libtommath.so.0


Проверяем результат (команда сложена, примеры вывода сокращены):

ls -lhF \
$(dirname `find /usr -name libtommath.so.1`) |
grep "lib\(ncurses\|tommath\)\.so\."


CentOS:

libncurses.so.5 -> libncurses.so.6*
libncurses.so.6 -> libncurses.so.6.1*
libncurses.so.6.1*
libtommath.so.0 -> libtommath.so.1*
libtommath.so.1 -> libtommath.so.1.1.0*
libtommath.so.1.1.0*


Ubuntu:

libncurses.so.5 -> libncurses.so.5.9
libncurses.so.5.9
libncurses.so.6 -> libncurses.so.6.1
libncurses.so.6.1
libtommath.so.0 -> libtommath.so.1
libtommath.so.1 -> libtommath.so.1.1.0
libtommath.so.1.1.0


Загрузка дистрибутива СУБД Firebird

На официальном сайте проекта Firebird (firebirdsql.org) публикуются ссылки на дистрибутивы «официальных» выпусков (releases) и «ежедневных» сборок (snapshot build).

Официальные выпуски для линукса доступны в виде архивов (tar.gz) и пакетов deb/rpm, а сборки — только в виде архивов. Мы будем рассматривать «общий установщик» (generic installer из tar.gz).

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

curl:

curl -L URL | tar -zxC /tmp


wget:

wget -O– URL | tar -zxC /tmp


По умолчанию curl посылает загружаемые данные на стандартный вывод, но не обрабатывает перенаправления и мы добавляем »‑L», а wget, наоборот: обрабатывает перенаправления, но записывает данные в файл и мы ставим »‑O‑». Для tar указываем использование gzip-фильтра и каталог, в который будет выполнена распаковка. По завершении процесса появится каталог вида Firebird‑3.0.5.33220‑0.amd64 с тремя файлами: install.sh, buildroot.tar.gz и manifest.txt.

Установка Firebird

В ходе предварительной подготовки мы отрегулировали значение системного параметра vm.max_map_count, проверили наличие и установили библиотеки ICU, ncurses и tommath. Убедились в правильности версий ncurses и tommath (libncures.so.5 и libtommath.so.0) и создали необходимые симлинки.

Собственно установка делается очень просто. Переходим в каталог, куда был распакован архив дистрибутива Firebird, проверяем и, при необходимости, устанавливаем флаг «исполняемый» скрипту install.sh:

chmod +x install.sh


запускаем инсталяционный скрипт:

sudo ./install.sh


нажатием клавиши Enter подтверждаем начало установки, а по получении запроса — вводим пароль sysdba.

Скрипт установки автоматически запускает systemd-юнит firebird-superserver (умалчиваемая архитектура Firebird 3.0). Сервис Firebird будет работать с параметрами по умолчанию для суперсервера: страничный кэш в 2048 страниц (на базу), буфер сортировок в 64 МБ (общий) и подключение только клиентов третьей версии. Просмотр параметров firebird.conf:

grep -v ^# firebird.conf | grep -v ^$


Следует учитывать, что новые значения из firebird.conf будут активированы только после перезапуска сервиса Firebird.

При подборе значений параметров следует учитывать, что есть три основных «потребителя»: страничный кэш (для базы), буфер сортировок (общий) и память, выделенная сервером для клиентских подключений. Управлять можно только первыми двумя — объём памяти клиентских подключений зависит от количества и текста кэшированных запросов, их планов и задействованных в запросах объектов базы. Оценка памяти клиентских подключений делается только эмпирически и может меняться при изменении клиентских приложений и/или объектов базы.

Для суперсервера на хостах с малым объёмом памяти (до 12–16 ГБ) не следует выделять для страничного кэша и буфера сортировки более трети-четверти от общего объёма ОЗУ.

Если количество баз не фиксировано и может меняться — общий объём памяти страничного кэша следует делить на максимальное количество баз, которые могут быть на сервере. Размер страничного кэша задаётся в страницах и его надо отдельно пересчитывать в байты.

Для переключения на архитектуру классика требуется, как минимум, явно указать ServerMode в firebird.conf, уменьшить там же страничный кэш (не более 2K), уменьшить буфер сортировок (суммарный допустимый объём всех сортировок, поделённый на максимальное количество подключений), запретить и остановить юнит firebird-superserver, разрешить и запустить юнит firebird-classic.socket.

Использование архитектуры суперклассик в Firebird 3.0 не имеет особого смысла: «надёжность» — как у суперсервера и такой же общий буфер сортировок. Нет общего страничного кэша и «потери» на синхронизацию разных подключений между собой такие же, как у классика.

Следует помнить, что в Firebird 3.0 часть параметров (страничный кэш, размеры лок-файла, хэш-таблицы и некоторые другие) можно задавать в databases.conf индивидуально для каждой базы. Для суперсервера полезно, например, задать маленькое значение DefaultDbCachePages в firebird.conf и установить индивидуальные страничные кэши нужным базам в databases.conf.

Вопросы по статье задавайте в комментариях, или пишите письма на наш адрес поддержки support@ibase.ru.

© Habrahabr.ru