Postgres Pro Enterprise в Google Cloud

Руководство по созданию и использованию Postgres Pro Enterprise в Google Cloud

Для использования БД Postgres Pro 9.6/10/11 в облаке Google Cloud необходимо иметь доступ в Интернет и учетную запись в Google Cloud Platform (GCP).

Для установки используем образ виртуальной машины (VM) Postgres Pro 9.6/10/11, доступный в Google Cloud Marketplace.

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

  • Google Cloud SDK для управления облачными ресурсами в Google Cloud Platform
  • 'psql' или 'Pgadmin' для доступа к БД

Используем кросс-платформенную утилиту 'gcloud' в составе Google Cloud SDK.

Также можно использовать Google Cloud Console https://console.cloud.google.com

Установка Google Cloud SDK описана в https://cloud.google.com/sdk/install

Документация Google Cloud SDK доступна на https://cloud.google.com/sdk/


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

  • Подключаемся к Google Cloud Platform и выполняем конфигурацию окружения с помощью команды:
gcloud init
  • Проверяем установленную версию 'gcloud' (рекомендуется последняя доступная версия):
gcloud --version
  • Список географических регионов и зон доступности для размещения VM:
gcloud compute regions list
gcloud compute zones list

gcloud config set compute/region europe-north1
gcloud config set compute/zone europe-north1-a

gcloud compute project-info add-metadata \
--metadata google-compute-default-region=europe-north1,google-compute-default-zone=europe-north1-a

REGION=europe-north1
echo $REGION
ZONE=europe-north1-a
echo $ZONE

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

  • Список доступных типов VM и типов дисков:
gcloud compute machine-types list \
--filter="zone:(europe-north1-a)"

gcloud compute disk-types list \
--filter="zone:(europe-north1-a)"

Далее будем использовать тип VM ‘n1-standard-1’ и тип диска ‘pd-standard’.

  • Получаем название образов VM Postgres Pro, доступных в Google Cloud Marketplace:
gcloud compute images list | grep -E "(NAME|postgres-pro)"

Далее будем использовать идентификатор образа VM (PROJECT и FAMILY):

PROJECT=postgres-pro
echo $PROJECT

--- Postgres Pro Enterprise Database 9.6
FAMILY=ppro-ent96-centos7
echo $FAMILY
or
--- Postgres Pro Enterprise Database 10
FAMILY=ppro-ent10-centos7
echo $FAMILY
or
--- Postgres Pro Enterprise Database 11
FAMILY=ppro-ent11-centos7
echo $FAMILY


Создание VM

  • Используем 'auto mode default network':
gcloud compute networks list
gcloud compute routes list
gcloud compute firewall-rules list
  • В директории ~/.ssh создаем пару private/public ssh-ключей для подключения к VM:
ssh-keygen -t rsa -b 2048

ln -s ~/.ssh/id_rsa ~/.ssh/google_compute_engine
ln -s ~/.ssh/id_rsa.pub ~/.ssh/google_compute_engine.pub
  • Создаем VM из образа, доступного в Google Cloud Marketplace:
INSTANCE=myvm-ent-xx
echo $INSTANCE

gcloud compute instances create $INSTANCE \
--async \
--boot-disk-type=pd-standard \
--image-family=$FAMILY \
--image-project=$PROJECT \
--machine-type=n1-standard-1

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


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

  • Подключаемся к VM с помощью private ssh-ключа, используя public IP-адрес VM ($IpAddress):
gcloud compute instances list

gcloud compute ssh SYSTEM@$INSTANCE
или
IpAddress=$(gcloud compute instances list | grep $INSTANCE | awk '{print $5}')
echo $IpAddress
ssh SYSTEM@$IpAddress


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

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


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

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


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

  • При необходимости внешнего подключения к БД Postgres Pro открываем порт 5433: 
gcloud compute firewall-rules create ppro-allow-postgres \
--allow=tcp:5433 \
--description="Allow Postgres from anywhere" \
--direction=INGRESS \
--network=default \
--priority=1000
  • При необходимости внешнего подключения к серверу мониторинга БД открываем порты 80 и 443: 
