Postgres Pro Standard в Microsoft Azure

Руководство по созданию и использованию Postgres Pro Standard (VM) в Microsoft Azure

Для использования БД Postgres Pro Standard (VM) в облаке Microsoft Azure необходимо иметь доступ в Интернет и учетную запись в Microsoft Azure.

Для установки используем образ виртуальной машины Postgres Pro Standard 9.5/9.6/10/11/12/13/14 доступный в Microsoft Azure Marketplace.

Требуемое ПО:

  • Azure CLI 2.x для управления облачными ресурсами в Azure
  • 'psql' или 'Pgadmin' для доступа к БД

Используем кросс-платформенную утилиту Azure CLI 2.x.

Также можно использовать Azure Portal https://portal.azure.com или Azure PowerShell.

Установка Azure CLI 2.x описана в https://docs.microsoft.com/ru-ru/cli/azure/install-azure-cli

Основные команды Azure CLI 2.x описаны в https://docs.microsoft.com/ru-ru/cli/azure/get-started-with-azure-cli

Полный список команд Azure CLI 2.x можно найти на https://docs.microsoft.com/ru-ru/cli/azure

Установка и администрирование Linux Virtual Machine в Azure описаны в https://docs.microsoft.com/ru-ru/azure/virtual-machines/linux

Резервное копирование в Azure описано в https://docs.microsoft.com/ru-ru/azure/backup


Подключение к Azure и проверка окружения

  • Подключаемся к Microsoft Azure с помощью команды:
az login

или

az login --username <myusername>
  • Для удобства устанавливаем табличный формат вывода команд Azure CLI 2.x:
az configure
  • Проверяем установленную версию Azure CLI 2.x (рекомендуется последняя доступная версия):
az --version | head -1
  • Проверяем, зарегистрированы ли необходимые сервисы - Microsoft.Storage, Microsoft.Compute и Microsoft.Network:
az provider show --namespace Microsoft.Storage
az provider show --namespace Microsoft.Compute
az provider show --namespace Microsoft.Network
  • Если нет, то регистрируем их:
az provider register --namespace Microsoft.Storage
az provider register --namespace Microsoft.Compute
az provider register --namespace Microsoft.Network
  • Список географических регионов для размещения VM:
az account list-locations

Далее будем использовать географический регион ‘northeurope’.

  • Список доступных размеров VM в географическом регионе ‘northeurope’:
az vm list-sizes --location northeurope

Далее будем использовать размер VM ‘Standard_DS1_v2’ (доступен для ‘Free Trial’ подписки).

  • Получаем название издателя образа VM Postgres Pro в Microsoft Azure Marketplace в географическом регионе ‘northeurope’:
az vm image list-publishers \
--location northeurope \
--query "[?starts_with(name,'postgres')].{Name:name}"

Далее будем использовать название издателя образа VM ‘postgres-pro’.

  • Получаем название образов VM Postgres Pro доступных в Microsoft Azure Marketplace от издателя ‘postgres-pro’ в географическом регионе ‘northeurope’:
az vm image list \
--publisher postgres-pro \
--location northeurope \
--all \
--query "[?contains(urn,'standard')].{Urn:urn}"
  • Далее будем использовать название образа VM:
urn_id='postgres-pro:postgres-pro-standard-95-vm:pgpro-std-95-centos7-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-96-vm:pgpro-std-96-centos7-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-10-vm:pgpro-std-10-centos7-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-11-vm:pgpro-std-11-centos7-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-12-vm:pgpro-std-12-centos7-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-13-vm:pgpro-std-13-centos7-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-14-vm:pgpro-std-14-centos7-x64-byol:latest'
  • Настраиваем программное развертывание VM:
az vm image terms accept --urn $urn_id
  • В директории ~/.ssh создаем пару private/public ssh-ключей для подключения к VM:
ssh-keygen -t rsa -b 2048


Создание VM

  • Создаем ресурсную группу:
az group create \
--name myresourcegroup \
--location northeurope
  • Создаем VM из образа доступного в Microsoft Azure Marketplace:
az vm create \
--name myvm-std-xx \
--resource-group myresourcegroup \
--image $urn_id \
--location northeurope \
--size Standard_DS1_v2 \
--ssh-key-value ~/.ssh/id_rsa.pub \
--admin-username azureuser \
--authentication-type ssh \
--public-ip-address-dns-name myvm-std-xx-dnsname \
--os-disk-name myvm-std-xx-osdisk

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Подключение к VM

В результате создается VM с полным доменным именем ‘myvm-std-xx-dnsname.northeurope.cloudapp.azure.com’ (полное доменное имя формируется из короткого доменного имени, задаваемого при создании VM, названия географического региона и ‘cloudapp.azure.com’) и с ОС-пользователем ‘azureuser’ (по умолчанию с правами ‘sudo’)

  • Подключаемся к VM:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Проверка статуса сервиса БД Postgres Pro

  • Проверяем статус сервиса БД Postgres Pro:
sudo systemctl -l status postgrespro-std-14.service
  • Чтобы остановить/стартовать сервис БД Postgres Pro используем команды:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl start postgrespro-std-14.service


Подключение к БД Postgres Pro

  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Для подключения к БД Postgres Pro используем команду:
psql
  • Для выхода из ‘psql’ используем команду:
\q
  • Для возврата в интерфейс Azure CLI 2.x дважды выполняем команду 'exit'


Внешний доступ к VM

  • При необходимости внешнего подключения к БД Postgres Pro открываем порт 5433:
az vm open-port \
--name myvm-std-xx \
--port 5433 \
--resource-group myresourcegroup \
--priority 1001
  • При необходимости внешнего подключения к серверу мониторинга БД открываем порты 80 и 443:
az vm open-port \
--name myvm-std-xx \
--port 80 \
--resource-group myresourcegroup \
--priority 1002

az vm open-port \
--name myvm-std-xx \
--port 443 \
--resource-group myresourcegroup \
--priority 1003

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Внешнее подключение к БД Postgres Pro

  • Для внешнего подключения к БД Postgres Pro устанавливаем пароль пользователя 'postgres':
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

sudo su - postgres
psql -c "alter user postgres with encrypted password 'YOUR_POSTGRES_USER_PASSWORD'"
exit

exit
  • Для внешнего подключения к БД Postgres Pro с помощью 'psql' используем команду:
