Если ваш администратор выполнил установку не с параметрами по умолчанию, вам может потребоваться проделать дополнительную работу. Например, если сервер баз данных установлен на удалённом компьютере, вам нужно будет указать в переменной окружения PGHOST имя этого компьютера. Вероятно, также придётся установить переменную окружения PGPORT. То есть, если вы пытаетесь запустить клиентское приложение и оно сообщает, что не может подключиться к базе данных, вы должны обратиться к вашему администратору. Если это вы сами, вам следует обратиться к документации и убедиться в правильности настройки окружения. Если вы не поняли, о чём здесь идёт речь, перейдите к следующему разделу.
Postgres Pro Shardman состоит из следующих программных компонентов:
СУБД PostgreSQL 17 с набором изменений.
Расширение Postgres Pro Shardman.
Инструменты и службы управления, включая встроенный менеджер сегментов для обеспечения отказоустойчивости.
Расширение BiHA.
Конфигурации Postgres Pro Shardman хранятся в кластере etcd, поэтому можно использовать существующий или развернуть новый простой кластер etcd с одним узлом.
Демон shardmand контролирует конфигурацию кластера и управляет кластерами BiHA, которые обеспечивают отказоустойчивость сегментов. Общая конфигурация Postgres Pro Shardman (shardmand) хранится в кластере etcd.
В настоящее время пакеты Postgres Pro Shardman доступны для следующих ОС:
Ubuntu 22.04/24.04
Debian 12
РЕД ОС 7.3/8
Альт 10/11 и Альт СП релиз 10
Astra Linux 1.7/1.8
В следующей таблице перечислены все имеющиеся пакеты Postgres Pro Shardman.
Таблица 1.1. Пакеты Postgres Pro Shardman
|
Пакет |
Описание |
|---|---|
|
|
Пакет верхнего уровня, устанавливающий и настраивающий Postgres Pro Shardman для серверных и клиентских систем. Не используйте этот пакет при обновлении или миграции. ВажноПри установке пакета |
|
|
Пакет верхнего уровня, устанавливающий символы отладки для других пакетов. |
|
|
Стандартные клиентские приложения, такие как psql и pg_dump. |
|
|
Пакет для отладки. |
|
|
Демон shardmand для управления службами Postgres Pro Shardman. |
|
|
Утилита командной строки для управления демоном или утилитами, например, shardmanctl. |
|
|
Общие библиотеки, требующиеся для развёртывания клиентских приложений, включая libpq; библиотеки времени выполнения для обработчика ECPG. |
|
|
Пакет для отладки. |
|
|
Сервер Postgres Pro Shardman и серверный язык программирования PL/pgSQL. |
|
|
Пакет для отладки. |
|
|
Дополнительные расширения и программы, разворачиваемые на серверах баз данных. |
|
|
Пакет для отладки. |
|
|
Заголовочные файлы и библиотеки для разработки клиентских приложений и серверных расширений. В системах на базе Debian этот пакет называется |
|
|
Пакет для отладки для заголовочных файлов. |
|
|
Реализация языка Perl для программирования на стороне сервера (см. Главу 45). |
|
|
Пакет для отладки. |
|
|
Реализация языка Python 3 для программирования на стороне сервера (см. Главу 46). |
|
|
Пакет для отладки. |
|
|
Реализация языка Tcl для программирования на стороне сервера (см. Главу 44). |
|
|
Пакет для отладки. |
|
|
Документация на английском языке. |
|
|
Документация на русском языке. |
|
|
Версия bihactl для Golang, которой через BiHA могут управлять shardmanctl и другие утилиты. |
|
|
Этот пакет обеспечивает поддержку JIT-компиляции. Этот пакет предоставляется только для архитектуры x86_64 и только для поддерживаемых систем Debian и Ubuntu, Astra Linux 1.7/1.8 и поддерживаемых систем Альт. Чтобы узнать об использовании JIT больше, обратитесь к Главе 29. |
|
|
Пакет для отладки. |
|
|
Утилита pg_probackup. |
|
|
Пакет для отладки. |
|
|
Утилита pgpro_controldata, показывающая управляющую информацию кластера БД PostgreSQL/Postgres Pro Shardman и параметры совместимости кластера и/или сервера. |
|
|
Расширение pgpro_pwr, позволяющее получать отчёты по нагрузке, полезные для выявления наиболее ресурсоёмких операций в базе данных. |
Кроме того, Postgres Pro Shardman предоставляет отдельные пакеты с отладочной информацией для некоторых операционных систем:
В системах на базе Debian это пакет postgrespro-sdm-17-dbg.
В ОС Альт Линукс для всех пакетов с двоичными файлами имеются соответствующие пакеты -debuginfo.
Минимальная конфигурация представляет собой один узел etcd и два узла Postgres Pro Shardman. Здесь рассмотрим более сложную конфигурацию с кластером etcd из двух узлов и кластером Postgres Pro Shardman из двух узлов.
Допустим, у нас есть следующие имена узлов и IP-адреса:
192.0.1.1 etcd - узел etcd 192.0.1.20 sdm01 - первый узел Shardman 192.0.1.21 sdm02 - второй узел Shardman 192.0.1.23 sdm03 - третий узел Shardman 192.0.1.100 ntp - сервер синхронизации по местному времени (необязательно)
Характеристики каждого узла: 4Gb RAM, 20GB HDD, 2CPU и ОС Ubuntu 22.04.
/etc/hosts #Этот шаг следует выполнить на всех узлах.
sudo /bin/sh -c 'cat << EOF >> /etc/hosts 192.0.1.1 etcd1 192.0.1.20 sdm01 192.0.1.21 sdm02 192.0.1.23 sdm03 EOF'
Этот шаг следует выполнить на всех узлах.
Установите и запустите демон chrony на всех узлах.
sudo apt install -y chrony
По умолчанию chrony получает время с доступных серверов в Интернете или с локального сервера времени. Проверить доступные серверы времени можно следующим образом:
chronyc sources MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? 192.0.1.100 1 6 7 1 -98us[ -98us] +/- 11ms ^* time.cloudflare.com 3 6 7 1 +139us[ +163us] +/- 11ms ^+ tms04.deltatelesystems.ru 1 6 7 1 -381us[ -357us] +/- 17ms
Желательно синхронизировать время с вашим сервером или локальным сервером для кластера. В данном случае — сервер ntp. Для этого внесите в конфигурацию chrony следующие изменения:
sudo tee "/etc/chrony/chrony.conf" > /dev/null << 'EOF' server 192.0.1.100 iburst keyfile /etc/chrony.keys driftfile /var/lib/chrony/chrony.drift log tracking measurements statistics logdir /var/log/chrony EOF systemctl restart chrony
Проверьте, что демон chrony подключён к нужному серверу.
chronyc sources MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? 192.0.1.100 8 6 17 37 +14us[ +70us] +/- 161us chronyc tracking Reference ID : 0A80000C (ntp.local) Stratum : 9 Ref time (UTC) : Wed Nov 15 11:58:52 2023 System time : 0.000000004 seconds slow of NTP time Last offset : -0.000056968 seconds RMS offset : 0.000056968 seconds Frequency : 10.252 ppm fast Residual freq : -2.401 ppm Skew : 364.419 ppm Root delay : 0.000455358 seconds Root dispersion : 0.010503666 seconds Update interval : 2.1 seconds Leap status : Normal
Данные шаги необходимо выполнить на всех узлах etcd.
Установите следующие пакеты:
sudo apt install -y vim curl
Чтобы подключить репозиторий Postgres Pro Shardman, выполните следующие шаги:
Запустите скрипт (указав имя пользователя и пароль):
curl -fsSL -u "<имя_пользователя>:<пароль>" https://repo.postgrespro.ru/sdm/sdm-17/keys/pgpro-repo-add.sh > pgpro-repo-add.sh chmod +x pgpro-repo-add.sh
Задайте свой логин и пароль для репозитория pgpro-repo-add.sh:
ex -s -c "%s/REPOUSER=/REPOUSER=<имя_пользователя>/g" -c "wq" "pgpro-repo-add.sh" ex -s -c "%s/PASSWORD=/PASSWORD=<пароль>/g" -c "wq" "pgpro-repo-add.sh"
Запустите sudo pgpro-repo-add.sh:
sudo ./pgpro-repo-add.sh
Установите пакеты etcd-sdm:
sudo apt install -y etcd-sdm
Укажите значения переменных окружения в соответствующем файле:
sudo vim /etc/default/etcd-sdm
##следующие две строки должны содержать данные вашего узла
ETCD_NAME=<имя_узла>
ETCD_ADVERTISE_CLIENT_URLS=http://<ip_адрес_узла>:2379
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
ETCD_MAX_SNAPSHOTS=5
ETCD_MAX_WALS=5
ETCD_AUTO_COMPACTION_MODE=periodic
ETCD_AUTO_COMPACTION_RETENTION=5m
ETCD_QUOTA_BACKEND_BYTES=6442450944
ETCD_DATA_DIR=/var/lib/etcd-sdm/sdm-17
#последующие параметры требуются только для кластера etcd с несколькими узлами
#замените на свои IP
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://<ip_адрес_узла>:2380
ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380Этот файл будет загружен при запуске etcd.
Очистите каталог данных etcd:
sudo rm -rf /var/lib/etcd-sdm/sdm-17/*
Перезапустите службу etcd-sdm:
sudo systemctl restart etcd-sdm
Для локального пользователя добавьте путь /opt/pgpro/sdm-17/bin в переменную окружения PATH:
echo "export PATH=$PATH:/opt/pgpro/sdm-17/bin" >> ~/.bashrc source ~/.bashrc
Проверьте правильность конфигурации etcd:
etcdctl endpoint --endpoints=http://192.0.1.1:2379 status health -w table +------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------------------------------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------------------------------+ | http://192.0.1.1:2379 | 9324a99282752a09 | 3.5.9 | 2.1 GB | true | false | 14 | 91459207 | 91459207 | memberID:10602785869456026121 | | | | | | | | | | | alarm:NOSPACE | +------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------------------------------+
Кластер etcd с одним узлом правильно сконфигурирован и готов обрабатывать запросы.
Чтобы предотвратить раздувание при интенсивном использовании etcd, добавьте команду дефрагментации в cron:
sudo sh -c '
{ crontab -l; echo "@hourly /opt/pgpro/sdm-17/bin/etcdctl defrag"; }
| crontab'
Добавьте репозиторий Postgres Pro Shardman на каждом узле Postgres Pro Shardman:
Установите следующие пакеты:
sudo apt install -y vim curl jq
Запустите указанные скрипты:
curl -fsSL -u "<user>:<password>" https://repo.postgrespro.ru/sdm/sdm-17/keys/pgpro-repo-add.sh > pgpro-repo-add.sh | bash chmod +x pgpro-repo-add.sh
Задайте свой логин и пароль для репозитория pgpro-repo-add.sh:
ex -s -c "%s/REPOUSER=/REPOUSER=<имя_пользователя>/g" -c "wq" "pgpro-repo-add.sh" ex -s -c "%s/PASSWORD=/PASSWORD=<пароль>/g" -c "wq" "pgpro-repo-add.sh"
Запустите sudo pgpro-repo-add.sh:
sudo ./pgpro-repo-add.sh
Установите пакеты (на каждом узле):
sudo apt update sudo apt install -y postgrespro-sdm-17-server postgrespro-sdm-17-client postgrespro-sdm-17-contrib postgrespro-sdm-17-libs pg-probackup-sdm-17 sdm-17-services sdm-17-tools biha-utils-sdm-17
Предположим, выбранное имя кластера — cluster0. Следующий шаг — поместить переменные окружения Postgres Pro Shardman в каталог /etc/shardman (на каждом узле):
sudo sh -c 'cat << EOF > /etc/shardman/shardmand-cluster0.env SDM_CLUSTER_NAME=cluster0 SDM_LOG_LEVEL=info # введите адреса своих etcd SDM_STORE_ENDPOINTS=http://etcd:2379 EOF'
Файл и каталог создаются с помощью команды sudo, однако в дальнейшем shardmanctl её не использует, поэтому доступ к файлу с переменными окружения отсутствует. Для получения доступа необходимо добавить переменные в систему через export или дать пользователю права доступа к файлу и каталогу.
Для локального пользователя добавьте путь /opt/pgpro/sdm-17/bin в переменную окружения PATH и экспортируйте переменную SDM_STORE_ENDPOINTS:
echo "export PATH=$PATH:/opt/pgpro/sdm-17/bin" >> ~/.bashrc # введите адреса своих etcd echo "export SDM_STORE_ENDPOINTS=http://etcd:2379" >> ~/.bashrc source ~/.bashrc
Сгенерируйте пример конфигурации с помощью утилит Postgres Pro Shardman (только на одном узле Postgres Pro Shardman).
shardmanctl config generate > spec.json
На этом шаге можно внести некоторые изменения в спецификацию (конфигурацию) кластера, например изменить пароль или параметр PostgreSQL shared_buffers и так далее.
Для небольшого изменения кластера задайте для параметра Repfactor значение 0. За подробной информацией обратитесь к файлу конфигурации Shardman.
jq ' .Repfactor = 0 ' "spec.json" > tmp.json && mv tmp.json "spec.json"
Осталось несколько последних шагов. Сначала инициализируйте конфигурацию кластера в etcd (только на одном [любом] узле Postgres Pro Shardman).
shardmanctl init --store-endpoints=http://etcd1:2379 -f spec.json -y
Ожидается такой результат:
2023-04-18T12:30:03.043Z DEBUG cmd/common.go:100 Waiting for metadata lock... 2023-04-18T12:30:03.048Z DEBUG cluster/cluster.go:365 DataDir is not specified, setting to default /var/lib/pgpro/sdm-17/data
Включите и запустите службу shardmand (на каждом узле Postgres Pro Shardman):
sudo systemctl enable --now shardmand@cluster0 sudo systemctl status shardmand@cluster0
● shardmand17@cluster0.service - deployment daemon for shardman
Loaded: loaded (/lib/systemd/system/shardmand17@.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-04-18 12:28:18 UTC; 2min 13s ago
Docs: https://github.com/postgrespro/shardman
Main PID: 618 (shardmand)
Tasks: 10 (limit: 4571)
Memory: 32.0M
CPU: 422ms
CGroup: /system.slice/system-shardmand.slice/shardmand@cluster0.service
└─618 /opt/pgpro/sdm-17/bin/shardmand --cluster-name cluster0 --system-bus --user postgres
Следующую команду необходимо выполнить только на одном узле Postgres Pro Shardman.
На этом шаге предполагается, что все предыдущие шаги выполнены успешно: кластер etcd работает нормально, время на всех узлах синхронизировано, и демон запущен на sdm01, sdm02 и sdm03. На последнем шаге выполняется команда shardmanctl:
shardmanctl nodes add --store-endpoints=http://etcd1:2379 \
-n sdm01,sdm02,sdm03 \
--cluster-name cluster0 \
--log-level debug
Ожидается такой результат:
2023-04-18T12:43:11.300Z DEBUG cmd/common.go:100 Waiting for metadata lock... 2023-04-18T12:43:11.306Z INFO cluster/store.go:277 Checking if shardmand on all nodes have applied current cluster configuration ✓ Waiting for shardmand on node sdm01 to apply current configuration: success 0.000s ✓ Waiting for shardmand on node sdm02 to apply current configuration: success 0.000s ✓ Waiting for shardmand on node sdm03 to apply current configuration: success 0.000s 2023-04-18T12:43:11.307Z INFO add/case.go:112 Initting Stolon instances... 2023-04-18T12:43:11.312Z INFO add/case.go:170 Waiting for Stolon daemons to start... make sure shardmand daemons are running on the nodes ✓ Waiting for Stolon daemons of rg clover-1-sdm01: success 31.012s ✓ Waiting for Stolon daemons of rg clover-1-sdm02: success 0.012s ✓ Waiting for Stolon daemons of rg clover-1-sdm03: success 0.012s 2023-04-18T12:43:42.336Z INFO add/case.go:187 Adding repgroups... ✓ waiting rg 1 config apply: done 7.014s 2023-04-18T12:43:49.444Z DEBUG broadcaster/worker.go:33 start broadcaster worker for repgroup id=1 2023-04-18T12:43:49.453Z DEBUG broadcaster/worker.go:51 repgroup 1 connect established 2023-04-18T12:43:49.453Z DEBUG commands/addrepgroup.go:575 waiting for extension lock... 2023-04-18T12:43:49.453Z DEBUG commands/addrepgroup.go:137 Loading schema into replication group rg 1 ... 2023-04-18T12:44:25.665Z DEBUG rebalance/service.go:528 wait all tasks finish 2023-04-18T12:44:25.666Z DEBUG broadcaster/worker.go:75 finish broadcaster worker for repgroup id=1 2023-04-18T12:44:25.666Z DEBUG broadcaster/worker.go:75 finish broadcaster worker for repgroup id=2 2023-04-18T12:44:25.666Z INFO add/case.go:221 Successfully added nodes sdm01, sdm02, sdm03 to the cluster
Сообщение «Successfully added nodes sdm01, sdm02, sdm03 to the cluster» (Узлы sdm01, sdm02 успешно добавлены в кластер) означает, что всё в порядке и узлы sdm01, sdm02 и sdm03 работают нормально.
Проверьте состояние узлов кластера.
shardmanctl status RESTART REQUIRED PARAMS STATUS OK BIHA STATUS OK METADATA STATUS OK SHARDMAND STATUS OK REPLICATION GROUP STATUS OK DICTIONARY STATUS OK KEEPER STATUS OK STORE STATUS OK MASTER STATUS OK
Для подключения к кластеру получите строку подключения на любом узле кластера (sdm01, sdm02 или sdm02):
shardmanctl getconnstr
Пример вывода:
dbname=postgres host=sdm01,sdm02,sdm03 password=!!!CHANGE_ME!!! port=5432,5432,5432 user=postgres
Затем попробуйте подключиться:
psql -d 'dbname=postgres host=sdm01,sdm02,sdm03 password=!!!CHANGE_ME!!! port=5432,5432,5432 user=postgres'
Пример вывода:
psql (17.5) Type "help" for help. postgres=#
В примере используются следующие серверы:
192.0.1.1 etcd1 192.0.1.2 etcd2 192.0.1.3 etcd3
Установите необходимые пакеты на каждом сервере:
sudo apt install -y vim curl
Для подключения к репозиторию запустите на каждом сервере следующую команду:
sudo curl -fsSL https://repo.postgrespro.ru/sdm/sdm-17/keys/pgpro-repo-add.sh | bash
Установите пакеты etcd-sdm на каждом сервере:
sudo apt install -y etcd-sdm
Для каждого сервера отредактируйте файл со списком переменных окружения, заменив местозаполнители в угловых скобках конкретными значениями:
sudo vim /etc/default/etcd-sdm ETCD_NAME=<hostname> ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 ETCD_ADVERTISE_CLIENT_URLS=http://<host ip address>:2379 ETCD_INITIAL_ADVERTISE_PEER_URLS=http://<host ip address>:2380 ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1 ETCD_INITIAL_CLUSTER_STATE=new ETCD_MAX_SNAPSHOTS=5 ETCD_MAX_WALS=5 ETCD_AUTO_COMPACTION_MODE=periodic ETCD_AUTO_COMPACTION_RETENTION=5m ETCD_QUOTA_BACKEND_BYTES=6442450944 ETCD_DATA_DIR=/var/lib/etcd-sdm/sdm-17 ETCD_INITIAL_CLUSTER=etcd1=http://<ip etcd1>:2380,etcd2=http://<ip etcd2>:2380,etcd3=http://<ip etcd3>:2380
Этот файл будет загружен при запуске etcd со своими собственными параметрами запуска на каждом сервере.
Очистите каталог данных etcd:
sudo rm -rf /var/lib/etcd-sdm/sdm-17/*
Перезапустите службы etcd-sdm на каждом сервере:
sudo systemctl restart etcd-sdm
Для локального пользователя добавьте путь /opt/pgpro/sdm-17/bin в переменную окружения PATH:
echo "export PATH=$PATH:/opt/pgpro/sdm-17/bin" >> ~/.bashrc source ~/.bashrc
Проверьте правильность конфигурации etcd:
etcdctl member list -w table +------------------+---------+-------+------------------------------+----------------------------+------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | +------------------+---------+-------+------------------------------+----------------------------+------------+ | 318be6342e6d9ac | started | etcd1 | http://192.0.1.1:2380 | http://192.0.1.1:2379 | false | | 9e49480544aedb89 | started | etcd2 | http://192.0.1.2:2380 | http://192.0.1.2:2379 | false | +------------------+---------+-------+------------------------------+----------------------------+------------+ $ etcdctl --endpoints=http://192.0.1.1:2380,http://192.0.1.2:2380,http://192.0.1.3:2380 endpoint status health -w table +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | http://192.0.1.1:2380 | 318be6342e6d9ac | 3.5.9 | 5.7 MB | true | false | 13 | 425686 | 425686 | | | http://192.0.1.2:2380 | 9e49480544aedb89 | 3.5.9 | 5.7 MB | false | false | 13 | 425686 | 425686 | | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ -------+
Кластер etcd правильно сконфигурирован и готов обрабатывать запросы.
Чтобы предотвратить раздувание при интенсивном использовании etcd, добавьте команду дефрагментации в cron:
sudo { crontab -l; echo "@hourly /opt/pgpro/sdm-17/bin/etcdctl defrag"; } | crontab
Последняя строка с границами кластера etcd:
etcd1=http://<ip etcd1>:2380,etcd2=http://<ip etcd2>:2380,etcd3=http://<ip etcd3>:2380
Её следует указать в файле конфигурации /etc/shardman и в качестве параметра --store-endpoints shardmanctl.