Postgres Pro Enterprise в Яндекс.Облако
Руководство по созданию и использованию Postgres Pro Enterprise в Яндекс.Облако
Для использования БД Postgres Pro Enterprise 10/11/12/13/14 в облаке Яндекс.Облако необходимо иметь доступ в Интернет и учетную запись в Яндекс.Облако.
Для установки используем образ виртуальной машины (VM) Postgres Pro Enterprise 10/11/12/13/14, доступный в Яндекс.Облако Marketplace.
Требуемое ПО:
- 'yc' в составе Яндекс.Облако CLI для управления облачными ресурсами в Яндекс.Облако
- 'psql' или 'Pgadmin' для доступа к БД
Также можно использовать Яндекс.Облако Console https://console.cloud.yandex.ru
Установка Яндекс.Облако CLI описана в https://cloud.yandex.ru/docs/cli/quickstart
Документация Яндекс.Облако CLI доступна на https://cloud.yandex.ru/docs/cli/
Подключение к Яндекс.Облако и проверка окружения
- Подключаемся к Яндекс.Облако и выполняем конфигурацию окружения с помощью команды:
yc init
- Проверяем установленную версию 'yc' (рекомендуется последняя доступная версия):
yc version
- Список географических регионов и зон доступности для размещения VM:
yc compute zone list
yc config set compute-default-zone ru-central1-a
yc config get compute-default-zone
Далее будем использовать географический регион ‘ru-central1’ и зону доступности 'ru-central1-a'.
- Список доступных типов дисков:
yc compute disk-type list
Далее будем использовать тип диска ‘network-hdd’.
Создание VM
- Создаем сетевую инфраструктуру для VM:
NET=my-vpc
yc vpc network create \
--name $NET \
--description "$NET" \
--async
yc vpc network list
yc vpc subnet create \
--name $NET-subnet \
--range 192.168.0.0/24 \
--network-name $NET \
--description "$NET-subnet" \
--async
yc vpc subnet list
- В директории ~/.ssh создаем пару private/public ssh-ключей для подключения к VM:
ssh-keygen -t rsa -b 2048
- Для создания VM из последней версии образа Postgres Pro Enterprise 14, доступного в Яндекс.Облако Marketplace, выполняем команды:
IMAGE_FAMILY=postgreprof-postgres-pro-enterprise-database-14
VM_NAME=myvm-ent-xx
yc compute instance create \
--name $VM_NAME \
--hostname $VM_NAME \
--cores 2 \
--memory 2 \
--create-boot-disk name=$VM_NAME-osdisk,image-folder-id=standard-images,image-family=$IMAGE_FAMILY \
--network-interface subnet-name=$NET-subnet,nat-ip-version=ipv4 \
--ssh-key ~/.ssh/id_rsa.pub \
--async
yc compute instances show $VM_NAME
Вместо ‘xx’ используем '01', '02', '03' и т.д.
Подключение к VM
- Подключаемся к VM с помощью private ssh-ключа, используя public IP-адрес VM ($VM_IP_ADDRESS):
yc compute instances list
VM_IP_ADDRESS=$(yc compute instance show --name $VM_NAME | grep -E ' +address' | tail -n 1 | awk '{print $2}')
ssh yc-user@$VM_IP_ADDRESS
Проверка статуса сервиса БД Postgres Pro
- Проверяем статус сервиса БД Postgres Pro:
sudo systemctl -l status postgrespro-ent-14.service
- Чтобы остановить/стартовать сервис БД Postgres Pro используем команды:
sudo systemctl stop postgrespro-ent-14.service
sudo systemctl start postgrespro-ent-14.service
Подключение к БД Postgres Pro
- Переключаемся на пользователя ‘postgres’:
sudo su - postgres
- Для подключения к БД Postgres Pro используем команду:
psql
- Для выхода из ‘psql’ используем команду:
\q
- Для возврата в интерфейс 'yc' дважды выполняем команду 'exit'
Внешний доступ к VM
- При необходимости внешнего подключения к БД Postgres Pro открываем порт 5433:
ssh yc-user@$VM_IP_ADDRESS
sudo firewall-cmd --zone=public --add-port=5433/tcp
sudo firewall-cmd --zone=public --permanent --add-port=5433/tcp
sudo firewall-cmd --zone=public --list-ports
sudo systemctl restart firewalld.service
sudo systemctl -l status firewalld.service
exit
- При необходимости внешнего подключения к серверу мониторинга БД открываем порты 80 и 443:
ssh yc-user@$VM_IP_ADDRESS
sudo firewall-cmd --zone=public --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --add-port=443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --zone=public --list-ports
sudo systemctl restart firewalld.service
sudo systemctl -l status firewalld.service
exit
Внешнее подключение к БД Postgres Pro
- Для внешнего подключения к БД Postgres Pro устанавливаем пароль пользователя 'postgres':
ssh yc-user@$VM_IP_ADDRESS
sudo su - postgres
psql -c "alter user postgres with encrypted password 'YOUR_POSTGRES_USER_PASSWORD'"
exit
exit
- Для внешнего подключения к БД Postgres Pro с помощью 'psql' используем команду:
psql --host=$VM_IP_ADDRESS --port=5433 --username=postgres --dbname=postgres
- Для внешнего подключения к БД Postgres Pro с помощью 'Pgadmin' при конфигурации сервера в меню ‘Pgadmin’ используем следующие параметры:
- ‘mydb-xx’ для ‘Name'
- ‘$VM_IP_ADDRESS’ для ‘Host’
- '5433' для ‘Port’
- ‘postgres’ для ‘Maintenance DB’
- ‘postgres’ для ‘Username’
Вместо ‘xx’ используем '01', '02', '03' и т.д.
Вместо ‘$VM_IP_ADDRESS’ используем public IP-адрес VM.
Внешнее подключение к серверу мониторинга БД
- Для подключения к серверу мониторинга БД устанавливаем пароль пользователя 'Admin':
ssh yc-user@$VM_IP_ADDRESS
sudo su - postgres
source .pgsql_profile
psql --dbname=zabbix --username=zabbix -c "update users set passwd=md5('YOUR_ZABBIX_ADMIN_PASSWORD') where alias='Admin'"
exit
exit
- Внешнее подключение к серверу мониторинга БД по ссылке:
Вместо ‘$VM_IP_ADDRESS’ используем public IP-адрес VM.
Изменение конфигурации VM
Рассмотрим варианты изменения конфигурации VM:
1) Необходимо изменить тип VM для увеличения вычислительной мощности VM
- Для автоматического изменения значений параметров БД Postgres Pro перед увеличением размера VM нужно удалить файл $PGDATA/postgresql.tune.lock:
ssh yc-user@$VM_IP_ADDRESS
sudo su - postgres
cp $PGDATA/postgresql.auto.conf $PGDATA/postgresql.auto.conf.ORIG
rm $PGDATA/postgresql.tune.lock
exit
exit
- Чтобы изменить тип VM, выполняем:
yc compute instances show $VM_NAME
yc compute instances stop $VM_NAME
yc compute instances update $VM_NAME \
--cores 4 \
--memory 4
yc compute instances start $VM_NAME
yc compute instances list
VM_IP_ADDRESS=$(yc compute instance show --name $VM_NAME | grep -E ' +address' | tail -n 1 | awk '{print $2}')
echo $VM_IP_ADDRESS
ssh yc-user@$VM_IP_ADDRESS
cat /proc/cpuinfo
cat /proc/meminfo
exit
2) Необходимо увеличить размер ОС-диска, например, до 80 ГБ
- Получаем информацию об ОС-диске:
yc compute disks show $VM_NAME-osdisk
- Временно останавливаем VM:
yc compute instances stop $VM_NAME
- Увеличиваем размер ОС-диска:
yc compute disks update $VM_NAME-osdisk \
--size 80
- Проверяем обновленную информацию об ОС-диске:
yc compute disks show $VM_NAME-osdisk
- Стартуем VM:
yc compute instances start $VM_NAME
- Подключаемся к VM:
yc compute instances list
VM_IP_ADDRESS=$(yc compute instance show --name $VM_NAME | grep -E ' +address' | tail -n 1 | awk '{print $2}')
echo $VM_IP_ADDRESS
ssh yc-user@$VM_IP_ADDRESS
df -h /
exit
3) Необходимо использовать выделенный диск для хранения файлов БД Postgres Pro, например, с целью повышения производительности
- Создаем новый диск размером 200 ГБ и подключаем его к VM:
yc compute disks create \
--name $VM_NAME-datadisk \
--size 200 \
--type network-hdd \
--async
yc compute disks list
yc compute instances attach-disk \
--name $VM_NAME \
--disk-name $VM_NAME-datadisk \
--async
yc compute disks list
- Подключаемся к VM:
ssh yc-user@$VM_IP_ADDRESS
- Останавливаем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl stop postgrespro-ent-14.service
sudo systemctl -l status postgrespro-ent-14.service
- Создаем точку монтирования новой файловой системы:
sudo mkdir /PGDATA
- С помощью утилиты 'fdisk' определяем имя устройства, назначенного новому диску (в нашем случае это /dev/vdb):
sudo fdisk -l
- На этом диске создаем один раздел максимального размера, на разделе создаем файловую систему:
(echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/vdb
sudo mkfs -t ext4 /dev/vdb1
- Для файловой системы раздела выделенного диска создаем запись в файле /etc/fstab и монтируем файловую систему:
sudo sh -c "echo '`sudo blkid -o export /dev/vdb1 | grep UUID` /PGDATA ext4 defaults,nofail,barrier=0 1 2' >> /etc/fstab"
sudo mount /PGDATA
- Создаем директорию 'data' на новой файловой системе и устанавливаем для нее необходимые разрешения:
sudo mkdir /PGDATA/data
sudo chown postgres:postgres /PGDATA/data
sudo chmod 0700 /PGDATA/data
- Переключаемся на пользователя ‘postgres’ и переносим файлы БД Postgres Pro на новую файловую систему:
sudo su - postgres
mv /var/lib/pgpro/ent-14/data/* /PGDATA/data; rmdir /var/lib/pgpro/ent-14/data; ln -s /PGDATA/data /var/lib/pgpro/ent-14/data
exit
- Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl start postgrespro-ent-14.service
sudo systemctl -l status postgrespro-ent-14.service
- Выполняем перезагрузку VM, проверяем автоматическое монтирование файловой системы и статус сервиса БД Postgres Pro:
sudo reboot
ssh yc-user@$VM_IP_ADDRESS
sudo mount | grep /PGDATA
sudo df -h /PGDATA
sudo systemctl -l status postgrespro-ent-14.service
Вместо ‘xx’ используем '01', '02', '03' и т.д.
4) Автоматический перезапуск сервиса базы данных в случае аварии
- Добавляем настройку автоматического перезапуска сервиса базы данных в конфигурационном файле systemd и перезапускаем сервис базы данных:
sudo sed -i '/KillSignal=/a Restart=on-failure' /usr/lib/systemd/system/postgrespro-ent-14.service
sudo systemctl daemon-reload
sudo systemctl restart postgrespro-ent-14.service
sudo systemctl -l status postgrespro-ent-14.service
Резервное копирование VM
Postgres Pro Enterprise Multimaster
Multimaster - это расширение Postgres Pro Enterprise, которое в сочетании с набором доработок ядра превращает Postgres Pro Enterprise в синхронный кластер без разделения ресурсов, обеспечивающий расширяемость OLTP для читающих транзакций, а также высокую доступность с автоматическим восстановлением после сбоев.
Более подробная информация о Multimaster доступна по ссылке:
https://postgrespro.ru/docs/enterprise/14/multimaster
Рассмотрим процесс установки и настройки трехузлового Multimaster. Далее будем использовать следующие названия узлов Multimaster: 'myvm-ent-01', 'myvm-ent-02' и 'myvm-ent-03'.
- Создаем три VM:
for i in `seq 1 3`; do
yc compute instance create \
--name myvm-ent-0$i \
--hostname myvm-ent-0$i \
--cores 2 \
--memory 4 \
--create-boot-disk name=myvm-ent-0$i-osdisk,image-folder-id=standard-images,image-family=$IMAGE_FAMILY \
--network-interface subnet-name=$NET-subnet,nat-ip-version=ipv4,ipv4-address=192.168.0.10$i \
--ssh-key ~/.ssh/id_rsa.pub \
--async
done
Назначение private IP-адресов: 192.168.0.101 (myvm-ent-01), 192.168.0.102 (myvm-ent-02), 192.168.0.103 (myvm-ent-03).
- Подключаемся ко всем трем VM:
for i in `seq 1 3`; do
export VM_IP_ADDRESS_0$i=$(yc compute instance show --name myvm-ent-0$i | grep -E ' +address' | tail -n 1 | awk '{print $2}')
done
ssh yc-user@$VM_IP_ADDRESS_01
ssh yc-user@$VM_IP_ADDRESS_02
ssh yc-user@$VM_IP_ADDRESS_03
- и выполняем одинаковый набор команд на каждой из них:
for i in `seq 1 3`; do
sudo sh -c "echo '192.168.0.10$i myvm-ent-0$i' >> /etc/hosts"
done
- Конфигурируем реплицируемую БД 'mydb':
sudo su - postgres
psql -c "create user myuser with superuser encrypted password 'myuserpassword'"
psql --username=myuser -c "create database mydb"
sed -i 's/PGDATABASE=postgres/PGDATABASE=mydb/' .pgpro_profile
sed -i 's/PGUSER=postgres/PGUSER=myuser/' .pgpro_profile
source .pgpro_profile
for i in `seq 1 3`; do
echo "hostssl replication myuser myvm-ent-0$i md5" >> $PGDATA/pg_hba.conf
echo "myvm-ent-0$i:5433:mydb:myuser:myuserpassword" >> ~/.pgpass
done
chmod 0600 ~/.pgpass
pg_ctl reload
echo "" >> $PGDATA/postgresql.conf
echo "" >> $PGDATA/postgresql.conf
echo "#------------------------------------------------------------------------------" >> $PGDATA/postgresql.conf
echo "# MULTIMASTER SETTINGS" >> $PGDATA/postgresql.conf
echo "#------------------------------------------------------------------------------" >> $PGDATA/postgresql.conf
echo "" >> $PGDATA/postgresql.conf
echo "multimaster.max_nodes = 3" >> $PGDATA/postgresql.conf
echo "" >> $PGDATA/postgresql.conf
echo "" >> $PGDATA/postgresql.conf
psql -c "alter system set default_transaction_isolation to 'read committed'"
psql -c "alter system set wal_level to logical"
psql -c "alter system set max_connections to 100"
psql -c "alter system set max_prepared_transactions to 300"
psql -c "alter system set max_wal_senders to 10"
psql -c "alter system set max_replication_slots to 10"
psql -c "alter system set max_worker_processes to 250"
psql -c "alter system set shared_preload_libraries to multimaster,pg_stat_statements,pg_buffercache,pg_wait_sampling"
psql -c "alter system set wal_sender_timeout to 0"
exit
- Конфигурируем агент mamonsu для БД 'mydb' и перезапускаем сервис mamonsu:
sudo sed -i 's|user = mamonsu|user = myuser|' /etc/mamonsu/agent.conf
sudo sed -i 's|database = mamonsu|database = mydb|' /etc/mamonsu/agent.conf
sudo systemctl restart mamonsu.service
- Перезапускаем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-ent-14.service
sudo systemctl -l status postgrespro-ent-14.service
exit
- Подключаемся к первой VM:
ssh yc-user@$VM_IP_ADDRESS_01
- и создаем расширение Multimaster:
sudo su - postgres
psql
create extension if not exists multimaster;
select mtm.init_cluster('dbname=mydb user=myuser host=myvm-ent-01 port=5433 sslmode=require','{"dbname=mydb user=myuser host=myvm-ent-02 port=5433 sslmode=require", "dbname=mydb user=myuser host=myvm-ent-03 port=5433 sslmode=require"}');
\q
- Создаем другие расширения для сервиса mamonsu:
psql -c "create extension if not exists pg_buffercache"
psql -c "create extension if not exists pg_stat_statements"
psql -c "create extension if not exists pg_wait_sampling"
- Проверяем, что все расширения были успешно созданы:
psql --host=myvm-ent-01 -c "select * from pg_extension"
psql --host=myvm-ent-02 -c "select * from pg_extension"
psql --host=myvm-ent-03 -c "select * from pg_extension"
- Конфигурируем mamonsu для Multimaster:
mamonsu bootstrap --dbname mydb --username postgres --host 127.0.0.1 --port 5433 --mamonsu-username=myuser
psql --host=myvm-ent-01 -c "select mtm.make_table_local('mamonsu_config')"
psql --host=myvm-ent-01 -c "select mtm.make_table_local('mamonsu_timestamp_master_2_7_1')"
- Для проверки состояния Multimaster используем следующие команды:
psql --host=myvm-ent-01 -x -c "select mtm.status()"
psql --host=myvm-ent-02 -x -c "select mtm.status()"
psql --host=myvm-ent-03 -x -c "select mtm.status()"
psql --host=myvm-ent-01 -x -c "select mtm.nodes()"
psql --host=myvm-ent-02 -x -c "select mtm.nodes()"
psql --host=myvm-ent-03 -x -c "select mtm.nodes()"
- Для возврата в интерфейс 'yc' дважды выполняем команду 'exit'
Внешнее подключение к БД Postgres Pro Enterprise Multimaster
Postgres Pro Enterprise Multimaster (2-х узловой кластер + голосующий узел)
3-х узловой Multimaster требует тройной объем дискового пространства для базы данных. Возможно использовать 2-х узловой Multimaster, назначив одному из узлов дополнительный голос на случай потери связи между узлами (multimaster.major_node=on), или, заменив один из узлов Multimaster на голосующий узел, требующий значительно меньший объем дискового пространства для базы данных.
Рассмотрим изменение конфигурации Multimaster из 3-х узлового в 2-х узловой кластер + голосующий узел.
- Исключаем узел 'myvm-ent-03' из конфигурации Multimaster, удаляем все настройки, связанные с Multimster на этом узле и меняем настройки Multimster на узлах 'myvm-ent-01' и 'myvm-ent-02':
sudo su - postgres
sed -i '/multimaster/d' $PGDATA/postgresql.conf
psql --host=myvm-ent-03 -c "alter system set shared_preload_libraries to pg_stat_statements,pg_buffercache,pg_wait_sampling"
psql --host=myvm-ent-01 -c "select mtm.drop_node(3)"
psql --host=myvm-ent-01 -x -c "select mtm.nodes()"
psql --host=myvm-ent-01 -c "alter system set multimaster.referee_connstring = 'dbname=mydb user=myuser host=myvm-ent-03 port=5433 sslmode=require'"
psql --host=myvm-ent-02 -c "alter system set multimaster.referee_connstring = 'dbname=mydb user=myuser host=myvm-ent-03 port=5433 sslmode=require'"
exit
sudo systemctl restart postgrespro-ent-14.service
sudo su - postgres
psql --host=myvm-ent-03 -c "drop extension multimaster"
psql --host=myvm-ent-03 -c "drop publication if exists multimaster"
psql --host=myvm-ent-03 -c "create extension referee"
exit
sudo systemctl restart postgrespro-ent-14.service
- Применяем новые настройки Multimster на узлах 'myvm-ent-01' и 'myvm-ent-02':
sudo systemctl restart postgrespro-ent-14.service
- Удаляем слоты репликации и завершаем конфигурацию настроек на узле 'myvm-ent-03':
sudo su - postgres
sed -i '/^#/!d' $PGDATA/postgresql.auto.conf
echo "shared_preload_libraries = 'pg_stat_statements, pg_buffercache, pg_wait_sampling'" >> $PGDATA/postgresql.auto.conf
psql --host=myvm-ent-03 -c "select pg_drop_replication_slot('mtm_slot_1')"
psql --host=myvm-ent-03 -c "select pg_drop_replication_slot('mtm_filter_slot_1')"
psql --host=myvm-ent-03 -c "select pg_drop_replication_slot('mtm_slot_2')"
psql --host=myvm-ent-03 -c "select pg_drop_replication_slot('mtm_filter_slot_2')"
psql --host=myvm-ent-03 -c "select pg_replication_origin_drop('mtm_slot_1')"
psql --host=myvm-ent-03 -c "select pg_replication_origin_drop('mtm_slot_2')"
exit
sudo systemctl restart postgrespro-ent-14.service
- Проверяем статус Multimaster на каждом узле:
sudo su - postgres
psql --dbname=mydb --username=myuser --host=myvm-ent-01 --port=5433 -x -c "select mtm.nodes()"
psql --dbname=mydb --username=myuser --host=myvm-ent-02 --port=5433 -x -c "select mtm.nodes()"
psql --dbname=mydb --username=myuser --host=myvm-ent-03 --port=5433 -c "select * from referee.decision"
exit
Postgres Pro Enterprise CFS (сжатая файловая система):
Для использования возможностей расширения Postgres Pro Enterprise CFS (сжатая файловая система) необходимо выполнить следующие действия.
- На файловой системе создаем директорию для табличного пространства 'cfs_ts' и табличное пространство 'cfs_ts' в базе данных:
sudo su - postgres
mkdir $PGDATA/../cfs_ts
chmod 0700 $PGDATA/../cfs_ts
psql -c "create tablespace cfs_ts location '/var/lib/pgpro/ent-14/cfs_ts' with (compression=true)"
exit
- Проверяем, что табличное пространство 'cfs_ts' создано с опцией 'compression=true' option:
sudo su - postgres
psql -c "select * from pg_tablespace"
exit
Используем табличное пространство 'cfs_ts' для новых объектов БД:
- При создании объекта БД:
sudo su - postgres
psql -c "create table t1 (t int) tablespace cfs_ts"
psql -c "select tablename, tablespace from pg_tables where schemaname = 'public'"
exit
- Установив табличное пространство по умолчанию для текущего подключения к БД:
sudo su - postgres
psql
set default_tablespace=cfs_ts;
show default_tablespace;
create table t2 (t int);
select tablename, tablespace from pg_tables where schemaname = 'public';
\q
exit
- Установив табличное пространство по умолчанию для БД:
sudo su - postgres
psql --dbname=postgres -c "alter database mydb set tablespace cfs_ts"
psql -c "select datname, dattablespace from pg_database"
exit
- Установив табличное пространство по умолчанию для пользователя/роли:
sudo su - postgres
psql --username=postgres -c "alter user myuser set default_tablespace to 'cfs_ts'"
psql -c "select usename, useconfig from pg_user"
psql -c "select rolname, rolconfig from pg_roles"
exit
Переносим существующие объекты БД из одного табличного пространства ('pg_default') в другое ('cfs_ts'):
- По одному:
sudo su - postgres
psql -c "create table t3 (t int)"
psql -c "alter table t3 set tablespace cfs_ts"
psql -c "select tablename, tablespace from pg_tables where schemaname = 'public'"
exit
- Все вместе:
sudo su - postgres
psql -c "alter table all in tablespace pg_default set tablespace cfs_ts"
psql -c "select tablename, tablespace from pg_tables where schemaname = 'public'"
exit
В зависимости от данных, хранимых в табличном пространстве 'cfs_ts', коэффициент сжатия может варьироваться.
Состав VM Postgres Pro Enterprise 10/11/12/13/14:
ОС - Linux Debian 10 (64-бит)
- учетная запись 'postgres'
- учетная запись 'zabbix'
- учетная запись 'mamonsu'
Размер ОС-диска - 10 ГБ
- файловая система xfs ‘/’ (/dev/vda1) - 10 ГБ
Основная БД Postgres Pro Enterprise
- версия БД: 10/11/12/13/14
- TCP-порт: 5433 (открыт на firewall)
- конфигурация: /var/lib/pgsql/.pgpro_profile
- учетная запись: 'postgres'
Мониторинг БД (сервер)
- версия zabbix-server: 4.x
- TCP-порты: 80/443 (открыт на firewall)
- учетная запись: 'Admin'
Мониторинг БД (агент)
- версия zabbix-agent: 4.x
- версия mamonsu-agent: 2.x
- конфигурация: /etc/mamonsu/agent.conf
Вспомогательная БД PostgreSQL (в качестве БД для zabbix-server)
- версия БД: 10/11/12/13/14
- TCP-порт: 5432
- конфигурация: /var/lib/pgsql/.pgsql_profile
- учетная запись: 'postgres'
Ссылки на документацию
- Postgres Pro Enterprise: https://postgrespro.ru/docs/enterprise
- Zabbix: https://www.zabbix.com/documentation
- Mamonsu: https://github.com/postgrespro/mamonsu/#mamonsu-monitoring-agent-for-postgresql
- Pgadmin: https://www.pgadmin.org/docs