psql --host=myvm-std-xx-dnsname.northeurope.cloudapp.azure.com --port=5433 --username=postgres --dbname=postgres
  • Для внешнего подключения к БД Postgres Pro с помощью 'Pgadmin' при конфигурации сервера в меню ‘Pgadmin’ используем следующие параметры:
    • ‘mydb-xx’ для ‘Name'
    • ‘myvm-std-xx-dnsname.northeurope.cloudapp.azure.com’ для ‘Host’
    • '5433' для ‘Port’
    • ‘postgres’ для ‘Maintenance DB’
    • ‘postgres’ для ‘Username’

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Внешнее подключение к серверу мониторинга БД

  • Для подключения к серверу мониторинга БД устанавливаем пароль пользователя 'Admin':
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

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
  • Внешнее подключение к серверу мониторинга БД по ссылке:

https://myvm-std-xx-dnsname.northeurope.cloudapp.azure.com/zabbix

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Изменение конфигурации VM

Рассмотрим варианты изменения конфигурации VM:

1) Необходимо изменить размер VM со ‘Standard_DS1_v2’ на ‘Standard_DS2_v2’ для увеличения вычислительной мощности VM

  • Для автоматического изменения значений параметров БД Postgres Pro перед увеличением размера VM нужно удалить файл $PGDATA/postgresql.tune.lock:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

sudo su - postgres
cp $PGDATA/postgresql.auto.conf $PGDATA/postgresql.auto.conf.ORIG
rm $PGDATA/postgresql.tune.lock
exit

exit
  • Получаем список доступных размеров VM в географическом регионе ‘northeurope’ (выполнять команду ‘az vm deallocate’ не требуется):
az vm list-vm-resize-options \
--name myvm-std-xx \
--resource-group myresourcegroup
  • Чтобы изменить размер VM, выполняем:
az vm resize \
--name myvm-std-xx \
--resource-group myresourcegroup \
--size Standard_DS2_v2

Вместо ‘xx’ используем '01', '02', '03' и т.д. 

2) Необходимо увеличить размер ОС-диска, например, до 80 ГБ

  • Получаем информацию об ОС-диске:
az disk list \
--resource-group myresourcegroup \
--query "[?starts_with(name,'myvm-std-xx-osdisk')].{Name:name,Gb:diskSizeGb}"
  • Временно отключаем VM:
az vm deallocate \
--name myvm-std-xx \
--resource-group myresourcegroup
  • Увеличиваем размер ОС-диска:
az disk update \
--name myvm-std-xx-osdisk \
--resource-group myresourcegroup \
--size-gb 80
  • Проверяем обновленную информацию об ОС-диске:
az disk list \
--resource-group myresourcegroup \
--query "[?starts_with(name,'myvm-std-xx-osdisk')].{Name:name,Gb:diskSizeGb}"
  • Стартуем VM:
az vm start \
--name myvm-std-xx \
--resource-group myresourcegroup
  • Подключаемся к VM:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com
  • Увеличиваем размер раздела файловой системы ‘/’:
(echo d; echo 2; echo n; echo p; echo 2; echo ; echo ; echo w) | sudo fdisk /dev/sda
  • Выполняем перезагрузку VM:
sudo reboot
  • Подключаемся к VM:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com
  • Увеличиваем размер файловой системы ‘/’:
sudo xfs_growfs -d /dev/sda2
  • Выполняем перезагрузку VM:
sudo reboot

Вместо ‘xx’ используем '01', '02', '03' и т.д. 

3) Необходимо использовать выделенный диск для хранения файлов БД Postgres Pro, например, с целью повышения производительности

  • Создаем новый диск размером 200 ГБ и подключаем его к VM:
az vm disk attach \
--disk myvm-std-xx-datadisk \
--resource-group myresourcegroup \
--vm-name myvm-std-xx \
--caching ReadOnly \
--lun 1 \
--new \
--size-gb 200
  • Подключаемся к VM:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com
  • Останавливаем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Создаем точку монтирования новой файловой системы:
sudo mkdir /PGDATA
  • С помощью утилиты 'lsscsi' определяем имя устройства, назначенного новому диску (в нашем случае это /dev/sdc):
lsscsi
  • На этом диске создаем один раздел максимального размера, на разделе создаем файловую систему:
(echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/sdc
sudo mkfs -t ext4 /dev/sdc1
  • Для файловой системы раздела выделенного диска создаем запись в файле /etc/fstab и монтируем файловую систему:
sudo sh -c "echo '`sudo blkid -o export /dev/sdc1 | 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/std-14/data/* /PGDATA/data; rmdir /var/lib/pgpro/std-14/data; ln -s /PGDATA/data /var/lib/pgpro/std-14/data
exit
  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl start postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Выполняем перезагрузку VM, проверяем автоматическое монтирование файловой системы и статус сервиса БД Postgres Pro:
sudo reboot

ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

sudo mount | grep /PGDATA
sudo df -h /PGDATA

sudo systemctl -l status postgrespro-std-14.service

Вместо ‘xx’ используем '01', '02', '03' и т.д.

4) Автоматический перезапуск сервиса базы данных в случае аварии

  • Добавляем настройку автоматического перезапуска сервиса базы данных в конфигурационном файле systemd и перезапускаем сервис базы данных:
sudo sed -i '/KillSignal=/a Restart=on-failure' /usr/lib/systemd/system/postgrespro-std-14.service
sudo systemctl daemon-reload
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service


Резервное копирование VM

