Δημιουργία ενός εξαιρετικά διαθέσιμου συμπλέγματος PostgreSQL χρησιμοποιώντας Patroni, etcd, HAProxy

Απλώς συνέβη ότι τη στιγμή που τέθηκε το πρόβλημα, δεν είχα αρκετή εμπειρία για να αναπτύξω και να ξεκινήσω αυτήν τη λύση μόνος μου. Και μετά άρχισα να γκουγκλάρω.

Δεν ξέρω ποια είναι η σύλληψη, αλλά για πολλοστή φορά βρίσκομαι αντιμέτωπος με το γεγονός ότι ακόμα κι αν κάνω τα πάντα βήμα-βήμα όπως στο σεμινάριο, προετοιμάζω το ίδιο περιβάλλον με τον συγγραφέα, τότε τίποτα δεν λειτουργεί ποτέ. Δεν έχω ιδέα τι συμβαίνει, αλλά όταν το συνάντησα ξανά, αποφάσισα ότι θα γράψω το δικό μου σεμινάριο όταν όλα πάνε καλά. Ένα που σίγουρα θα λειτουργήσει.

Οδηγοί στο Διαδίκτυο

Τυχαίνει το Διαδίκτυο να μην υποφέρει από έλλειψη διάφορων οδηγών, σεμιναρίων, βήμα προς βήμα και παρόμοια. Έτυχε να αναλάβω την ανάπτυξη μιας λύσης για την βολική οργάνωση και δημιουργία ενός συμπλέγματος ανακατεύθυνσης PostgreSQL, οι κύριες απαιτήσεις του οποίου ήταν η αναπαραγωγή ροής από τον κύριο διακομιστή σε όλα τα αντίγραφα και η αυτόματη παροχή ενός αποθεματικού σε περίπτωση ενός κύριου διακομιστή αποτυχία.

Σε αυτό το στάδιο, προσδιορίστηκε η στοίβα των τεχνολογιών που χρησιμοποιήθηκαν:

  • PostgreSQL ως DBMS
  • Πατρώνη ως λύση ομαδοποίησης
  • κ.λπ. ως κατανεμημένη αποθήκευση για την Patroni
  • HAproxy για την οργάνωση ενός ενιαίου σημείου εισόδου για εφαρμογές που χρησιμοποιούν τη βάση δεδομένων

Εγκατάσταση

Για την προσοχή σας - δημιουργία ενός εξαιρετικά διαθέσιμου συμπλέγματος PostgreSQL χρησιμοποιώντας Patroni, etcd, HAProxy.

Όλες οι λειτουργίες πραγματοποιήθηκαν σε εικονικές μηχανές με εγκατεστημένο το Debian 10 OS.

κλπ

Δεν προτείνω την εγκατάσταση του etcd στα ίδια μηχανήματα όπου θα βρίσκεται το patroni και το postgresql, αφού το φορτίο του δίσκου είναι πολύ σημαντικό για το etcd. Αλλά για εκπαιδευτικούς σκοπούς, θα κάνουμε ακριβώς αυτό.
Ας εγκαταστήσουμε το etcd.

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

Προσθήκη περιεχομένου στο αρχείο /etc/default/etcd

[μέλος]

ETCD_NAME=datanode1 # όνομα κεντρικού υπολογιστή του υπολογιστή σας
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

ΟΛΕΣ ΟΙ ΔΙΕΥΘΥΝΣΕΙΣ IP ΠΡΕΠΕΙ ΝΑ ΕΓΚΥΡΟΥΝ. ΠΡΕΠΕΙ ΝΑ Ρυθμιστούν ΣΕ ΔΙΕΥΘΥΝΣΗ 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» # διεύθυνση του αυτοκινήτου σας

[σύμπλεγμα]

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="νέο"
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 για να παρέχουμε ένα μόνο σημείο εισόδου. Ο κύριος διακομιστής θα είναι πάντα διαθέσιμος στη διεύθυνση του μηχανήματος στο οποίο έχει αναπτυχθεί το HAproxy.

Για να μην κάνουμε το μηχάνημα με HAproxy ένα μόνο σημείο αστοχίας, θα το λανσάρουμε σε ένα κοντέινερ Docker· στο μέλλον μπορεί να εκτοξευθεί στο σύμπλεγμα του K8 και να κάνουμε το σύμπλεγμα ανακατεύθυνσης ακόμα πιο αξιόπιστο.

Δημιουργήστε έναν κατάλογο όπου μπορείτε να αποθηκεύσετε δύο αρχεία - 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 ο κύριος διακομιστής θα επιστρέφει πάντα 200 και το αντίγραφο θα επιστρέφει πάντα 503.

απροξία.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, το οποίο παρέχει εύκολη πρόσβαση στη διαχείριση του συμπλέγματός σας.

Συγχαρητήρια!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο