ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ кластСра PostgreSQL высокой доступности с использованиСм Patroni, etcd, HAProxy

Π’Π°ΠΊ ΡƒΠΆ Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ постановки Π·Π°Π΄Π°Ρ‡ΠΈ я Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π» достаточной ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ опытности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΡƒ. И Ρ‚ΠΎΠ³Π΄Π° я Π½Π°Ρ‡Π°Π» Π³ΡƒΠ³Π»ΠΈΡ‚ΡŒ.

НС знаю, Π² Ρ‡Π΅ΠΌ Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ°, Π½ΠΎ ΡƒΠΆΠ΅ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π· я ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡΡŒ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли Π΄Π΅Π»Π°Ρ‚ΡŒ всС пошагово ΠΊΠ°ΠΊ Π² Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Π΅, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ enviroment ΠΊΠ°ΠΊ Ρƒ Π°Π²Ρ‚ΠΎΡ€Π°, Ρ‚ΠΎ всС Ρ€Π°Π²Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠŸΠΎΠ½ΡΡ‚ΠΈΡ Π½Π΅ имСю, Π² Ρ‡Π΅ΠΌ Ρ‚ΡƒΡ‚ Π΄Π΅Π»ΠΎ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° я столкнулся с этим Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π·, я Ρ€Π΅ΡˆΠΈΠ» β€” Π° Π½Π°ΠΏΠΈΡˆΡƒ-ΠΊΠ° я свой Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π», ΠΊΠΎΠ³Π΄Π° всС получится. Π’ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΡ‡Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π“Π°ΠΉΠ΄Ρ‹ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅

Π’Π°ΠΊ ΡƒΠΆ Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π½Π΅ страдаСт ΠΎΡ‚ нСдостатка Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π³Π°ΠΉΠ΄ΠΎΠ², Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»ΠΎΠ², step-by-step ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ. Π’Π°ΠΊ ΡƒΠΆ Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π±Ρ‹Π»Π° поставлСна Π·Π°Π΄Π°Ρ‡Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ построСния отказоустойчивого кластСра PostgreSQL, Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ трСбованиями ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ являлись потоковая рСпликация с Master-сСрвСра Π½Π° всС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈ автоматичСский Π²Π²ΠΎΠ΄ Ρ€Π΅Π·Π΅Ρ€Π²Π° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π΅ Master-сСрвСра.

На этом этапС Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ стСк ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ:

  • PostgreSQL Π² качСствС Π‘Π£Π‘Π”
  • Patroni Π² качСствС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для кластСризации
  • etcd Π² качСствС распрСдСлСнного Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° для Patroni
  • HAproxy для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π±Π°Π·Ρƒ

Установка

Π’Π°ΡˆΠ΅ΠΌΡƒ вниманию β€” построСниС кластСра PostgreSQL высокой доступности с использованиСм Patroni, etcd, HAProxy.

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… с установлСнной ОБ Debian 10.

etcd

НС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ etcd Π½Π° Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ находится patroni ΠΈ postgresql, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для etcd ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Π° Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° диски. Но Π² цСлях обучСния, ΠΌΡ‹ поступим ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ.
Установим etcd.

#!/bin/bash
apt-get update
apt-get install etcd

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ содСрТимоС Π² Ρ„Π°ΠΉΠ» /etc/default/etcd

[member]

ETCD_NAME=datanode1 # hostname вашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹
ETCD_DATA_DIR=»/var/lib/etcd/default.etcd»

ALL IP ADRESSES SHOULD BE VALID. LISTER PEER, CLIENT etc SHOULD BE SET TO IP ADDRESS OF HOST

ETCD_LISTEN_PEER_URLS=»http://192.168.0.143:2380» # адрСс вашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹
ETCD_LISTEN_CLIENT_URLS=»http://192.168.0.143:2379,http://127.0.0.1:2379» # адрСс вашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS=»http://192.168.0.143:2380» # адрСс вашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # адрСса всСх машин Π² кластСрС etcd
ETCD_INITIAL_CLUSTER_STATE=»new»
ETCD_INITIAL_CLUSTER_TOKEN=»etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS=»http://192.168.0.143:2379» # адрСс вашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

