Създаване на клъстер за PostgreSQL с висока наличност, използвайки Patroni, etcd, HAProxy

Случи се така, че в момента, когато беше поставена задачата, нямах достатъчно опит, за да разработя и стартирам това решение самостоятелно. И тогава започнах да търся информация в интернет.

Не знам в какво е проблемът, но вече за пореден път се сблъсквам с това, че дори когато следвам стъпка по стъпка ръководството, подготвяйки същата среда, каквато е у автора, пак нищо не работи. Нямам представа какво не е наред, но когато отново се срещнах с това, реших — ами ще напиша собствено ръководство, когато всичко проработи. Такова, което наистина ще работи.

Ръководства в интернет

Случи се така, че интернет не страда от липса на различни ръководства, туториали, стъпка по стъпка и подобни неща. Случи се така, че ми беше поставена задачата да създам решение за удобна организация и изграждане на отказоустойчив кластер 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 # име на вашата машина
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ВСИЧКИ IP АДРЕСИ ТРЯБВА ДА СА ВАЛИДНИ. LISTER PEER, CLIENT и т.н. ТРЯБВА ДА СА НАСТРОЕНИ НА IP АДРЕСА НА ХОСТА

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

обхват: pgsql # трябва да бъде одинаково на всички нодове
пространство: \/cluster\/ # трябва да бъде одинаково на всички нодове
име: postgres1 # трябва да бъде различно на всички нодове

restapi:
    слушам: 192.168.0.143:8008 # адрес на нода, на който се намира този файл
    адрес за свързване: 192.168.0.143:8008 # адрес на нода, на който се намира този файл

etcd:
    хостове: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # изброете тук всички ваши нодове, в случай че инсталирате etcd и на тях

# този раздел (bootstrap) ще бъде записан в Etcd:\/\/\/config след инициализиране на новия клъстер
# и всички останали членове на клъстера ще го използват като `глобална конфигурация`
bootstrap:
    dcs:
        ttl: 100
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true
            use_slots: true
            параметри:
                    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:
    - хост replication postgres ::1\/128 md5
    - хост replication postgres 127.0.0.1\/8 md5
    - хост replication postgres 192.168.0.143\/24 md5
    - хост replication postgres 192.168.0.144\/24 md5
    - хост replication postgres 192.168.0.145\/24 md5
    - хост всички всички 0.0.0.0\/0 md5

    потребители:
        администратор:
            парола: admin
            опции:
                - createrole
                - createdb

postgresql:
    слушам: 192.168.0.143:5432 # адрес на нода, на който се намира този файл
    адрес за свързване: 192.168.0.143:5432 # адрес на нода, на който се намира този файл
    data_dir: \/data\/patroni # тази директория ще бъде създадена от скрипта, описан по-горе и ще установи необходимите права
    bin_dir:  \/usr\/lib\/postgresql\/9.6\/bin # задайте пътя до вашата директория с postgresql
    pgpass: \/tmp\/pgpass
    удостоверяване:
        replication:
            username: postgres
            password: postgres
        суперпотребител:
            username: postgres
            password: postgres
    create_replica_methods:
        basebackup:
            checkpoint: 'fast'
    параметри:
        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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster