Перейти к основному содержимому

Часто встречающиеся проблемы и пути их устранения

Ошибки в процессе установки СУБД Pangolin

В разделе описаны часто встречающиеся проблемы при установке СУБД Pangolin.

Не читается файл лицензий

Возникающая ошибка:

Check license file "/opt/pangolin-license/license.json" : file is not found

Решение:

Проверьте доступность под пользователем postgres файла лицензии:

  1. Проверка переменной окружения PG_LICENSE_PATH=/opt/pangolin-license/:

    [postgres@srv ~]$ echo $PG_LICENSE_PATH
    /opt/pangolin-license/

    При необходимости исправьте:

    export PG_LICENSE_PATH=/opt/pangolin-license/
  2. Проверка доступности файла лицензии:

    [postgres@srv ~]$ ls -la $PG_LICENSE_PATH
    total 12
    drwxr-xr-x 2 postgres postgres 4096 Apr 12 12:17 .
    drwxr-xr-x. 5 root root 4096 Apr 12 12:14 ..
    -rw-r--r-- 1 postgres postgres 500 Apr 12 12:17 license_trial_202407.json

Скопированы некорректные символы в конфигурационный файл

После запуска в логе появляется запись об ошибках чтения конфигурационного файла в $PGDATA/log/*. Например:

2024-04-12 12:25:50.689 MSK [60403] КОНТЕКСТ: строка 100 файла конфигурации "/pgdata/07/data/pg_hba.conf"
2024-04-12 12:25:50.689 MSK [60403] СООБЩЕНИЕ: неверный метод проверки подлинности " "

Решение:

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

Ошибка инициализации СУБД

Возникающая ошибка:

initdb: error while loading shared libraries: libjsoncpp.so.1: cannot open shared object file: No such file or directory

Необходимо установить пакет:

sudo apt install libjsoncpp1

Ошибка работы с unzip утилитой

Если возникла ошибка -bash: unzip: command not found – необходимо установить утилиту unzip и вернуться к шагу с распаковкой. Пример команды установки unzip:

sudo apt-get install unzip

Конфликт идентификаторов создаваемых пользователей/групп

При возникновении конфликтов идентификаторов создаваемых пользователей/групп во время установки пакета серверной или клиентской части СУБД (пример ошибки: error: group with gid=26 already exists), переопределите переменные путем изменения значений. Пример изменения uid/gid для пользователя postgres:

sudo POSTGRES_USER_GUID=111 POSTGRES_GROUP_GUID=111 dnf install pangolin-dbms-7.3

Список переменных использующий uid/gid и их значения по умолчанию указаны в блоке «Подготовка к ручной установке» раздела «Установка».

Статус состояния узла «Pending restart»

Если по окончанию установки компонента, при просмотре членов кластера и их состояния, появилось значение Pending restart, необходимо выполнить следующие команды под пользователем postgres:

  1. Перечитать конфигурационный файл компонента:

    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
  2. Перезапустить узлы кластера:

    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
  3. Если статус остался прежним (например, на реплике), рекомендуется ее проинициализировать:

    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reinit clustername

Ошибки etcd

В разделе рассмотрены проблемы, возникающие при работе компонента etcd.

Предупреждение при вызове команд etcd и ошибка выполнения alias

При использовании etcd версии 3.6.x и выше переменная окружения ETCDCTL_API=3 не применяется. Если данная переменная осталась в файле .bash_profile или используется в alias members, health, elist, при вызове соответствующих команд может выводиться предупреждение:

"msg":"unrecognized environment variable","environment-variable":"ETCDCTL_API=3"

Также при использовании alias elist команда проверки состояния etcd может завершаться ошибкой аутентификации. Это связано с изменением требований безопасности для операций gRPC maintenance при включенном RBAC.

Пример запроса вызывающего ошибку:

ETCDCTL_API=3 etcdctl --endpoints={master_host}:2379,{replica_host}:2379,{arbiter_host}:2379 --cert="/pg_ssl/etcd.crt" --key="/pg_ssl/etcd.key" --cacert="/pg_ssl/root.crt" endpoint status -w table --cluster

Пример корректного запроса:

etcdctl --endpoints={master_host}:2379,{replica_host}:2379,{arbiter_host}:2379 --cert="/pg_ssl/etcd.crt" --key="/pg_ssl/etcd.key" --user=root endpoint status -w table --cluster

Решение:

  1. Удалите использование переменной ETCDCTL_API=3 из файла .bash_profile, в том числе из alias members и health, если она там присутствует.

  2. Удалите alias elist из .bash_profile.

  3. Перечитайте файл .bash_profile:

    source ~/.bash_profile
  4. При выполнении запросов к RPC maintenance при включенном RBAC необходимо указывать пользователя, обладающего правами для выполнения данного запроса, с помощью параметра --user=.

Начиная с установок, в которых используется etcd версии 3.6.x и выше, скрипты автоматизации Pangolin не добавляют переменную ETCDCTL_API=3 и alias elist в .bash_profile.

Несоответствие идентификатора кластера

После запуска кластера возможно появление ошибки в логах sudo journalctl -xe:

sudo journalctl -xe:
etcd[1667]: request cluster ID mismatch (got {hash} want {hash})

Решение:

Остановите кластер и пересоздайте директорию /var/lib/etcd:

sudo systemctl stop etcd.service
sudo rm -rf /var/lib/etcd/
sudo mkdir /var/lib/etcd
sudo chown -R etcd:etcd /var/lib/etcd/
sudo systemctl start etcd.service

Несоответствие идентификатора узлов системы

Пример лога:

CRITICAL: system ID mismatch, node pg02 belongs to a different cluster: 6792170493505963560 != 6792187323051185862

Решение:

  1. Выполните команду:

    etcdctl rm /service/clustername/initialize
  2. Перезапустите Pangolin Manager:

    sudo systemctl restart pangolin-manager

Сбой etcd. Узлы кластера сменили роли

Сообщения в логе имеют вид:

INFO: following a different leader because i am not the healthiest node

Решение:

  1. При одном запущенном Pangolin Manager, выполните команду:

    etcdctl rm /service/clustername/optime/leader
  2. Перезапустите Pangolin Manager:

    sudo systemctl restart pangolin-manager

Ошибки Pangolin Manager

Ошибка разбора IPv6-адреса в DSN-строке

Описание проблемы:

При использовании компонента Pangolin Manager версии ниже 2.2.1 на ОС SberLinux 9.6 и других ОС с установленной версией пакета urllib 3.9.21 (зависимость python3), возможно возникновение ошибки:

UNEXPECTED EXCEPTION: ValueError('Invalid IPv6 URL')

Проблема вызвана изменениями в модуле urllib.parse.urlparse в новых версиях Python, повлиявших на обработку IPv6/IPvFuture-адресов в соответствии со стандартом RFC 3986. В результате квадратные скобки [] в имени хоста допускаются только для корректных IPv6/IPvFuture-адресов.

В Patroni (ядро Pangolin Manager) модуль urllib.parse.urlparse используется для разбора DSN-строк PostgreSQL, начинающихся с postgres:// или postgresql://. Ядро PostgreSQL позволяет указывать несколько хостов через запятую, например:

postgresql://[fd12:3456:789a::1],[fd42:1c2b:3e4d:5f6a::1234]/db

Сценарии, при которых возникает ошибка:

  1. При использовании аргументов --generate-config --dsn, например:

    patroni --generate-config --dsn "postgresql://[fd12:3456:789a::1],[fd42:1c2b:3e4d:5f6a::1234]/somedb"

    В этом случае будет выведена ошибка исключения:

    UNEXPECTED EXCEPTION: ValueError('Invalid IPv6 URL')
  2. Если в параметре primary_conninfo конфигурации СУБД указана DSN-строка с несколькими IPv6-адресами в формате, не соответствующем новым правилам. Этот сценарий маловероятен, так как Patroni по умолчанию формирует primary_conninfo в формате ключ=значение. Ошибка возможна только при ручной правке конфигурации.

Решение:

  • Обновить Pangolin Manager до версии 2.2.1.

  • Для конфигураций, где обновление невозможно:

    • избегать использования DSN-строк с несколькими IPv6-адресами, разделенными запятыми, в параметрах запуска и конфигурации;

    • использовать формат подключения СУБД в формате ключ=значение, например:

      primary_conninfo = 'user=patroni host=localhost port=5433 sslmode=verify-ca ...'