systemctl restart etcd

PostgreSQL 9.6 + patroni

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ для установки Π½Π° Π½ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ПО. ПослС установки машин, Ссли Π²Ρ‹ слСдуСтС ΠΌΠΎΠ΅ΠΌΡƒ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Ρƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот простой скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ (ΠΏΠΎΡ‡Ρ‚ΠΈ) всС сдСлаСт Π·Π° вас. ЗапускаСтся ΠΈΠ·-ΠΏΠΎΠ΄ root.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ скрипт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ PostgreSQL 9.6, это обусловлСно Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ трСбованиями нашСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. РСшСниС Π½Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… вСрсиях PostgreSQL.

#!/bin/bash
apt-get install gnupg -y
echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" >> /etc/apt/sources.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get install postgresql-9.6 python3-pip python3-dev libpq-dev -y
systemctl stop postgresql
pip3 install --upgrade pip
pip install psycopg2
pip install patroni[etcd]
echo "
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple

User=postgres
Group=postgres

ExecStart=/usr/local/bin/patroni /etc/patroni.yml

KillMode=process

TimeoutSec=30

Restart=no

[Install]
WantedBy=multi-user.targ
" > /etc/systemd/system/patroni.service
mkdir -p /data/patroni
chown postgres:postgres /data/patroni
chmod 700 /data/patroniΠΏΠΎ
touch /etc/patroni.yml

Π”Π°Π»Π΅Π΅, Π² созданный Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» /etc/patroni.yml Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТимоС, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ip-адрСса Π²ΠΎ всСх мСстах, Π½Π° адрСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π²Ρ‹.
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ yaml. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ адрСса Π½Π° свои, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ машинС кластСра.

/etc/patroni.yml

scope: pgsql # Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π° всСх Π½ΠΎΠ΄Π°Ρ…
namespace: /cluster/ # Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π° всСх Π½ΠΎΠ΄Π°Ρ…
name: postgres1 # Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌ Π½Π° всСх Π½ΠΎΠ΄Π°Ρ…

restapi:
    listen: 192.168.0.143:8008 # адрСс Ρ‚ΠΎΠΉ Π½ΠΎΠ΄Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится этот Ρ„Π°ΠΉΠ»
    connect_address: 192.168.0.143:8008 # адрСс Ρ‚ΠΎΠΉ Π½ΠΎΠ΄Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится этот Ρ„Π°ΠΉΠ»

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # пСрСчислитС здСсь всС ваши Π½ΠΎΠ΄Ρ‹, Π² случаС Ссли Π²Ρ‹ устанавливаСтС etcd Π½Π° Π½ΠΈΡ… ΠΆΠ΅

# this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `global configuration`
bootstrap:
    dcs:
        ttl: 100
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true
            use_slots: true
            parameters:
                    wal_level: replica
                    hot_standby: "on"
                    wal_keep_segments: 5120
                    max_wal_senders: 5
                    max_replication_slots: 5
                    checkpoint_timeout: 30

    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: en_US.UTF8
    # init pg_hba.conf Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ адрСса Π’Π‘Π•Π₯ машин, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² кластСрС
    pg_hba:
    - host replication postgres ::1/128 md5
    - host replication postgres 127.0.0.1/8 md5
    - host replication postgres 192.168.0.143/24 md5
    - host replication postgres 192.168.0.144/24 md5
    - host replication postgres 192.168.0.145/24 md5
    - host all all 0.0.0.0/0 md5

    users:
        admin:
            password: admin
            options:
                - createrole
                - createdb

