ProHoster > Blog > διαχείριση > Δημιουργία ενός εξαιρετικά διαθέσιμου συμπλέγματος PostgreSQL χρησιμοποιώντας Patroni, etcd, HAProxy
Δημιουργία ενός εξαιρετικά διαθέσιμου συμπλέγματος PostgreSQL χρησιμοποιώντας Patroni, etcd, HAProxy
Απλώς συνέβη ότι τη στιγμή που τέθηκε το πρόβλημα, δεν είχα αρκετή εμπειρία για να αναπτύξω και να ξεκινήσω αυτήν τη λύση μόνος μου. Και μετά άρχισα να γκουγκλάρω.
Δεν ξέρω ποια είναι η σύλληψη, αλλά για πολλοστή φορά βρίσκομαι αντιμέτωπος με το γεγονός ότι ακόμα κι αν κάνω τα πάντα βήμα-βήμα όπως στο σεμινάριο, προετοιμάζω το ίδιο περιβάλλον με τον συγγραφέα, τότε τίποτα δεν λειτουργεί ποτέ. Δεν έχω ιδέα τι συμβαίνει, αλλά όταν το συνάντησα ξανά, αποφάσισα ότι θα γράψω το δικό μου σεμινάριο όταν όλα πάνε καλά. Ένα που σίγουρα θα λειτουργήσει.
Οδηγοί στο Διαδίκτυο
Τυχαίνει το Διαδίκτυο να μην υποφέρει από έλλειψη διάφορων οδηγών, σεμιναρίων, βήμα προς βήμα και παρόμοια. Έτυχε να αναλάβω την ανάπτυξη μιας λύσης για την βολική οργάνωση και δημιουργία ενός συμπλέγματος ανακατεύθυνσης PostgreSQL, οι κύριες απαιτήσεις του οποίου ήταν η αναπαραγωγή ροής από τον κύριο διακομιστή σε όλα τα αντίγραφα και η αυτόματη παροχή ενός αποθεματικού σε περίπτωση ενός κύριου διακομιστή αποτυχία.
Σε αυτό το στάδιο, προσδιορίστηκε η στοίβα των τεχνολογιών που χρησιμοποιήθηκαν:
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 ΤΟΥ ΚΕΝΤΡΟΥ
Το πρώτο πράγμα που πρέπει να κάνετε είναι να ρυθμίσετε τρεις εικονικές μηχανές για να εγκαταστήσετε το απαραίτητο λογισμικό σε αυτές. Αφού εγκαταστήσετε τα μηχανήματα, αν ακολουθήσετε το σεμινάριο μου, μπορείτε να εκτελέσετε αυτό το απλό σενάριο που (σχεδόν) θα κάνει τα πάντα για εσάς. Εκτελείται ως root.
Λάβετε υπόψη ότι το σενάριο χρησιμοποιεί PostgreSQL έκδοση 9.6, αυτό οφείλεται στις εσωτερικές απαιτήσεις της εταιρείας μας. Η λύση δεν έχει δοκιμαστεί σε άλλες εκδόσεις της PostgreSQL.
Στη συνέχεια, στο αρχείο /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 σε όλα τα μηχανήματα.
Αφού ολοκληρώσετε αυτές τις λειτουργίες σε όλα τα μηχανήματα του συμπλέγματος, εκτελέστε την ακόλουθη εντολή σε οποιοδήποτε από αυτά
Περιμένετε περίπου 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
Όντας στον κατάλογο στον οποίο "βρίσκονται" και τα δύο αρχεία μας, ας εκτελέσουμε διαδοχικά τις εντολές για τη συσκευασία του κοντέινερ, καθώς και την εκκίνηση του με την προώθηση των απαραίτητων θυρών:
Τώρα, ανοίγοντας τη διεύθυνση του υπολογιστή σας με το HAproxy στο πρόγραμμα περιήγησης και προσδιορίζοντας τη θύρα 7000, θα δείτε στατιστικά στοιχεία στο σύμπλεγμα σας.
Ο διακομιστής που είναι ο κύριος θα βρίσκεται στην κατάσταση UP και τα αντίγραφα θα είναι στην κατάσταση DOWN. Αυτό είναι φυσιολογικό, στην πραγματικότητα λειτουργούν, αλλά εμφανίζονται έτσι επειδή επιστρέφουν 503 για αιτήματα από το HAproxy. Αυτό μας επιτρέπει να γνωρίζουμε πάντα ακριβώς ποιος από τους τρεις διακομιστές είναι ο τρέχων κύριος.
Συμπέρασμα
Είσαι πανέμορφος! Μέσα σε μόλις 30 λεπτά έχετε αναπτύξει ένα εξαιρετικό σύμπλεγμα βάσεων δεδομένων ανεκτική σε σφάλματα και υψηλής απόδοσης με αναπαραγωγή ροής και αυτόματη εναλλακτική επιστροφή. Εάν σκοπεύετε να χρησιμοποιήσετε αυτήν τη λύση, ελέγξτε έξω με επίσημη τεκμηρίωση Patroni, και ειδικά με το μέρος του που αφορά το βοηθητικό πρόγραμμα patronictl, το οποίο παρέχει εύκολη πρόσβαση στη διαχείριση του συμπλέγματός σας.