gcloud compute firewall-rules create ppro-allow-http \
--allow=tcp:80 \
--description="Allow HTTP from anywhere" \
--direction=INGRESS \
--network=default \
--priority=1000

gcloud compute firewall-rules create ppro-allow-https \
--allow=tcp:443 \
--description="Allow HTTPS from anywhere" \
--direction=INGRESS \
--network=default \
--priority=1000


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

  • Для внешнего подключения к БД Postgres Pro устанавливаем пароль пользователя 'postgres':
gcloud compute ssh SYSTEM@$INSTANCE

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':
gcloud compute ssh SYSTEM@$INSTANCE

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://$IpAddress/zabbix

Вместо ‘$IpAddress’ используем public IP-адрес VM.


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

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

1) Необходимо изменить тип VM с ‘n1-standard-1’ на ‘n1-standard-2’ для увеличения вычислительной мощности VM

  • Для автоматического изменения значений параметров БД Postgres Pro перед увеличением размера VM нужно удалить файл $PGDATA/postgresql.tune.lock:
gcloud compute ssh SYSTEM@$INSTANCE

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

exit
  • Получаем список доступных типов VM:
gcloud compute machine-types list \
--filter="zone:(europe-north1-a)"
  • Чтобы изменить тип VM, выполняем: 
gcloud compute instances stop $INSTANCE

InstanceType=n1-standard-2
echo $InstanceType

gcloud compute instances set-machine-type $INSTANCE \
--machine-type $InstanceType

gcloud compute instances start $INSTANCE

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

  • Получаем информацию об ОС-диске: 
gcloud compute disks list | grep -E "(NAME|$INSTANCE)"
  • Временно останавливаем VM: 
gcloud compute instances stop $INSTANCE
  • Увеличиваем размер ОС-диска: 
echo "y" | gcloud compute disks resize $INSTANCE \
--size=80GB \
--zone=$ZONE
  • Проверяем обновленную информацию об ОС-диске: 
gcloud compute disks list | grep -E "(NAME|$INSTANCE)"
  • Стартуем VM: 
gcloud compute instances start $INSTANCE
  • Подключаемся к VM: 
gcloud compute ssh SYSTEM@$INSTANCE
  • Увеличиваем размер раздела файловой системы ‘/’:
(echo d; echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/sda
  • Выполняем перезагрузку VM:
sudo reboot
  • Подключаемся к VM: 
gcloud compute ssh SYSTEM@$INSTANCE
  • Увеличиваем размер файловой системы ‘/’:
sudo xfs_growfs -d /dev/sda1
  • Выполняем перезагрузку VM:
sudo reboot

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

  • Создаем новый диск размером 200 ГБ и подключаем его к VM:
gcloud compute disks create $INSTANCE-datadisk \
--size=200GB \
--type=pd-standard \
--zone=$ZONE

gcloud compute instances attach-disk $INSTANCE \
--disk $INSTANCE-datadisk
  • Подключаемся к VM:
gcloud compute ssh SYSTEM@$INSTANCE
  • Останавливаем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl stop postgrespro-enterprise-9.6.service
sudo systemctl -l status postgrespro-enterprise-9.6.service
или
sudo systemctl stop postgrespro-ent-10.service
sudo systemctl -l status postgrespro-ent-10.service
или
sudo systemctl stop postgrespro-ent-11.service
sudo systemctl -l status postgrespro-ent-11.service
  • Создаем точку монтирования новой файловой системы:
sudo mkdir /PGDATA
  • С помощью утилиты 'fdisk' определяем имя устройства, назначенного новому диску (в нашем случае это /dev/sdb):
sudo fdisk -l
  • На этом диске создаем один раздел максимального размера, на разделе создаем файловую систему:
(echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/sdb
sudo mkfs -t ext4 /dev/sdb1
  • Для файловой системы раздела выделенного диска создаем запись в файле /etc/fstab и монтируем файловую систему:
sudo sh -c "echo '`sudo blkid -o export /dev/sdb1 | 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/pgproee/9.6/data/* /PGDATA/data; rmdir /var/lib/pgproee/9.6/data; ln -s /PGDATA/data /var/lib/pgproee/9.6/data
или
mv /var/lib/pgpro/ent-10/data/* /PGDATA/data; rmdir /var/lib/pgpro/ent-10/data; ln -s /PGDATA/data /var/lib/pgpro/ent-10/data
или
mv /var/lib/pgpro/ent-11/data/* /PGDATA/data; rmdir /var/lib/pgpro/ent-11/data; ln -s /PGDATA/data /var/lib/pgpro/ent-11/data
exit
  • Стартуем сервис БД Postgres Pro и проверяем его статус:
sudo systemctl start postgrespro-enterprise-9.6.service
sudo systemctl -l status postgrespro-enterprise-9.6.service
или
sudo systemctl start postgrespro-ent-10.service
sudo systemctl -l status postgrespro-ent-10.service
или
sudo systemctl start postgrespro-ent-11.service
sudo systemctl -l status postgrespro-ent-11.service
  • Выполняем перезагрузку VM, проверяем автоматическое монтирование файловой системы и статус сервиса БД Postgres Pro:
sudo reboot

gcloud compute ssh SYSTEM@$INSTANCE

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

sudo systemctl -l status postgrespro-enterprise-9.6.service
или
sudo systemctl -l status postgrespro-ent-10.service
или
sudo systemctl -l status postgrespro-ent-11.service

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

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

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


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


Postgres Pro Enterprise Multimaster

Multimaster - это расширение Postgres Pro Enterprise, которое в сочетании с набором доработок ядра превращает Postgres Pro Enterprise в синхронный кластер без разделения ресурсов, обеспечивающий расширяемость OLTP для читающих транзакций, а также высокую доступность с автоматическим восстановлением после сбоев.

Более подробная информация о Multimaster доступна по ссылкам:

https://postgrespro.ru/docs/enterprise/9.6/multimaster.html

или

https://postgrespro.ru/docs/enterprise/10/multimaster

или

https://postgrespro.ru/docs/enterprise/11/multimaster

Рассмотрим процесс установки и настройки трехузлового Multimaster. Далее будем использовать следующие названия узлов Multimaster: 'myvm-ent-01', 'myvm-ent-02' и 'myvm-ent-03'.

  • Создаем три VM в разных зонах доступности 'europe-north1-a', 'europe-north1-b' и 'europe-north1-c':
array=(a b c); for i in `seq 1 3`; do
gcloud compute instances create myvm-ent-0$i \
--async \
--boot-disk-type=pd-standard \
--image-family=$FAMILY \
--image-project=$PROJECT \
--machine-type=n1-standard-1 \
--zone=europe-north1-"${array[$i-1]}" \
--private-network-ip=10.166.0.10$i
done

Назначение private IP-адресов: 10.166.0.101 (myvm-ent-01), 10.166.0.102 (myvm-ent-02), 10.166.0.103 (myvm-ent-03).

  • Подключаемся ко всем трем VM:
gcloud compute ssh SYSTEM@myvm-ent-01 --zone=europe-north1-a
gcloud compute ssh SYSTEM@myvm-ent-02 --zone=europe-north1-b
gcloud compute ssh SYSTEM@myvm-ent-03 --zone=europe-north1-c

или

for i in `seq 1 3`; do
export IpAddress_0$i=$(gcloud compute instances list | grep myvm-ent-0$i | awk '{print $5}')
done

ssh SYSTEM@$IpAddress_01
ssh SYSTEM@$IpAddress_02
ssh SYSTEM@$IpAddress_03
  • и выполняем одинаковый набор команд на каждой из них:
--- Postgres Pro Enterprise 9.6/10/11
for i in `seq 1 3`; do
sudo sh -c "echo '10.166.0.10$i myvm-ent-0$i' >> /etc/hosts"
done
  • Конфигурируем firewall для трафика Multimaster arbiter через TCP-порт '5555':
--- Postgres Pro Enterprise 9.6/10
sudo firewall-cmd --zone=public --add-port=5555/tcp
sudo firewall-cmd --zone=public --permanent --add-port=5555/tcp
sudo systemctl restart firewalld
  • Конфигурируем реплицируемую БД 'mydb':
--- Postgres Pro Enterprise 9.6/10/11
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

--- Postgres Pro Enterprise 9.6/10
node_id=`hostname | awk -F "-" '{ print substr($3,2,1) }'`
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.cluster_name = mymmts" >> $PGDATA/postgresql.conf
echo "multimaster.max_nodes = 3" >> $PGDATA/postgresql.conf
echo "multimaster.node_id = $node_id" >> $PGDATA/postgresql.conf
echo "multimaster.arbiter_port = 5555" >> $PGDATA/postgresql.conf
echo "multimaster.conn_strings = 'dbname=mydb user=myuser host=myvm-ent-01 port=5433 sslmode=require arbiter_port=5555,dbname=mydb user=myuser host=myvm-ent-02 port=5433 sslmode=require arbiter_port=5555,dbname=mydb user=myuser host=myvm-ent-03 port=5433 sslmode=require arbiter_port=5555'" >> $PGDATA/postgresql.conf
echo "" >> $PGDATA/postgresql.conf
echo "" >> $PGDATA/postgresql.conf

--- Postgres Pro Enterprise 11
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

--- Postgres Pro Enterprise 9.6/10/11
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"

--- Postgres Pro Enterprise 11
psql -c "alter system set wal_sender_timeout to 0"

--- Postgres Pro Enterprise 9.6/10/11
exit
  • Конфигурируем агент mamonsu для БД 'mydb' и перезапускаем сервис mamonsu:
--- Postgres Pro Enterprise 9.6/10/11
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 и проверяем его статус:
--- Postgres Pro Enterprise 9.6/10/11
sudo systemctl restart postgrespro-enterprise-9.6.service
sudo systemctl -l status postgrespro-enterprise-9.6.service
или
sudo systemctl restart postgrespro-ent-10.service
sudo systemctl -l status postgrespro-ent-10.service
или
sudo systemctl restart postgrespro-ent-11.service
sudo systemctl -l status postgrespro-ent-11.service

exit
  • Подключаемся к первой VM:
--- Postgres Pro Enterprise 9.6/10/11
gcloud compute ssh SYSTEM@myvm-ent-01 --zone=europe-north1-a
  • и создаем расширение Multimaster:
--- Postgres Pro Enterprise 9.6/10/11
sudo su - postgres
psql
create extension if not exists multimaster;

--- Postgres Pro Enterprise 11
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"}');

--- Postgres Pro Enterprise 9.6/10/11
\q
  • Создаем другие расширения для сервиса mamonsu:
--- Postgres Pro Enterprise 9.6/10/11
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"
  • Проверяем, что все расширения были успешно созданы:
--- Postgres Pro Enterprise 9.6/10/11
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:
--- Postgres Pro Enterprise 9.6/10/11
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_4_1')"
  • Для проверки состояния Multimaster используем следующие команды:
--- Postgres Pro Enterprise 9.6/10
psql --host=myvm-ent-01 -x -c "select mtm.collect_cluster_info()"
psql --host=myvm-ent-01 -x -c "select mtm.get_nodes_state()"

psql --host=myvm-ent-01 -x -c "select mtm.get_cluster_state()"
psql --host=myvm-ent-02 -x -c "select mtm.get_cluster_state()"
psql --host=myvm-ent-03 -x -c "select mtm.get_cluster_state()"

--- Postgres Pro Enterprise 11
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()"
  • Для возврата в интерфейс 'gcloud' дважды выполняем команду '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, на этом узле:
--- Postgres Pro Enterprise 9.6/10/11
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"

--- Postgres Pro Enterprise 9.6/10
psql --host=myvm-ent-01 -c "select mtm.stop_node(3, true)"
psql --host=myvm-ent-01 -x -c "select mtm.collect_cluster_info()"

--- Postgres Pro Enterprise 11
psql --host=myvm-ent-01 -c "select mtm.drop_node(3)"
psql --host=myvm-ent-01 -x -c "select mtm.nodes()"

--- Postgres Pro Enterprise 9.6/10/11
exit

sudo systemctl restart postgrespro-enterprise-9.6.service
или
sudo systemctl restart postgrespro-ent-10.service
или
sudo systemctl restart postgrespro-ent-11.service

sudo su - postgres
psql --host=myvm-ent-03 -c "drop extension multimaster"
psql --host=myvm-ent-03 -c "create extension referee"
exit

sudo systemctl restart postgrespro-enterprise-9.6.service
или
sudo systemctl restart postgrespro-ent-10.service
или
sudo systemctl restart postgrespro-ent-11.service
  • Меняем настройки Multimster на узле 'myvm-ent-01':
--- Postgres Pro Enterprise 9.6/10/11
sudo su - postgres
psql --host=myvm-ent-01 -c "alter system set multimaster.referee_connstring = 'dbname=mydb user=myuser host=myvm-ent-03 port=5433 sslmode=require'"

--- Postgres Pro Enterprise 9.6/10
psql --host=myvm-ent-01 -c "alter system set multimaster.conn_strings = 'dbname=mydb user=myuser host=myvm-ent-01 port=5433 sslmode=require arbiter_port=5555,dbname=mydb user=myuser host=myvm-ent-02 port=5433 sslmode=require arbiter_port=5555'"

--- Postgres Pro Enterprise 9.6/10/11
exit

sudo systemctl restart postgrespro-enterprise-9.6.service
или
sudo systemctl restart postgrespro-ent-10.service
или
sudo systemctl restart postgrespro-ent-11.service
  • и на узле 'myvm-ent-02':
--- Postgres Pro Enterprise 9.6/10/11
sudo su - postgres
psql --host=myvm-ent-02 -c "alter system set multimaster.referee_connstring = 'dbname=mydb user=myuser host=myvm-ent-03 port=5433 sslmode=require'"

--- Postgres Pro Enterprise 9.6/10
psql --host=myvm-ent-02 -c "alter system set multimaster.conn_strings = 'dbname=mydb user=myuser host=myvm-ent-01 port=5433 sslmode=require arbiter_port=5555,dbname=mydb user=myuser host=myvm-ent-02 port=5433 sslmode=require arbiter_port=5555'"

--- Postgres Pro Enterprise 9.6/10/11
exit

sudo systemctl restart postgrespro-enterprise-9.6.service
или
sudo systemctl restart postgrespro-ent-10.service
или
sudo systemctl restart postgrespro-ent-11.service
  • Удаляем слоты репликации и завершаем конфигурацию настроек на узле 'myvm-ent-03':
--- Postgres Pro Enterprise 9.6/10/11
sudo su - postgres

--- Postgres Pro Enterprise 9.6/10
psql --host=myvm-ent-03 -c "select * from pg_replication_slots"
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_slot_2')"
psql --host=myvm-ent-03 -c "select * from pg_replication_slots"

--- Postgres Pro Enterprise 9.6/10/11
sed -i '/^#/!d' $PGDATA/postgresql.auto.conf
echo "shared_preload_libraries = 'pg_stat_statements, pg_buffercache, pg_wait_sampling'" >> $PGDATA/postgresql.auto.conf
exit

sudo systemctl restart postgrespro-enterprise-9.6.service
или
sudo systemctl restart postgrespro-ent-10.service
или
sudo systemctl restart postgrespro-ent-11.service
  • Проверяем статус Multimaster на каждом узле:
--- Postgres Pro Enterprise 9.6/10/11
sudo su - postgres

--- Postgres Pro Enterprise 9.6/10
psql --dbname=mydb --username=myuser --host=myvm-ent-01 --port=5433 -c "select mtm.collect_cluster_info()"
psql --dbname=mydb --username=myuser --host=myvm-ent-02 --port=5433 -c "select mtm.collect_cluster_info()"

--- Postgres Pro Enterprise 11
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()"

--- Postgres Pro Enterprise 9.6/10/11
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/pgproee/9.6/cfs_ts' with (compression=true)"
или
psql -c "create tablespace cfs_ts location '/var/lib/pgpro/ent-10/cfs_ts' with (compression=true)"
или
psql -c "create tablespace cfs_ts location '/var/lib/pgpro/ent-11/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 9.6/10/11:

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

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

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

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

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

  • версия БД: 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'


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