postgresql:
    listen: 192.168.0.143:5432 # адрСс Ρ‚ΠΎΠΉ Π½ΠΎΠ΄Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится этот Ρ„Π°ΠΉΠ»
    connect_address: 192.168.0.143:5432 # адрСс Ρ‚ΠΎΠΉ Π½ΠΎΠ΄Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится этот Ρ„Π°ΠΉΠ»
    data_dir: /data/patroni # эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ создаст скрипт, описанный Π²Ρ‹ΡˆΠ΅ ΠΈ установит Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²Π°
    bin_dir:  /usr/lib/postgresql/9.6/bin # ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ вашСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с postgresql
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: postgres
            password: postgres
        superuser:
            username: postgres
            password: postgres
    create_replica_methods:
        basebackup:
            checkpoint: 'fast'
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° всСх Ρ‚Ρ€Π΅Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… кластСра, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² Ρ„Π°ΠΉΠ» /etc/patroni.yml Π½Π° всСх ΠΌΠ°ΡˆΠΈΠ½Π°Ρ….

Когда Π²Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π΅Ρ‚Π΅ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° всСх ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… кластСра, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° любой ΠΈΠ· Π½ΠΈΡ…

systemctl start patroni
systemctl start postgresql

ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ ΠΎΠΊΠΎΠ»ΠΎ 30 сСкунд, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… кластСра.

HAproxy

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ чудСсный HAproxy для прСдоставлСния Π΅Π΄ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°. Master-сСрвСр всСгда Π±ΡƒΠ΄Π΅Ρ‚ доступСн ΠΏΠΎ адрСсу ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ HAproxy.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ с HAproxy Π΅Π΄ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΡ‚ΠΊΠ°Π·Π°, запустим Π΅Π³ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Docker, Π² дальнСйшСм Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² кластСр K8’s ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш отказоустойчивый кластСр Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π³Π΄Π΅ Π²Ρ‹ смоТСтС Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° β€” Dockerfile ΠΈ haproxy.cfg. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π½Π΅Π΅.

Dockerfile

FROM ubuntu:latest

RUN apt-get update 
    && apt-get install -y haproxy rsyslog 
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /run/haproxy

COPY haproxy.cfg /etc/haproxy/haproxy.cfg

CMD haproxy -f /etc/haproxy/haproxy.cfg && tail -F /var/log/haproxy.log

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Π² Ρ‚Ρ€Π΅Ρ… послСдних строках Ρ„Π°ΠΉΠ»Π° haproxy.cfg Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ пСрСчислСны адрСса Π²Π°ΡˆΠΈΡ… машин. HAproxy Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Patroni, Π² HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… master-сСрвСр всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 200, Π° replica β€” 503.

haproxy.cfg

global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen postgres
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgresql1 192.168.0.143:5432 maxconn 100 check port 8008
    server postgresql2 192.168.0.144:5432 maxconn 100 check port 8008
    server postgresql3 192.168.0.145:5432 maxconn 100 check port 8008

ΠΠ°Ρ…ΠΎΠ΄ΡΡΡŒ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ «Π»Π΅ΠΆΠ°Ρ‚» ΠΎΠ±Π° Π½Π°ΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΅Π³ΠΎ запуск с пробросом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΡ€Ρ‚ΠΎΠ²:

docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy 

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΎΡ‚ΠΊΡ€Ρ‹Π² Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ адрСс вашСй ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с HAproxy ΠΈ ΡƒΠΊΠ°Π·Π°Π² ΠΏΠΎΡ€Ρ‚ 7000, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ статистику ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ кластСру.

Π’ состоянии UP Π±ΡƒΠ΄Π΅Ρ‚ находится Ρ‚ΠΎΡ‚ сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся мастСром, Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π² состоянии DOWN. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 503 Π½Π° запросы ΠΎΡ‚ HAproxy. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ всСгда Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… сСрвСров являСтся мастСром Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Ρ‹ Π²ΠΎΡΡ…ΠΈΡ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹! ВсСго лишь Π·Π° 30 ΠΌΠΈΠ½ΡƒΡ‚ Π²Ρ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ отказоустойчивый ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ кластСр Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ автоматичСским Π²Π²ΠΎΠ΄ΠΎΠΌ Ρ€Π΅Π·Π΅Ρ€Π²Π°. Если Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ Patroni, Π° особСнно с Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒΡŽ, ΠΊΠ°ΡΠ°ΡŽΡ‰Π΅ΠΉΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ patronictl, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ доступ ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ вашим кластСром.

ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡŽ!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com