PostgreSQL в Azure. Частина 1

Цією статтею ми починаємо цикл заміток про використання PostgreSQL, Microsoft Azure.
Перша стаття буде про встановлення та налаштування кластера PostgreSQL:
  • Знайомство з ресурсами Azure
  • Управління через azure cli
  • Вибір відповідного сховища
  • Збірка класичної зв'язки ведучий-ведений в одній групі доступності

Завдання цієї частини — реалізувати схему, що включає такі компоненти, ресурси Azure:
Принципова схема
ми будемо Робити це за допомогою azure cli. Ви можете не встановлювати azure-cli і зробити все через веб-інтерфейс portal.azure.com, але управління і створення через cli мені здалося більш наочним.
Утиліта azure cli платформна і працює скрізь, де можна працює nodejs. Встановити її під linux можна так:
# dnf install npm || apt-get install npm
NPM_CONFIG_PREFIX=~/.npm-global npm install -g 'git://github.com/Azure/azure-xplat-cli.git#v0.9.20-April2016'
echo 'NPM_PACKAGES="$HOME/.npm-global"' >> ~/.bash_profile
echo 'export PATH="$PATH:$NPM_PACKAGES/bin"' >> ~/.bash_profile

Ознайомитися з основними командами azure cli можна тут. Всі наступні команди azure cli запускаються з вашого робочого комп'ютера. Почнемо з того, що нам необхідно представитися системі і отримати токен:
azure login

Детальніше про способи авторизації можна прочитати здесь.
Створюємо групу ресурсів (контейнер ресурсів) у Північній Європі:
azure group create --name pg-resource-group --location northeurope

Створюємо віртуальну локальну мережу 10.0.0.0/8 і підмережа 10.0.0.0/24:
microsoft network vnet create -g pg-resource-group -l northeurope --address-prefixes 10.0.0.0/8 --name pg-vnet
microsoft network vnet subnet create -g pg-resource-group --vnet-name pg-vnet --address-prefix 10.0.0.0/24 --name pg-vnet-subnet

Так як управляти ми збираємося через ssh за зовнішнім ip-адресою, створюємо правила мережевого екрану і дозволяємо підключення ззовні тільки до 22 порту:
microsoft network nsg create -g pg-resource-group -l northeurope --name pg-nsg
microsoft network nsg rule create -g pg-resource-group --nsg-name pg-nsg --name AllowSSH --protocol Tcp --Allow access --destination-port-range 22 --priority 200 --direction Inbound

Налаштовуємо зовнішній ip-адресу (public-ip), мережевий адаптер з приватною мережею і підмережа для ведучого:
microsoft network public-ip create -g pg-resource-group -l northeurope --allocation-method Static --name pg-public-1
microsoft network nic create -g pg-resource-group -l northeurope --subnet-name pg-vnet-subnet --subnet-vnet-name pg-vnet --private-ip-address 10.0.0.101 --network security-group-name pg-nsg --name pg-nic-1

Створюємо групу доступності. Коротко це кластер машин, розділений на групи (домени), які не можуть бути недоступні одночасно:
azure availset create -g pg-resource-group -l northeurope --name pg-availability-set

Детальніше про групи доступності можна прочитати здесь.
Настав час налаштування віртуальної машини. Доступні типи віртуальних машин і їх обмеження можна дізнатися через команду:
microsoft vm sizes -l northeurope

У списку буде більше 50 типів машин, з цінами можна ознайомитися тут. До дешевших можна підключити менша кількість дисків (загальна кількість дисків може бути від 1 до 40). Для тестування майстра обраний Standard_DS4_v2: 8 CPU, 28GB RAM, до якого можна підключити до 16 дисків premium storage.
Команда створення віртуальної машини, яка передбачає користувача pg з sudo-правами і разрешеным входом по ssh із застосуванням ssh-ключа:
microsoft vm create -g pg-resource-group -l northeurope --nic-name pg-nic-1 --os-type Linux --image-urn OpenLogic:CentOS:7.2:latest --admin-username pg --ssh-publickey-файл ~/.ssh/id_rsa.pub --vm-size Standard_DS4_v2 --public-ip-name pg-public-1 --availset-name pg-availability-set --name pg-1

Подивитися параметри створеної машини, а також зовнішні ip, можна через команду:
microsoft vm show -g pg-resource-group --name pg-1

