Erstellen eines PostgreSQL-Clusters mit hoher Verfügbarkeit unter Verwendung von Patroni, etcd, HAProxy

Es kam einfach so vor, dass ich zum Zeitpunkt der Problemstellung nicht genügend Erfahrung hatte, um diese Lösung alleine zu entwickeln und auszuführen. Und dann fing ich an zu googeln.


Ich weiß nicht, was der Haken ist, aber zum x-ten Mal bin ich damit konfrontiert, dass selbst wenn Sie alles Schritt für Schritt wie im Tutorial vorbereiten, nichts jemals funktioniert. Ich habe keine Ahnung, worum es geht, aber als ich wieder darauf stieß, entschied ich mich - und ich schreibe mein Tutorial, wenn alles geklappt hat. Eine, die auf jeden Fall funktionieren wird.


Online-Ratgeber


Es ist einfach so passiert, dass das Internet nicht unter dem Mangel an verschiedenen Anleitungen, Tutorials, Schritt-für-Schritt-Anleitungen und dergleichen leidet. So kam es, dass ich die Aufgabe hatte, eine Lösung für die bequeme Organisation und den Aufbau eines ausfallsicheren PostgreSQL-Clusters zu entwickeln. Die Hauptanforderungen waren das Streaming der Replikation vom Master-Server zu allen Replikaten und die automatische Eingabe der Reserve, wenn der Master-Server ausfiel.


In dieser Phase wurde der Stapel der verwendeten Technologien definiert:


  • PostgreSQL als DBMS
  • Patroni als Clustering-Lösung
  • etcd als verteilter Speicher für Patroni
  • HAproxy zum Organisieren eines einzelnen Einstiegspunkts für Anwendungen, die die Datenbank verwenden

Installation


Ihre Aufmerksamkeit - der Aufbau eines hochverfügbaren PostgreSQL-Clusters unter Verwendung von Patroni, etc, HAProxy.


Alle Operationen wurden auf virtuellen Maschinen mit installiertem Debian 10 ausgeführt.


etcd


Ich empfehle nicht, etcd auf denselben Rechnern zu installieren, auf denen sich patroni und postgresql befinden, da das Laden der Festplatte für etcd sehr wichtig ist. Aber zu Schulungszwecken werden wir genau das tun.
Installieren Sie etcd.


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

Fügen Sie den Inhalt der Datei / etc / default / etcd hinzu

[Mitglied]


ETCD_NAME = datanode1 # Hostname Ihres Rechners
ETCD_DATA_DIR = "/ var / lib / etcd / default.etcd"


ALLE IP-ADRESSEN SOLLTEN GÜLTIG SEIN. LISTER PEER, CLIENT usw. MÜSSEN auf IP-Adresse des Hosts eingestellt sein


ETCD_LISTEN_PEER_URLS = " http://192.168.0.143:2380 " # Ihre Maschinenadresse
ETCD_LISTEN_CLIENT_URLS = " http://192.168.0.143:2379,http://127.0.0.1:2379 " # Ihre Computeradresse


[cluster]


ETCD_INITIAL_ADVERTISE_PEER_URLS = " http://192.168.0.143:2380 " # Adresse Ihres Computers
ETCD_INITIAL_CLUSTER = "datanode1 = http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380 " # Adressen aller Maschinen im etcd-Cluster
ETCD_INITIAL_CLUSTER_STATE = "neu"
ETCD_INITIAL_CLUSTER_TOKEN = "etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS = " http://192.168.0.143:2379 " # Ihre Computeradresse


Führen Sie den Befehl aus


 systemctl restart etcd 

PostgreSQL 9.6 + Benutzer


Zunächst müssen drei virtuelle Maschinen installiert werden, auf denen die erforderliche Software installiert wird. Wenn Sie nach der Installation der Maschinen meinem Tutorial folgen, können Sie dieses einfache Skript ausführen, das (fast) alles für Sie erledigt. Als root ausführen.


Bitte beachten Sie, dass das Skript die PostgreSQL-Version 9.6 verwendet. Dies ist auf die internen Anforderungen unseres Unternehmens zurückzuführen. Die Lösung wurde nicht auf anderen PostgreSQL-Versionen getestet.


 #!/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 

Als nächstes müssen Sie in der soeben erstellten Datei /etc/patroni.yml den folgenden Inhalt einfügen und natürlich die IP-Adressen an allen Stellen in die von Ihnen verwendeten Adressen ändern.
Beachten Sie die Kommentare in diesem Yam. Ändern Sie die Adressen auf jedem Computer im Cluster nach Ihren Wünschen.


/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 

Das Skript muss auf allen drei Computern des Clusters ausgeführt werden, genauso wie Sie die Konfiguration auf allen Computern in der Datei /etc/patroni.yml ablegen müssen.


Wenn Sie diese Vorgänge auf allen Computern im Cluster ausführen, führen Sie den folgenden Befehl auf einem der Computer aus


 systemctl start patroni systemctl start postgresql 

Warten Sie ungefähr 30 Sekunden und führen Sie diesen Befehl auf den übrigen Cluster-Computern aus.


HAproxy


Wir verwenden den wunderbaren HAproxy, um einen einzelnen Einstiegspunkt bereitzustellen. Der Master-Server ist immer an der Adresse des Computers verfügbar, auf dem HAproxy bereitgestellt wird.


Um die HAproxy-Maschine nicht zu einem einzelnen Fehlerpunkt zu machen, führen Sie sie im Docker-Container aus. Später können Sie sie im K8-Cluster ausführen und unseren Failover-Cluster noch zuverlässiger machen.


Erstellen Sie ein Verzeichnis, in dem Sie zwei Dateien speichern können - Dockerfile und haproxy.cfg. Geh zu ihm.


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 

Seien Sie vorsichtig, in den letzten drei Zeilen der Datei haproxy.cfg sollten die Adressen Ihrer Computer aufgeführt sein. HAproxy meldet sich bei Patroni. In den HTTP-Headern gibt der Masterserver immer 200 zurück, und das Replikat gibt 503 zurück.


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 

Da wir uns in dem Verzeichnis befinden, in dem unsere beiden Dateien "liegen", führen wir nacheinander die Container-Packbefehle sowie deren Start mit den erforderlichen Port-Weiterleitungen aus:


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

Wenn Sie nun die Browser-Adresse Ihres Computers mit HAproxy öffnen und Port 7000 angeben, werden Statistiken zu Ihrem Cluster angezeigt.


Im Status UP befinden sich der Server, der als Master fungiert, und die Replikate im Status DOWN. Dies ist normal, sie funktionieren tatsächlich, werden jedoch in dieser Form angezeigt, da sie 503 auf Anforderungen von HAproxy zurückgeben. So wissen wir immer genau, welcher der drei Server gerade der Master ist.


Fazit


Du bist unglaublich! In nur 30 Minuten haben Sie einen hervorragenden ausfallsicheren und produktiven Datenbankcluster mit Streaming-Replikation und automatischer Bereitstellung bereitgestellt. Wenn Sie diese Lösung verwenden möchten, lesen Sie die offizielle Patroni-Dokumentation , insbesondere den Teil zum Dienstprogramm patronictl, mit dem Sie bequem auf Ihr Cluster zugreifen können.


Herzlichen Glückwunsch!

Source: https://habr.com/ru/post/de482314/


All Articles