Рассмотрим вариант резервного копирования VM в Azure (более подробная информация на https://docs.microsoft.com/ru-ru/azure/backup/quick-backup-vm-cli).

  • Сначала создадим хранилище для резервных копий VM:
az backup vault create \
--name myvault-std-xx \
--resource-group myresourcegroup \
--location northeurope

Далее будем использовать 'myvault-std-xx' для названия хранилища.

  • Для обеспечения надежности по умолчанию резервные копии VM хранятся в двух географических регионах. Если в этом нет необходимости, храним резервные копии в пределах одного региона:
az backup vault backup-properties set \
--name myvault-std-xx \
--resource-group myresourcegroup \
--backup-storage-redundancy LocallyRedundant
  • Для VM 'myvm-std-xx' назначаем политику резервного копирования по умолчанию с периодичностью выполнения копии VM раз в сутки:
az backup protection enable-for-vm \
--vm myvm-std-xx \
--vault-name myvault-std-xx \
--policy-name DefaultPolicy \
--resource-group myresourcegroup
  • Запускаем создание первой резервной копии VM в ручном режиме, указав срок хранения резервной копии VM в хранилище в формате 'дд-мм-гггг'. В качестве аргумента для параметров '--item-name' и '--container-name' используем название VM 'myvm-std-xx'.
az backup protection backup-now \
--item-name myvm-std-xx \
--container-name myvm-std-xx \
--vault-name myvault-std-xx \
--resource-group myresourcegroup \
--retain-until 31-12-2022
  • Информация о ходе выполнения резервного копирования:
az backup job list \
--vault-name myvault-std-xx \
--resource-group myresourcegroup
  • После успешного завершения резервного копирования VM используем резервную копию для восстановления диска VM, затем создадим VM из восстановленного диска. Для хранения восстановленных данных необходима учетная запись. Создадим ее, если она не существует:
az storage account create \
--name mystorageaccountstd \
--resource-group myresourcegroup \
--location northeurope \
--sku Standard_LRS

Далее будем использовать 'mystorageaccountstd' для названия учетной записи.

  • Для восстановления диска VM используем его самую последнюю доступную резервную копию:
rp_id=$(az backup recoverypoint list --item-name myvm-std-xx --container-name myvm-std-xx --vault-name myvault-std-xx --resource-group myresourcegroup --query [0].name --output tsv)

az backup restore restore-disks \
--item-name myvm-std-xx \
--container-name myvm-std-xx \
--vault-name myvault-std-xx \
--resource-group myresourcegroup \
--storage-account mystorageaccountstd \
--rp-name $rp_id
  • Информация о ходе выполнения восстановления:
az backup job list \
--vault-name myvault-std-xx \
--resource-group myresourcegroup
  • После успешного восстановления диска конвертируем его в формат managed disk:
container_id=$(az storage container list --account-name mystorageaccountstd --query [0].name -o tsv)
blob_id=$(az storage blob list --container-name $container_id --account-name mystorageaccountstd --query [0].name -o tsv)
uri_id=$(az storage blob url --name $blob_id --container-name $container_id --account-name mystorageaccountstd -o tsv)

az disk create \
--name myrestoredvm-std-xx-osdisk \
--resource-group myresourcegroup \
--source $uri_id
  • Создаем VM 'myrestoredvm-std-xx' из восстановленного диска:
az vm create \
--name myrestoredvm-std-xx \
--resource-group myresourcegroup \
--attach-os-disk myrestoredvm-std-xx-osdisk \
--location northeurope \
--size Standard_DS1_v2 \
--public-ip-address-dns-name myrestoredvm-std-xx-dnsname \
--os-type linux
  • Подключаемся к восстановленной VM:
ssh azureuser@myrestoredvm-std-xx-dnsname.northeurope.cloudapp.azure.com

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Резервное копирование БД Postgres Pro

Рассмотрим варианты резервного копирования БД Postgres Pro (более подробная информация на https://postgrespro.ru/docs/postgrespro/14/backup).

  • Подключаемся к VM:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

Убедимся, что Azure CLI 2.x установлена внутри VM (более подробная информация на https://docs.microsoft.com/ru-ru/cli/azure/install-azure-cli?view=azure-cli-latest).

  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Выполняем подключение к Microsoft Azure и настройку окружения с помощью команд:
az login

az configure

echo 'export backup_home=$HOME/backup' >> .pgpro_profile
echo 'export file_date=$(date +"%Y%m%d-%H%M%S")' >> .pgpro_profile
echo 'export db_name=testdb' >> .pgpro_profile
echo 'export instance_name=myinstancename' >> .pgpro_profile
  • Создаём контейнер хранения для резервных копий БД:
az storage account create \
--name mystorageaccountstd \
--resource-group myresourcegroup \
--location northeurope \
--sku Standard_LRS

az storage container create \
--name mydbbackup-std-xx \
--account-name mystorageaccountstd

exit

Далее будем использовать 'mydbbackup-std-xx' для названия контейнера хранения.

1) Логическое резервное копирование

1a) с помощью 'pg_dump'

  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Выполняем настройку окружения (в качестве примера используем временную базу данных):
rm -rf $backup_home
mkdir $backup_home

psql -c "create database $db_name"

for ((i=1;i<=3;i++)); do
psql --dbname $db_name -c "create table test_table_0$i(id numeric)"
psql --dbname $db_name -c "insert into test_table_0$i select * from generate_series(1, 5)"
psql --dbname $db_name -c "select * from test_table_0$i"
done

db_owner=$(psql -c "\l $db_name" | grep $db_name | awk '{print $3}')
dump_backup_file=dump_$db_name-backup-$file_date.gz
  • Создаём дамп временной базы данных:
pg_dump $db_name | gzip > $backup_home/$dump_backup_file

ls $backup_home/$dump_backup_file

gzip -ltv $backup_home/$dump_backup_file
  • Сохраняем файл дампа временной базы данных в контейнере хранения:
az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$dump_backup_file \
--name $dump_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx
  • Удаляем временную базу данных и файл дампа временной базы данных и восстанавливаем временную базу данных из контейнера хранения:
psql -c "drop database $db_name"

rm $backup_home/$dump_backup_file
ls $backup_home/$dump_backup_file

psql -c "create database $db_name"
psql -c "alter database $db_name owner to $db_owner"

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$dump_backup_file \
--name $dump_backup_file

ls $backup_home/$dump_backup_file

gzip -cdv $backup_home/$dump_backup_file | psql $db_name
  • Выполняем тестовый SQL-запрос к временной базе данных:
for ((i=1;i<=3;i++)); do
psql --dbname $db_name -c "select * from test_table_0$i"
done

exit

1b) с помощью 'pg_dumpall'

  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Выполняем настройку окружения (в качестве примера используем временную базу данных):
rm -rf $backup_home
mkdir $backup_home

psql -c "create database $db_name"

for ((i=1;i<=3;i++)); do
psql --dbname $db_name -c "create table test_table_0$i(id numeric)"
psql --dbname $db_name -c "insert into test_table_0$i select * from generate_series(1, 5)"
psql --dbname $db_name -c "select * from test_table_0$i"
done

dumpall_backup_file=dumpall-backup-$file_date.gz
  • Создаём дамп БД Postgres Pro:
pg_dumpall | gzip > $backup_home/$dumpall_backup_file

ls $backup_home/$dumpall_backup_file

gzip -ltv $backup_home/$dumpall_backup_file
  • Сохраняем файл дампа БД Postgres Pro в контейнере хранения:
az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$dumpall_backup_file \
--name $dumpall_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx
  • Удаляем временную базу данных и файл дампа БД Postgres Pro и восстанавливаем БД Postgres Pro из контейнера хранения:
psql -c "drop database $db_name"

rm $backup_home/$dumpall_backup_file
ls $backup_home/$dumpall_backup_file

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$dumpall_backup_file \
--name $dumpall_backup_file

ls $backup_home/$dumpall_backup_file

gzip -cdv $backup_home/$dumpall_backup_file | psql postgres
  • Выполняем тестовый SQL-запрос к временной базе данных:
for ((i=1;i<=3;i++)); do
psql --dbname $db_name -c "select * from test_table_0$i"
done

exit

2) Резервное копирование на уровне файлов

2a) с помощью 'tar'

  • Останавливаем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Выполняем настройку окружения:
rm -rf $backup_home
mkdir $backup_home

db_backup_file=db-backup-$file_date.tgz
  • Создаём резервную копию БД:
cd $PGDATA
tar -zcvf $backup_home/$db_backup_file *

ls $backup_home/$db_backup_file

tar -ztvf $backup_home/$db_backup_file
  • Сохраняем резервную копию БД в контейнере хранения:
az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$db_backup_file \
--name $db_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx
  • Удаляем файлы БД и файл резервной копии БД и восстанавливаем БД из контейнера хранения:
rm -rf $PGDATA/*
ls $PGDATA/

rm $backup_home/$db_backup_file
ls $backup_home/$db_backup_file

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$db_backup_file \
--name $db_backup_file

ls $backup_home/$db_backup_file

cd $PGDATA
tar -zxvf $backup_home/$db_backup_file

ls $PGDATA

exit
  • Стартуем сервис БД Postgres Pro, проверяем его статус и выполняем тестовый SQL-запрос к БД:
sudo systemctl start postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su -l postgres -c "psql -c \"select pgpro_version(), pgpro_edition(), pgpro_build()\""

2b) с помощью 'pg_basebackup'

  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Выполняем настройку окружения:
rm -rf $backup_home
mkdir $backup_home

db_backup_file=db-backup-$file_date.tgz
wal_backup_file=wal-backup-$file_date.tgz
  • Создаём резервные копии БД и файлов WAL:
pg_basebackup \
--pgdata=$backup_home \
--format=tar \
--wal-method=stream \
--gzip \
--checkpoint=fast \
--label=$file_date \
--progress \
--verbose

ls $backup_home/base.tar.gz
ls $backup_home/pg_wal.tar.gz

tar -ztvf $backup_home/base.tar.gz
tar -ztvf $backup_home/pg_wal.tar.gz
  • Сохраняем резервные копии БД и файлов WAL в контейнере хранения:
az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/base.tar.gz \
--name $db_backup_file

az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/pg_wal.tar.gz \
--name $wal_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx

exit
  • Останавливаем сервис БД Postgres Pro, удаляем файлы БД, файлы резервных копий БД и файлов WAL и восстанавливаем БД из контейнера хранения:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

rm -rf $PGDATA/*
ls $PGDATA/

rm -rf $backup_home
mkdir $backup_home

db_backup_file=$(az storage blob list --account-name mystorageaccountstd --container-name mydbbackup-std-xx | grep ^db-backup | tail -n 1 | awk {'print $1'})
wal_backup_file=$(az storage blob list --account-name mystorageaccountstd --container-name mydbbackup-std-xx | grep ^wal-backup | tail -n 1 | awk {'print $1'})

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$db_backup_file \
--name $db_backup_file

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$wal_backup_file \
--name $wal_backup_file

ls $backup_home/$db_backup_file
ls $backup_home/$wal_backup_file

cd $PGDATA
tar -zxvf $backup_home/$db_backup_file
cd $PGDATA/pg_wal
tar -zxvf $backup_home/$wal_backup_file

exit
  • Стартуем сервис БД Postgres Pro, проверяем его статус и выполняем тестовый SQL-запрос к БД:
sudo systemctl start postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su -l postgres -c "psql -c \"select pgpro_version(), pgpro_edition(), pgpro_build()\""

3) Непрерывное архивирование и восстановление на момент времени

3a) полное резервное копирование с помощью 'pg_basebackup'

  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Переключаем БД в режим архивирования файлов WAL:
psql -c "show archive_mode"
psql -c "show archive_command"

psql -c "alter system set archive_mode=on"
psql -c "alter system set archive_command='az storage blob upload --container-name mydbbackup-std-xx --account-name mystorageaccountstd --file %p --name %f'"

exit
  • Выполняем рестарт сервиса БД Postgres Pro, проверяем его статус и значение параметров 'archive_mode' и 'archive_command':
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

psql -c "show archive_mode"
psql -c "show archive_command"
  • Выполняем настройку окружения:
rm -rf $backup_home
mkdir $backup_home

db_backup_file=db-backup-$file_date.tgz
wal_backup_file=wal-backup-$file_date.tgz
  • Создаём резервные копии БД и файлов WAL:
pg_basebackup \
--pgdata=$backup_home \
--format=tar \
--wal-method=stream \
--gzip \
--checkpoint=fast \
--label=$file_date \
--progress \
--verbose

ls $backup_home/base.tar.gz
ls $backup_home/pg_wal.tar.gz

tar -ztvf $backup_home/base.tar.gz
tar -ztvf $backup_home/pg_wal.tar.gz
  • Сохраняем резервные копии БД и файлов WAL в контейнере хранения:
az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/base.tar.gz \
--name $db_backup_file

az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/pg_wal.tar.gz \
--name $wal_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx

exit
  • Останавливаем сервис БД Postgres Pro, удаляем файлы БД, файлы резервных копий БД и файлов WAL и восстанавливаем БД из контейнера хранения:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

rm -rf $PGDATA/*
ls $PGDATA/

rm -rf $backup_home
mkdir $backup_home

db_backup_file=$(az storage blob list --account-name mystorageaccountstd --container-name mydbbackup-std-xx | grep ^db-backup | tail -n 1 | awk {'print $1'})
wal_backup_file=$(az storage blob list --account-name mystorageaccountstd --container-name mydbbackup-std-xx | grep ^wal-backup | tail -n 1 | awk {'print $1'})

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$db_backup_file \
--name $db_backup_file

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $backup_home/$wal_backup_file \
--name $wal_backup_file

ls $backup_home/$db_backup_file
ls $backup_home/$wal_backup_file

cd $PGDATA
tar -zxvf $backup_home/$db_backup_file
cd $PGDATA/pg_wal
tar -zxvf $backup_home/$wal_backup_file

exit
  • Стартуем сервис БД Postgres Pro, проверяем его статус и выполняем тестовый SQL-запрос к БД:
sudo systemctl start postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su -l postgres -c "psql -c \"select pgpro_version(), pgpro_edition(), pgpro_build()\""

3b) полное резервное копирование с помощью 'pg_probackup'

  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Переключаем БД в режим архивирования файлов WAL:
psql -c "show archive_mode"
psql -c "show archive_command"

psql -c "alter system set archive_mode=on"
psql -c "alter system set archive_command='/opt/pgpro/std-14/bin/pg_probackup archive-push -B $backup_home --instance $instance_name --wal-file-path %p --wal-file-name %f'"

exit
  • Выполняем рестарт сервиса БД Postgres Pro, проверяем его статус и значение параметров 'archive_mode' и 'archive_command':
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

psql -c "show archive_mode"
psql -c "show archive_command"
  • Выполняем настройку окружения:
rm -rf $backup_home
mkdir $backup_home

db_backup_file=db-backup-$file_date.tgz

pg_probackup init -B $backup_home
pg_probackup add-instance -B $backup_home -D $PGDATA --instance $instance_name
pg_probackup show-config -B $backup_home --instance $instance_name
pg_probackup show -B $backup_home
  • Создаём полную резервную копию БД и резервную копию файлов WAL:
pg_probackup backup -B $backup_home --instance $instance_name -b FULL --progress
pg_probackup validate -B $backup_home --instance $instance_name
pg_probackup show -B $backup_home
  • Сохраняем резервные копии БД и файлов WAL в контейнере хранения:
cd $backup_home
tar -zcvf $HOME/$db_backup_file *

ls $HOME/$db_backup_file

tar -ztvf $HOME/$db_backup_file

az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $HOME/$db_backup_file \
--name $db_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx

exit
  • Останавливаем сервис БД Postgres Pro, удаляем файлы БД, файл резервных копий БД и файлов WAL и восстанавливаем БД из контейнера хранения:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

rm -rf $PGDATA/*
ls $PGDATA/

rm -rf $backup_home
mkdir $backup_home

db_backup_file=$(az storage blob list --account-name mystorageaccountstd --container-name mydbbackup-std-xx | grep ^db-backup | tail -n 1 | awk {'print $1'})

rm $HOME/$db_backup_file
ls $HOME/$db_backup_file

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $HOME/$db_backup_file \
--name $db_backup_file

ls $HOME/$db_backup_file

cd $backup_home
tar -zxvf $HOME/$db_backup_file

backup_id=$(pg_probackup show -B $backup_home | grep $instance_name | grep FULL | awk '{print $3}')
pg_probackup restore -B $backup_home -D $PGDATA --instance $instance_name -i $backup_id --progress

exit
  • Стартуем сервис БД Postgres Pro, проверяем его статус и выполняем тестовый SQL-запрос к БД:
sudo systemctl start postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su -l postgres -c "psql -c \"select pgpro_version(), pgpro_edition(), pgpro_build()\""

3c) инкрементальное резервное копирование с помощью 'pg_probackup'

  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service
  • Переключаемся на пользователя ‘postgres’:
sudo su - postgres
  • Переключаем БД в режим архивирования файлов WAL:
psql -c "show archive_mode"
psql -c "show archive_command"

psql -c "alter system set archive_mode=on"
psql -c "alter system set archive_command='/opt/pgpro/std-14/bin/pg_probackup archive-push -B $backup_home --instance $instance_name --wal-file-path %p --wal-file-name %f'"

exit
  • Выполняем рестарт сервиса БД Postgres Pro, проверяем его статус и значение параметров 'archive_mode' и 'archive_command':
sudo systemctl restart postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

psql -c "show archive_mode"
psql -c "show archive_command"
  • Выполняем настройку окружения (в качестве примера используем временную базу данных):
rm -rf $backup_home
mkdir $backup_home

db_backup_file=db-backup-$file_date.tgz

pg_probackup init -B $backup_home
pg_probackup add-instance -B $backup_home -D $PGDATA --instance $instance_name
pg_probackup show-config -B $backup_home --instance $instance_name
pg_probackup show -B $backup_home
  • Создаём полную резервную копию БД и резервную копию файлов WAL:
pg_probackup backup -B $backup_home --instance $instance_name -b FULL --progress
pg_probackup validate -B $backup_home --instance $instance_name
pg_probackup show -B $backup_home
  • Создаем временную базу данных:
psql -c "create database $db_name"

for ((i=1;i<=3;i++)); do
psql --dbname $db_name -c "create table test_table_0$i(id numeric)"
psql --dbname $db_name -c "insert into test_table_0$i select * from generate_series(1, 5)"
psql --dbname $db_name -c "select * from test_table_0$i"
done
  • Создаём инкрементальную резервную копию БД и резервную копию файлов WAL:
pg_probackup backup -B $backup_home --instance $instance_name -b PAGE --progress
pg_probackup validate -B $backup_home --instance $instance_name
pg_probackup show -B $backup_home
  • Сохраняем полную и инкрементальную резервные копии БД и резервную копию файлов WAL в контейнере хранения:
cd $backup_home
tar -zcvf $HOME/$db_backup_file *

ls $HOME/$db_backup_file

tar -ztvf $HOME/$db_backup_file

az storage blob upload \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $HOME/$db_backup_file \
--name $db_backup_file

az storage blob list \
--account-name mystorageaccountstd \
--container-name mydbbackup-std-xx

exit
  • Останавливаем сервис БД Postgres Pro, удаляем файлы БД, файл резервных копий БД и файлов WAL и восстанавливаем БД из контейнера хранения:
sudo systemctl stop postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

rm -rf $PGDATA/*
ls $PGDATA/

rm -rf $backup_home
mkdir $backup_home

db_backup_file=$(az storage blob list --account-name mystorageaccountstd --container-name mydbbackup-std-xx | grep ^db-backup | tail -n 1 | awk {'print $1'})

rm $HOME/$db_backup_file
ls $HOME/$db_backup_file

az storage blob download \
--container-name mydbbackup-std-xx \
--account-name mystorageaccountstd \
--file $HOME/$db_backup_file \
--name $db_backup_file

ls $HOME/$db_backup_file

cd $backup_home
tar -zxvf $HOME/$db_backup_file

backup_id=$(pg_probackup show -B $backup_home | grep $instance_name | grep PAGE | awk '{print $3}')
pg_probackup restore -B $backup_home -D $PGDATA --instance $instance_name -i $backup_id --progress

exit
  • Стартуем сервис БД Postgres Pro, проверяем его статус и выполняем тестовый SQL-запрос к временной базе данных:
sudo systemctl start postgrespro-std-14.service
sudo systemctl -l status postgrespro-std-14.service

sudo su - postgres

for ((i=1;i<=3;i++)); do
psql --dbname $db_name -c "select * from test_table_0$i"
done

exit

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Высокая доступность БД Postgres Pro

Рассмотрим варианты обеспечения высокой доступности БД Postgres Pro (более подробная информация на https://postgrespro.ru/docs/postgrespro/14/high-availability) на примере кластерного ПО Patroni (более подробная информация на https://github.com/zalando/patroni). Далее будем использовать следующие названия узлов кластера Patroni: 'myvm-std-01', 'myvm-std-02' и 'myvm-std-03'.

  • Создаем ресурсную группу 'myresourcegroup':
az group create \
--name myresourcegroup \
--location northeurope
az vm availability-set create \
--name myavailabilityset \
--resource-group myresourcegroup \
--platform-fault-domain-count 3 \
--platform-update-domain-count 3
  • Создаем виртуальную локальную сеть 'myvnet' 10.0.0.0/8 и подсеть 'myvnetsubnet' 10.0.0.0/24:
az network vnet create \
--name myvnet \
--location northeurope \
--resource-group myresourcegroup \
--subnet-name myvnetsubnet \
--subnet-prefix 10.0.0.0/24 \
--address-prefixes 10.0.0.0/8
  • Создаем группу безопасности сети 'mynsg':
az network nsg create \
--name mynsg \
--location northeurope \
--resource-group myresourcegroup
  • Для группы безопасности сети 'mynsg' настраиваем правила для соответствующих TCP-портов 22 (ssh), 5433 (Postgres) и 80/443 (http/https):
array=(AllowInboundSsh 22 1000 AllowInboundPostgresql 5433 1001 AllowInboundHttp 80 1002 AllowInboundHttps 443 1003); for i in `echo 0 3 6 9`; do
az network nsg rule create \
--name "${array[$i]}" \
--resource-group myresourcegroup \
--nsg-name mynsg \
--access Allow \
--direction Inbound \
--protocol Tcp \
--destination-port-range "${array[$i+1]}" \
--priority "${array[$i+2]}"
done
  • Создаем динамические public IP-адреса для всех трех VM:
for i in `seq 1 3`; do
az network public-ip create \
--name myvm-std-0$i-public-ip \
--location northeurope \
--resource-group myresourcegroup \
--dns-name myvm-std-0$i-dnsname \
--sku Basic \
--allocation-method Dynamic
done
  • Создаем сетевые интерфейсы для всех трех VM и назначаем им динамические public и статические private IP-адреса:
for i in `seq 1 3`; do
az network nic create \
--name myvm-std-0$i-nic \
--location northeurope \
--resource-group myresourcegroup \
--vnet-name myvnet \
--subnet myvnetsubnet \
--network-security-group mynsg \
--public-ip-address myvm-std-0$i-public-ip \
--private-ip-address 10.0.0.10$i
done

Назначение private IP-адресов: 10.0.0.101 (myvm-std-01), 10.0.0.102 (myvm-std-02), 10.0.0.103 (myvm-std-03).

  • Создаем три VM:
for i in `seq 1 3`; do
az vm create \
--name myvm-std-0$i \
--resource-group myresourcegroup \
--availability-set myavailabilityset \
--image $urn_id \
--location northeurope \
--size Standard_DS1_v2 \
--ssh-key-value ~/.ssh/id_rsa.pub \
--admin-username azureuser \
--authentication-type ssh \
--nics myvm-std-0$i-nic \
--public-ip-sku Basic \
--os-disk-name myvm-std-0$i-osdisk
done
  • Подключаемся ко всем трем VM и выполняем одинаковый набор команд на каждой из них:
ssh azureuser@myvm-std-01-dnsname.northeurope.cloudapp.azure.com
ssh azureuser@myvm-std-02-dnsname.northeurope.cloudapp.azure.com
ssh azureuser@myvm-std-03-dnsname.northeurope.cloudapp.azure.com
  • Конфигурируем сервисы БД Postgres Pro, Consul, haproxy и Patroni:
sudo systemctl disable postgrespro-std-14.service

sudo sh -c "echo '' >> /etc/hosts"
for i in `seq 1 3`; do
sudo sh -c "echo '10.0.0.10$i myvm-std-0$i' >> /etc/hosts"
done

sudo sed -i "/retry_join/s|\[\]|\[\"myvm-std-01\", \"myvm-std-02\", \"myvm-std-03\"\]|" /etc/consul.d/consul.hcl
sudo sed -i "s|# retry_join|retry_join|" /etc/consul.d/consul.hcl

sudo systemctl daemon-reload; sudo systemctl enable consul.service; sudo systemctl start consul.service; sudo systemctl -l status consul.service

for i in `seq 1 3`; do
sudo sh -c "echo ' server myvm-std-0$i 10.0.0.10$i:5433 maxconn 100 check port 8008' >> /etc/haproxy/haproxy.cfg"
done

sudo systemctl daemon-reload; sudo systemctl enable haproxy; sudo systemctl start haproxy; sudo systemctl -l status haproxy

sudo sed -i "s|# name:|name: $HOSTNAME|" /etc/patroni/config.yml
sudo sed -i "/connect_address/s|127.0.0.1|`hostname -i`|" /etc/patroni/config.yml
  • На первой VM выполняем следующие команды:
sudo su - postgres

psql -c "alter system set wal_level to 'replica'"
psql -c "alter system set hot_standby to 'on'"
psql -c "alter system set wal_keep_segments to '8'"
psql -c "alter system set max_wal_senders to '5'"
psql -c "alter system set max_replication_slots to '5'"
psql -c "alter system set checkpoint_timeout to '30'"

psql -c "create user patroni_replicator with replication encrypted password 'replicatorpassword'"
psql -c "create user patroni_superuser with superuser encrypted password 'superuserpassword'"

for i in `seq 1 3`; do
sed -i "/^host all.*md5/i host replication patroni_replicator myvm-std-0$i md5" $PGDATA/pg_hba.conf
done

for i in `seq 1 3`; do
echo "myvm-std-0$i:5433:replication:patroni_replicator:replicatorpassword" >> ~/.pgpass
done
chmod 0600 ~/.pgpass

exit

sudo systemctl restart postgrespro-std-14.service
  • На второй и третьей VM выполняем следующие команды:
sudo systemctl stop postgrespro-std-14.service

sudo su - postgres

rm -rf $PGDATA/*

for i in `seq 1 3`; do
echo "myvm-std-0$i:5433:replication:patroni_replicator:replicatorpassword" >> ~/.pgpass
done
chmod 0600 ~/.pgpass

exit
  • На первой VM стартуем сервис Patroni:
sudo systemctl daemon-reload; sudo systemctl enable patroni.service; sudo systemctl start patroni.service; sudo systemctl -l status patroni.service
sudo patronictl -c /etc/patroni/config.yml restart mypatroni myvm-std-01
  • На второй и третьей VM стартуем сервис Patroni:
sudo systemctl daemon-reload; sudo systemctl enable patroni.service; sudo systemctl start patroni.service; sudo systemctl -l status patroni.service
  • Для проверки состояния кластера Patroni и БД Postgres Pro следующие команды:
sudo patronictl -c /etc/patroni/config.yml list

psql 'postgres://patroni_superuser:superuserpassword@myvm-std-01:5000/postgres' -x -c 'table pg_stat_replication'
psql 'postgres://patroni_superuser:superuserpassword@myvm-std-02:5000/postgres' -x -c 'table pg_stat_replication'
psql 'postgres://patroni_superuser:superuserpassword@myvm-std-03:5000/postgres' -x -c 'table pg_stat_replication'
  • Для возврата в интерфейс Azure CLI 2.x дважды выполняем команду 'exit'


Состав Postgres Pro Standard (VM):

ОС - Linux CentOS 7.x (64-бит)

  • учетная запись 'postgres'
  • учетная запись 'zabbix'
  • учетная запись 'mamonsu'

Размер ОС-диска - 30 ГБ

  • файловая система xfs ‘/boot’ (/dev/sda1) - 1 ГБ
  • файловая система xfs ‘/’ (/dev/sda2) - 29 ГБ

Основная БД Postgres Pro Standard

  • версия БД: 9.5/9.6/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 Standard (Docker) в Microsoft Azure

Для установики используем Docker образ Postgres Pro Standard 9.5/9.6/10/11/12/13/14 в виртуальной машине Microsoft Azure.

См. Руководство по созданию и использованию Postgres Pro Standard (VM) в Microsoft Azure для подключения к Microsoft Azure.


Подключение к Azure и проверка окружения

  • Список географических регионов для размещения VM:
az account list-locations

Далее будем использовать географический регион ‘northeurope’.

  • Список доступных размеров VM в географическом регионе ‘northeurope’:
az vm list-sizes --location northeurope

Далее будем использовать размер VM ‘Standard_DS1_v2’ (доступен для ‘Free Trial’ подписки).

  • Получаем название издателя образа VM Postgres Pro в Microsoft Azure Marketplace в географическом регионе ‘northeurope’:
az vm image list-publishers \
--location northeurope \
--query "[?starts_with(name,'postgres')].{Name:name}"

Далее будем использовать название издателя образа VM ‘postgres-pro’.

  • Получаем название образов VM Postgres Pro, доступных в Microsoft Azure Marketplace от издателя ‘postgres-pro’ в географическом регионе ‘northeurope’:
az vm image list \
--publisher postgres-pro \
--location northeurope \
--all \
--query "[?contains(urn,'vm-docker')].{Urn:urn}"
  • Далее будем использовать название образа VM:
urn_id='postgres-pro:postgres-pro-standard-95-vm-docker:pgpro-std-95-vm-docker-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-96-vm-docker:pgpro-std-96-vm-docker-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-10-vm-docker:pgpro-std-10-vm-docker-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-11-vm-docker:pgpro-std-11-vm-docker-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-12-vm-docker:pgpro-std-12-vm-docker-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-13-vm-docker:pgpro-std-13-vm-docker-x64-byol:latest'
или
urn_id='postgres-pro:postgres-pro-standard-14-vm-docker:pgpro-std-14-vm-docker-x64-byol:latest'
  • Настраиваем программное развертывание VM:
az vm image terms accept --urn $urn_id
  • В директории ~/.ssh создаем пару private/public ssh-ключей для подключения к VM:
ssh-keygen -t rsa -b 2048


Создание VM

  • Создаем ресурсную группу:
az group create \
--name myresourcegroup \
--location northeurope
  • Создаем VM из образа, доступного в Microsoft Azure Marketplace:
az vm create \
--name myvm-std-xx \
--resource-group myresourcegroup \
--image $urn_id \
--location northeurope \
--size Standard_DS1_v2 \
--ssh-key-value ~/.ssh/id_rsa.pub \
--admin-username azureuser \
--authentication-type ssh \
--public-ip-address-dns-name myvm-std-xx-dnsname \
--os-disk-name myvm-std-xx-osdisk

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Подключение к VM

В результате создается VM с полным доменным именем ‘myvm-std-xx-dnsname.northeurope.cloudapp.azure.com’ (полное доменное имя формируется из короткого доменного имени, задаваемого при создании VM, названия географического региона и ‘cloudapp.azure.com’) и с ОС-пользователем ‘azureuser’ (по умолчанию с правами ‘sudo’)

  • Подключаемся к VM:
ssh azureuser@myvm-std-xx-dnsname.northeurope.cloudapp.azure.com

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Проверка статуса сервиса Docker, списка образов и запуск контейнера

  • Проверяем статус сервиса Docker и список доступных образов:
sudo systemctl -l status docker.service

sudo docker images
  • Чтобы остановить/стартовать сервис Docker используем команды:
sudo systemctl stop docker.service
sudo systemctl start docker.service
  • Для запуска контейнера используем следующие команды:
image_id=$(sudo docker images --format "{{.Repository}}" --filter "reference=pgpro*")
tag_id=$(sudo docker images --format "{{.Tag}}" --filter "reference=pgpro*")

sudo docker run --rm --detach --env PGPRO_SUPERUSER_PASSWORD=azure --publish 5433:5433 --name $image_id $image_id:$tag_id
sudo docker ps -a
  • Чтобы остановить контейнеры используем следующие команды:
sudo docker ps -qa
sudo docker stop $(sudo docker ps -qa)
sudo docker ps -qa


Подключение к БД Postgres Pro

  • Для подключения к БД Postgres Pro используем команду:
psql --dbname=postgres --username=postgres --host=localhost --port=5433
  • Для выхода из ‘psql’ используем команду:
\q
  • Для возврата в интерфейс Azure CLI 2.x выполняем команду 'exit'


Внешний доступ к VM

  • При необходимости внешнего подключения к БД Postgres Pro открываем порт 5433:
az vm open-port \
--name myvm-std-xx \
--port 5433 \
--resource-group myresourcegroup \
--priority 1001

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Внешнее подключение к БД Postgres Pro

  • Для внешнего подключения к БД Postgres Pro с помощью ‘psql’ используем команду:
psql --host=myvm-std-xx-dnsname.northeurope.cloudapp.azure.com --port=5433 --username=postgres --dbname=postgres
  • Для внешнего подключения к БД Postgres Pro с помощью ‘Pgadmin’ при конфигурации сервера в меню ‘Pgadmin’ используем следующие параметры:
    • ‘mydb-xx’ для ‘Name’
    • ‘myvm-std-xx-dnsname.northeurope.cloudapp.azure.com’ для ‘Host’
    • ‘5433’ для ‘Port’
    • ‘postgres’ для ‘Maintenance DB’
    • ‘postgres’ для ‘Username’

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Изменение конфигурации VM

См. Изменение конфигурации VM для изменения конфигурации VM.


Резервное копирование VM

См. Резервное копирование VM для резервного копирования VM.


Резервное копирование БД Postgres Pro

См. Резервное копирование БД Postgres Pro для резервного копирования БД Postgres Pro.


Состав Postgres Pro Standard (Docker):

ОС - Linux Debian 10.x (64-бит)

  • Docker образ - pgpro-std95/96/10/11/12/13/14-debian-x64:95.x.x/96.x.x/10.x.x/11.x.x/12.x.x/13.x.x/14.x.x

Размер ОС-диска - 30 ГБ

  • файловая система xfs ‘/boot’ (/dev/sda1) - 1 ГБ
  • файловая система xfs ‘/’ (/dev/sda2) - 29 ГБ

БД - Postgres Pro Standard

  • версия БД: 9.5/9.6/10/11/12/13/14
  • TCP-порт: 5433 (открыт на firewall)
  • конфигурация: /var/lib/pgsql/.pgpro_profile
  • учетная запись: ’postgres’


Ссылки на документацию


Руководство по созданию и использованию Postgres Pro Standard (Container) в Microsoft Azure

Для установики используем Docker образ Postgres Pro Standard 9.5/9.6/10/11/12/13/14 в Azure Container Registry (ACR).

См. Руководство по созданию и использованию Postgres Pro Standard (VM) в Microsoft Azure для подключения к Microsoft Azure.


Подключение к Azure и проверка окружения

После получения образа контейнера в Azure Marketplace с помощью браузера, используем Azure CLI для доступа к Postgres Pro Standard 9.5/9.6/10/11/12/13/14 в ACI (Azure Container Instances) контейнере или в контейнере Azure Kubernetes Service (AKS) кластера:

  • Проверяем переменные окружения:
RG - название ресурсной группы
ACR - название ACR
TAG - метка образа контейнера
CG - название контейнерной группы
PASS - пароль пользователя 'postgres'
CLUSTER - название AKS кластера
DEPLOYMENT - название deployment в AKS кластере
  • Подключаемся к ACR:
az acr list --resource-group $RG

az acr login --name $ACR

LOGINSERVER=$(az acr show -n $ACR --query loginServer -o tsv)

USERNAME=$(az acr credential show -n $ACR --query "username" -o tsv)

PASSWORD=$(az acr credential show -n $ACR --query "passwords[0].value" -o tsv)

IMAGE=pgpro-std95-debian-x64
или
IMAGE=pgpro-std96-debian-x64
или
IMAGE=pgpro-std10-debian-x64
или
IMAGE=pgpro-std11-debian-x64
или
IMAGE=pgpro-std12-debian-x64
или
IMAGE=pgpro-std13-debian-x64
или
IMAGE=pgpro-std14-debian-x64


Создание контейнера

  • Создаем ACI контейнер и проверяем его статус:
az container create -g $RG -f https://pgpro.blob.core.windows.net/yaml/pgpro-azure-container.yaml

az container list --resource-group $RG
  • или создаём контейнер в AKS кластере и проверяем его статус:
az aks create -g $RG -n $CLUSTER --attach-acr $ACR

az aks get-credentials -g $RG -n $CLUSTER --overwrite-existing

kubectl apply -f https://pgpro.blob.core.windows.net/yaml/pgpro-aks-deployment.yaml

kubectl apply -f https://pgpro.blob.core.windows.net/yaml/pgpro-aks-service.yaml

kubectl get all


Подключение к БД Postgres Pro

  • Для подключения к БД Postgres Pro в ACI контейнере:
az container exec \
--resource-group $RG \
--name $CG \
--exec-command "/bin/bash"

psql
  • или в контейнере AKS кластера:
kubectl exec --stdin --tty $(kubectl get pods --no-headers | awk '{print $1}') -- /bin/bash

psql


Внешнее подключение к БД Postgres Pro

  • Получаем внешний IP-адрес для подключения к ACI контейнеру или к контейнеру AKS кластера:
external_ip=$(az container show -g $RG -n $CG --query "{FQDN:ipAddress.fqdn}" -o tsv)
или
external_ip=$(kubectl get services $DEPLOYMENT -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
  • Для внешнего подключения к БД Postgres Pro с помощью ‘psql’ используем команду:
psql --dbname=postgres --username=postgres --host=$external_ip --port=5433
  • Для внешнего подключения к БД Postgres Pro с помощью ‘Pgadmin’ при конфигурации сервера в меню ‘Pgadmin’ используем следующие параметры:
    • ‘mydb-xx’ для ‘Name’
    • ‘$external_ip’ для ‘Host’
    • ‘5433’ для ‘Port’
    • ‘postgres’ для ‘Maintenance DB’
    • ‘postgres’ для ‘Username’

Вместо ‘xx’ используем '01', '02', '03' и т.д.


Состав Postgres Pro Standard (Container):

ОС - Linux Debian 9.x/10.x/11.x (64-bit)

  • Docker образ - pgpro-std95/96/10/11/12/13/14-debian-x64:95.x.x/96.x.x/10.x.x/11.x.x/12.x.x/13.x.x/14.x.x

БД - Postgres Pro Standard

  • версия БД: 9.5/9.6/10/11/12/13/14
  • TCP-порт: 5433 (открыт на firewall)
  • конфигурация: /var/lib/pgsql/.pgpro_profile
  • учетная запись: ’postgres’


Ссылки на документацию