Тепер ми маємо віртуальну машину з встановленою CentOS 7.2, запущеної в приватної віртуальної мережі pg-vnet з ip-адресою 10.0.0.101 і публічним pg-public-1, за яким ми можемо потрапити на ssh ззовні. Необхідно створити диск, на якому будуть розташовані дані нашого PostgreSQL. Про різні типи сховищ можна почитати тут. Для початку представимо результати нашого тестування сховища:
Продуктивність різних типів сховищ
Створимо акаунт сховища Premium LRS з ім'ям pgplrs (воно повинно бути унікальним в межах azure):
azure storage create account -g pg-resource-group -l northeurope --type PLRS pgplrs

Створимо диск і підключимо його до віртуальної машини:
microsoft vm disk attach-new -g pg-resource-group -l northeurope --vm-name pg-1 --lun 1 --size-in-512 gb --vhd-name pgdata-1 --host-caching ReadOnly --storage-account-name pgplrs

Створимо і запустимо віртуальну машину pg-2:
microsoft network public-ip create -g pg-resource-group -l northeurope --allocation-method Static --name pg-public-2
microsoft network nic create -g pg-resource-group -l northeurope --subnet-name pg-vnet-subnet --subnet-vnet-name pg-vnet --private-ip-address 10.0.0.102 --network security-group-name pg-nsg --name pg-nic-2
azure vm create -g pg-resource-group -l northeurope --nic-name pg-nic-2 --os-type Linux --image-urn OpenLogic:CentOS:7.2:latest --admin-username pg --ssh-publickey-файл ~/.ssh/id_rsa.pub --vm-size Standard_DS4_v2 --public-ip-name pg-public-1 --availset-name pg-availability-set --name pg-2
azure vm disk attach-new -g pg-resource-group -l northeurope --vm-name pg-2 --lun 1 --size-in-512 gb --vhd-name pgdata-2 --host-caching ReadOnly --storage-account-name pgplrs
azure vm start -g pg-resource-group pg-2

Тепер ми можемо підключитися по ssh до pg-1 під користувачем pg:
ssh pg-public-1 -l pg -i ~/.ssh/id_rsa

Всі подальші дії ми будемо виконувати на машині pg-1. Відразу після підключення диска потрібно зіставити його з фізичним блоковим пристроєм, доступним на віртуальній машині. Для цього запускаємо команду:
[root@pg-1 ~] $ dmesg | tail -n 10
[ 488.417024] Adjusting hyperv_clocksource more than 11% (1945964553 vs 1862270976)
[ 525.969741] scsi 5:0:0:0: Direct Access Msft Virtual Disk 1.0 PQ: 0 ANSI: 4
[ 526.001471] sd 5:0:0:0: Attached scsi generic sg3 type 0
[ 526.018792] sd 5:0:0:0: [sdc] 1073741824 512-byte logical blocks: (549 ГБ/512 GiB)
[ 526.039690] sd 5:0:0:0: [sdc] 4096-byte physical blocks
[ 526.053643] sd 5:0:0:0: [sdc] Write Protect is off
[ 526.065818] sd 5:0:0:0: [sdc] Mode Sense: 0f 00 10 00
[ 526.065985] sd 5:0:0:0: [sdc] Write cache: enabled, read cache: enabled, supports DPO and FUA
[ 526.091754] sdc: unknown partition table
[ 526.105263] sd 5:0:0:0: [sdc] Attached SCSI disk

З цих повідомлень можна зрозуміти, що ім'я блочного пристрою, призначеного підключеному диску: /dev/sdc. Створюємо на ньому файлову систему:
[root@pg-1 ~] $ mkfs.ext4 /dev/sdc
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdc is entire device, not just one partition!
Proceed anyway? (y,n) y

Тепер ми повинні створити запис в fstab. Отримуємо UUID пристрої:
[root@pg-1 ~] $ blkid /dev/sdc
/dev/sdc: UUID="8cb25a32-175b-4c78-b557-8153327d48ba" TYPE="ext4"

І монтуємо диск, попередньо створивши точку монтування і додавши запис у fstab:
[root@pg-1 ~] $ mkdir -p /var/lib/pgsql
[root@pg-1 ~] $ echo 'UUID=8cb25a32-175b-4c78-b557-8153327d48ba /var/lib/pgsql ext4 defaults 0 0' >> /etc/fstab
[root@pg-1 ~] $ mount -a

Настав час установки софта, підключаємо репозиторій:
[root@pg-1 ~] $ rpm -ivh http://repo.postgrespro.ru/pgpro-9.5/keys/postgrespro-9.5.centos95.noarch.rpm

Встановлюємо софт:
[root@pg-1 ~] $ yum install postgrespro95-server postgrespro95-contrib

Включаємо сервіс та ініціалізуємо примірник СУБД:
[root@pg-1 ~] $ chkconfig postgresql-9.5 on
[root@pg-1 ~] $ service postgresql-9.5 initdb
[root@pg-1 ~] $ service postgresql-9.5 start

