Postgres Pro Standard в Alibaba Cloud
Руководство по созданию и использованию Postgres Pro Standard в Alibaba Cloud
Для использования БД Postgres Pro 9.6/10/11 в облаке Alibaba Cloud необходимо иметь доступ в Интернет и учетную запись в Alibaba Cloud.
Для установки используем образ виртуальной машины (VM) Postgres Pro 9.6/10/11, доступный в Alibaba Cloud Marketplace.
Требуемое ПО:
- 'aliyun-cli' 3.0 для управления облачными ресурсами в Alibaba Cloud
- 'psql' или 'Pgadmin' для доступа к БД
Используем кросс-платформенную утилиту 'aliyun-cli' 3.0.
Также можно использовать Alibaba Cloud Console https://home.console.aliyun.com/.
Установка 'aliyun-cli' 3.0 описана в https://github.com/aliyun/aliyun-cli?spm=a2c63.p38356.a3.1.2b094388i8mudh#installation
Документация 'aliyun-cli' 3.0 доступна на https://www.alibabacloud.com/help/doc-detail/66653.htm?spm=a2c63.p38356.b99.2.3e564020fHDYUD
Подключение к Alibaba Cloud и проверка окружения
- Подключаемся к Alibaba Cloud и выполняем конфигурацию окружения с помощью команды:
aliyun configure
- Проверяем установленную версию 'aliyun-cli' (рекомендуется последняя доступная версия):
aliyun --version | head -1
- Список географических регионов и зон доступности для размещения VM:
aliyun ecs DescribeRegions \
--output cols=RegionId rows=Regions.Region
RegionId=ap-southeast-1
echo $RegionId
aliyun ecs DescribeZones \
--RegionId $RegionId \
--output cols=ZoneId rows=Zones.Zone
ZoneId=ap-southeast-1a
echo $ZoneId
Далее будем использовать географический регион ‘ap-southeast-1’ и зону доступности 'ap-southeast-1a'.
- Список доступных размеров VM:
aliyun ecs DescribeInstanceTypes \
--output cols=InstanceTypeId,CpuCoreCount,MemorySize rows=InstanceTypes.InstanceType
InstanceTypeId=ecs.xn4.small
echo $InstanceTypeId
Далее будем использовать размер VM ‘ecs.xn4.small’.
- Получаем название образов VM Postgres Pro, доступных в Alibaba Cloud Marketplace:
for i in `seq 1 10`; do
aliyun ecs DescribeImages \
--RegionId $RegionId \
--output cols=ImageId,ImageName,Progress,Status rows=Images.Image \
--PageSize 100 \
--ImageOwnerAlias marketplace \
--PageNumber $i | grep 'Postgres Pro Standard'
done
Далее будем использовать идентификатор образа VM:
--- Postgres Pro Standard Database 9.6 (CentOS 7) 9.6.12.1
ImageId=m-t4nd1cy0175pblty1jf0
echo $ImageId
or
--- Postgres Pro Standard Database 10 (CentOS 7) 10.7.1
ImageId=m-t4nf34aaoe6kjtldkbjh
echo $ImageId
or
--- Postgres Pro Standard Database 11 (CentOS 7) 11.2.1
ImageId=m-t4n3svi6udc01oy5s4wa
echo $ImageId
Создание VM
- Создаем виртуальную сетевую инфраструктуру:
aliyun ecs CreateVpc \
--RegionId $RegionId \
--CidrBlock '192.168.0.0/16' \
--VpcName ppro-vpc \
--Description ppro-vpc
VpcId=$(aliyun ecs DescribeVpcs --RegionId $RegionId --output cols=VpcId rows=Vpcs.Vpc | grep '^vpc')
echo $VpcId
aliyun ecs CreateVSwitch \
--ZoneId $ZoneId \
--CidrBlock '192.168.0.0/24' \
--VpcId $VpcId \
--VSwitchName ppro-vsw \
--Description ppro-vsw
VSwitchId=$(aliyun ecs DescribeVSwitches --RegionId $RegionId --output cols=VSwitchId rows=VSwitches.VSwitch | grep '^vsw')
echo $VSwitchId
- Создаем и конфигурируем сетевую группу безопасности:
aliyun ecs CreateSecurityGroup \
--RegionId $RegionId \
--Description ppro-sg \
--SecurityGroupName ppro-sg \
--VpcId $VpcId
SecurityGroupId=$(aliyun ecs DescribeSecurityGroups --RegionId $RegionId --output cols=SecurityGroupId rows=SecurityGroups.SecurityGroup | grep '^sg')
echo $SecurityGroupId
aliyun ecs AuthorizeSecurityGroup \
--RegionId $RegionId \
--SecurityGroupId $SecurityGroupId \
--IpProtocol tcp \
--PortRange 22/22 \
--Policy accept \
--SourceCidrIp 0.0.0.0/0 \
--Priority 1 \
--Description ssh
- В директории ~/.ssh создаем пару private/public ssh-ключей и импортируем public ssh-ключ для подключения к VM:
ssh-keygen -t rsa -b 2048
KeyPairNameId=ppro-key
echo $KeyPairNameId
aliyun ecs ImportKeyPair \
--RegionId $RegionId \
--PublicKeyBody '...' \
--KeyPairName $KeyPairNameId
aliyun ecs DescribeKeyPairs \
--RegionId $RegionId \
--KeyPairName $KeyPairNameId
- Создаем VM из образа, доступного в Alibaba Cloud Marketplace:
InstanceNameId=myvm-std-xx
echo $InstanceNameId
aliyun ecs CreateInstance \
--RegionId $RegionId \
--ImageId $ImageId \
--InstanceType $InstanceTypeId \
--SecurityGroupId $SecurityGroupId \
--InstanceName $InstanceNameId \
--HostName $InstanceNameId \
--ZoneId $ZoneId \
--Description $InstanceNameId \
--InternetMaxBandwidthIn 1 \
--InternetMaxBandwidthOut 1 \
--VSwitchId $VSwitchId \
--InstanceChargeType PostPaid \
--IoOptimized optimized \
--SystemDisk.Category cloud_efficiency \
--SystemDisk.Size 40 \
--KeyPairName $KeyPairNameId \
--SecurityEnhancementStrategy active
- Присваиваем public IP-адрес VM и стартуем VM:
InstanceId=$(aliyun ecs DescribeInstances --RegionId $RegionId --output cols=InstanceId rows=Instances.Instance | grep '^i-')
echo $InstanceId
aliyun ecs AllocatePublicIpAddress \
--InstanceId $InstanceId
IpAddress=$(aliyun ecs DescribeInstances --RegionId $RegionId --output cols=PublicIpAddress.IpAddress rows=Instances.Instance | grep [0-9] | tr -d '[]')
echo $IpAddress
aliyun ecs StartInstance \
--InstanceId $InstanceId
aliyun ecs DescribeInstances \
--RegionId $RegionId \
--output cols=InstanceId,Status,InstanceName rows=Instances.Instance
Вместо ‘xx’ используем '01', '02', '03' и т.д.
Подключение к VM
В результате создается VM с public IP-адресом - $IpAddress.
- Подключаемся к VM с помощью private ssh-ключа:
ssh root@$IpAddress
Проверка статуса сервиса БД Postgres Pro
- Проверяем статус сервиса БД Postgres Pro:
sudo systemctl -l status postgrespro-9.6.service
или
sudo systemctl -l status postgrespro-std-10.service
или
sudo systemctl -l status postgrespro-std-11.service
- Чтобы остановить/стартовать сервис БД Postgres Pro используем команды:
sudo systemctl stop postgrespro-9.6.service
sudo systemctl start postgrespro-9.6.service
или
sudo systemctl stop postgrespro-std-10.service
sudo systemctl start postgrespro-std-10.service
или
sudo systemctl stop postgrespro-std-11.service
sudo systemctl start postgrespro-std-11.service
Подключение к БД Postgres Pro
- Переключаемся на пользователя ‘postgres’:
sudo su - postgres
- Для подключения к БД Postgres Pro используем команду:
psql
- Для выхода из ‘psql’ используем команду:
\q
- Для возврата в интерфейс 'aliyun-cli' 3.0 дважды выполняем команду 'exit'
Внешний доступ к VM
- При необходимости внешнего подключения к БД Postgres Pro открываем порт 5433:
aliyun ecs AuthorizeSecurityGroup \
--RegionId $RegionId \
--SecurityGroupId $SecurityGroupId \
--IpProtocol tcp \
--PortRange 5433/5433 \
--Policy accept \
--SourceCidrIp 0.0.0.0/0 \
--Priority 2 \
--Description postgres
- При необходимости внешнего подключения к серверу мониторинга БД открываем порты 80 и 443:
aliyun ecs AuthorizeSecurityGroup \
--RegionId $RegionId \
--SecurityGroupId $SecurityGroupId \
--IpProtocol tcp \
--PortRange 80/80 \
--Policy accept \
--SourceCidrIp 0.0.0.0/0 \
--Priority 3 \
--Description http
aliyun ecs AuthorizeSecurityGroup \
--RegionId $RegionId \
--SecurityGroupId $SecurityGroupId \
--IpProtocol tcp \
--PortRange 443/443 \
--Policy accept \
--SourceCidrIp 0.0.0.0/0 \
--Priority 4 \
--Description https
Внешнее подключение к БД Postgres Pro
- Для внешнего подключения к БД Postgres Pro устанавливаем пароль пользователя 'postgres':
ssh root@$IpAddress
sudo su - postgres
psql -c "alter user postgres with encrypted password 'YOUR_POSTGRES_USER_PASSWORD'"
exit
exit
- Для внешнего подключения к БД Postgres Pro с помощью 'psql' используем команду:
psql --host=$IpAddress --port=5433 --username=postgres --dbname=postgres
- Для внешнего подключения к БД Postgres Pro с помощью 'Pgadmin' при конфигурации сервера в меню ‘Pgadmin’ используем следующие параметры:
- ‘mydb-xx’ для ‘Name'
- ‘$IpAddress’ для ‘Host’
- '5433' для ‘Port’
- ‘postgres’ для ‘Maintenance DB’
- ‘postgres’ для ‘Username’
Вместо ‘xx’ используем '01', '02', '03' и т.д.
Вместо ‘$IpAddress’ используем public IP-адрес VM.
Внешнее подключение к серверу мониторинга БД
- Для подключения к серверу мониторинга БД устанавливаем пароль пользователя 'Admin':
ssh root@$IpAddress
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
- Внешнее подключение к серверу мониторинга БД по ссылке:
Вместо ‘$IpAddress’ используем public IP-адрес VM.
Изменение конфигурации VM
Рассмотрим варианты изменения конфигурации VM:
1) Необходимо изменить размер VM с ‘ecs.xn4.small’ на ‘ecs.n1.medium’ для увеличения вычислительной мощности VM
- Для автоматического изменения значений параметров БД Postgres Pro перед увеличением размера VM нужно удалить файл $PGDATA/postgresql.tune.lock:
ssh root@$IpAddress
sudo su - postgres
cp $PGDATA/postgresql.auto.conf $PGDATA/postgresql.auto.conf.ORIG
rm $PGDATA/postgresql.tune.lock
exit
exit
- Получаем список доступных размеров VM:
aliyun ecs DescribeInstanceTypes \
--output cols=InstanceTypeId,CpuCoreCount,MemorySize rows=InstanceTypes.InstanceType
- Чтобы изменить размер VM, выполняем:
aliyun ecs StopInstance \
--InstanceId $InstanceId
InstanceTypeId=ecs.n1.medium
echo $InstanceTypeId
aliyun ecs ModifyInstanceSpec \
--InstanceId $InstanceId \
--InstanceType $InstanceTypeId
aliyun ecs StartInstance \
--InstanceId $InstanceId
2) Необходимо увеличить размер ОС-диска, например, до 80 ГБ
- Получаем информацию об ОС-диске:
aliyun ecs DescribeDisks \
--RegionId $RegionId \
--DiskType=system \
--output cols=Type,Device,Size rows=Disks.Disk
- Временно останавливаем VM:
aliyun ecs StopInstance \
--InstanceId $InstanceId
- Увеличиваем размер ОС-диска:
DiskId=$(aliyun ecs DescribeDisks --RegionId $RegionId --DiskType=system --output cols=DiskId rows=Disks.Disk | grep '^d-')
echo $DiskId
aliyun ecs ResizeDisk \
--DiskId $DiskId \
--NewSize 80
- Проверяем обновленную информацию об ОС-диске:
aliyun ecs DescribeDisks \
--RegionId $RegionId \
--DiskType=system \
--output cols=Type,Device,Size rows=Disks.Disk
- Стартуем VM:
aliyun ecs StartInstance \
--InstanceId $InstanceId
- Подключаемся к VM:
ssh root@$IpAddress
- Увеличиваем размер раздела файловой системы ‘/’:
(echo d; echo 1; echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/vda
- Выполняем перезагрузку VM:
sudo reboot
- Подключаемся к VM:
ssh root@$IpAddress
- Увеличиваем размер файловой системы ‘/’:
sudo resize2fs /dev/vda1
- Выполняем перезагрузку VM:
sudo reboot
3) Необходимо использовать выделенный диск для хранения файлов БД Postgres Pro, например, с целью повышения производительности
- Создаем новый диск размером 200 ГБ и подключаем его к VM:
aliyun ecs CreateDisk \
--RegionId $RegionId \
--ZoneId $ZoneId \
--DiskName myvm-std-xx-datadisk \
--Description myvm-std-xx-datadisk \
--DiskCategory cloud_efficiency \
--Size 200
DiskId=$(aliyun ecs DescribeDisks --RegionId $RegionId --DiskType=data --output cols=DiskId rows=Disks.Disk | grep '^d-')
echo $DiskId
aliyun ecs AttachDisk \
--InstanceId $InstanceId \
--DiskId $DiskId
- Подключаемся к VM:
ssh root@$IpAddress
- Останавливаем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl stop postgrespro-9.6.service
sudo systemctl -l status postgrespro-9.6.service
или
sudo systemctl stop postgrespro-std-10.service
sudo systemctl -l status postgrespro-std-10.service
или
sudo systemctl stop postgrespro-std-11.service
sudo systemctl -l status postgrespro-std-11.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/9.6/data/* /PGDATA/data; rmdir /var/lib/pgpro/9.6/data; ln -s /PGDATA/data /var/lib/pgpro/9.6/data
или
mv /var/lib/pgpro/std-10/data/* /PGDATA/data; rmdir /var/lib/pgpro/std-10/data; ln -s /PGDATA/data /var/lib/pgpro/std-10/data
или
mv /var/lib/pgpro/std-11/data/* /PGDATA/data; rmdir /var/lib/pgpro/std-11/data; ln -s /PGDATA/data /var/lib/pgpro/std-11/data
exit
- Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl start postgrespro-9.6.service
sudo systemctl -l status postgrespro-9.6.service
или
sudo systemctl start postgrespro-std-10.service
sudo systemctl -l status postgrespro-std-10.service
или
sudo systemctl start postgrespro-std-11.service
sudo systemctl -l status postgrespro-std-11.service
- Выполняем перезагрузку VM, проверяем автоматическое монтирование файловой системы и статус сервиса БД Postgres Pro:
sudo reboot
ssh root@$IpAddress
sudo mount | grep /PGDATA
sudo df -h /PGDATA
sudo systemctl -l status postgrespro-9.6.service
или
sudo systemctl -l status postgrespro-std-10.service
или
sudo systemctl -l status postgrespro-std-11.service
Вместо ‘xx’ используем '01', '02', '03' и т.д.
4) Автоматический перезапуск сервиса базы данных в случае аварии
- Добавляем настройку автоматического перезапуска сервиса базы данных в конфигурационном файле systemd и перезапускаем сервис базы данных:
sudo sed -i '/KillSignal=/a Restart=on-failure' /usr/lib/systemd/system/postgrespro-9.6.service
sudo systemctl daemon-reload
sudo systemctl restart postgrespro-9.6.service
sudo systemctl -l status postgrespro-9.6.service
или
sudo sed -i '/KillSignal=/a Restart=on-failure' /usr/lib/systemd/system/postgrespro-std-10.service
sudo systemctl daemon-reload
sudo systemctl restart postgrespro-std-10.service
sudo systemctl -l status postgrespro-std-10.service
или
sudo sed -i '/KillSignal=/a Restart=on-failure' /usr/lib/systemd/system/postgrespro-std-11.service
sudo systemctl daemon-reload
sudo systemctl restart postgrespro-std-11.service
sudo systemctl -l status postgrespro-std-11.service
Резервное копирование VM
Состав VM Postgres Pro Standard 9.6/10/11:
ОС - Linux CentOS 7.x (64-бит)
- учетная запись 'postgres'
- учетная запись 'zabbix'
- учетная запись 'mamonsu'
Размер ОС-диска - 40 ГБ
- файловая система ext4 ‘/’ (/dev/vda1) - 40 ГБ
Основная БД Postgres Pro Standard
- версия БД: 9.6/10/11
- TCP-порт: 5433 (открыт на firewall)
- конфигурация: /var/lib/pgsql/.pgpro_profile
- учетная запись: 'postgres'
Мониторинг БД (сервер)
- версия zabbix-server: 3.4
- TCP-порты: 80/443 (открыт на firewall)
- учетная запись: 'Admin'
Мониторинг БД (агент)
- версия zabbix-agent: 3.4
- версия mamonsu-agent: 2.4.1
- конфигурация: /etc/mamonsu/agent.conf
Вспомогательная БД PostgreSQL (в качестве БД для zabbix-server)
- версия БД: 9.6/10/11
- TCP-порт: 5432
- конфигурация: /var/lib/pgsql/.pgsql_profile
- учетная запись: 'postgres'
Ссылки на документацию
- Postgres Pro Standard: https://postgrespro.ru/docs/postgrespro
- Zabbix: https://www.zabbix.com/documentation/3.4/start
- Mamonsu: https://github.com/postgrespro/mamonsu/#mamonsu-monitoring-agent-for-postgresql
- Pgadmin: https://www.pgadmin.org/docs