Подальші команди ми будемо виконувати під користувачем postgres:
[root@pg-1 ~] $ su -l postgres

Дозволяємо підключення до сервера в pg_hba з ip 10.0.0.101-102 для реплікації:
[postgres@pg-1 ~] $ echo 'host replication replication 10.0.0.101/30 md5' >> /var/lib/pgsql/9.5/data/pg_hba.conf

Створюємо користувача для реплікації:
[postgres@pg-1 ~] $ /usr/pgsql-9.5/bin/psql -U postgres postgres

postgres=$ CREATE ROLE replication WITH REPLICATION PASSWORD 'password' LOGIN;
CREATE ROLE

Виставляємо параметри, що дозволяють використовувати цю машину як провідний сервер для реплікації:
[postgres@pg-1 ~] $ /usr/pgsql-9.5/bin/psql -U postgres postgres

postgres=$ alter system set listen_addresses to '*';
ALTER SYSTEM
postgres=$ alter system set wal_level to hot_standby;
ALTER SYSTEM
postgres=$ alter system set max_wal_senders to 3;
ALTER SYSTEM
postgres=$ alter system set wal_keep_segments to 128;
ALTER SYSTEM

Перевіряємо, застосовані параметри:
postgres=$ select * from pg_file_settings where not applied;
sourcefile | sourceline | seqno | name | setting | applied
----------------------------------------------+------------+-------+------------------+-------------+---------
/var/lib/pgsql/9.5/data/postgresql.auto.conf| 3 | 20 | wal_level | hot_standby | f
/var/lib/pgsql/9.5/data/postgresql.auto.conf| 4 | 21 | max_wal_senders | 3 | f
/var/lib/pgsql/9.5/data/postgresql.auto.conf| 6 | 23 | listen_addresses | * | f
(3 rows)

Перезапускаємо службу:
[postgres@pg-1 ~] $ /usr/pgsql-9.5/bin/pg_ctl restart -D /var/lib/pgsql/9.5/data -w

Тепер ми можемо підключитися по ssh до pg-2 під користувачем pg:
ssh pg-public-2 -l pg -i ~/.ssh/id_rsa

Всі подальші команди ми виконуємо на машині pg-2. Прийшов час зайнятися реплікою: аналогічно підключаємо диск і встановлюємо postgrespro. І виконуємо вхід на pg-2 під користувачем postgres:
[root@pg-2 ~] $ su -l postgres

Після цього готуємо репліку однією командою:
[postgres@pg-2 ~] $ /usr/pgsql-9.5/bin/pg_basebackup -U replication -D /var/lib/pgsql/9.5/data -R -x -P -c spread -h 10.0.0.101 -W
Password:
38895/38895 kB (100%), 1/1 tablespace

Тепер у нас є повна копія
/var/lib/pgsql/9.5/data
і прописаний файл
recovery.conf
, який рекомендую додати інформацію про файл-тригері, при створенні якого цей примірник СУБД з веденого перетвориться на повноцінний провідний сервер. Таким чином, вміст файлу буде таке:
[postgres@pg-2 ~] $ cat /var/lib/pgsql/9.5/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=replication password=password host=10.0.0.101 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
trigger_file = '/var/lib/pgsql/stop_replication_trigger'

Запускаємо примірник з реплікою:
[postgres@pg-2 ~] $ /usr/pgsql-9.5/bin/pg_ctl start -w -D /var/lib/pgsql/9.5/data

І перевіряємо, чи запущений приймач WAL (процес wal receiver):
[postgres@pg-2 ~] $ ps axufwwww
postgres 29423 0.1 0.2 372920 16564 ? S 09:07 0:00 /usr/pgsql-9.5/bin/postmaster -D /var/lib/pgsql/9.5/data
postgres 29425 0.0 0.0 225568 1608 ? Ss 09:07 0:00 \_ postgres: logger process
postgres 29426 0.1 0.0 372960 2464 ? Ss 09:07 0:00 \_ postgres: startup process recovering 0000010000000000000003
postgres 29427 0.0 0.0 372920 1964 ? Ss 09:07 0:00 \_ postgres: checkpointer process
postgres 29428 0.0 0.0 372920 1976 ? Ss 09:07 0:00 \_ postgres: writer process
postgres 29429 0.2 0.0 379640 3360 ? Ss 09:07 0:00 \_ postgres: wal receiver process streaming 0/3000060

Отже, ми маємо дві віртуальні машини, між якими налаштована потокова асинхронна реплікація, що працює в одній групі доступності. У наступній частині статті ми обговоримо резервні копії і балансування клієнтів.
Чекайте продовження!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.