Eine kurze Analyse von Patroni in Docker-Containern

Eine kurze Analyse von Patroni in Docker-Containern

Im vorherigen Artikel wurde der Repmgr-Konstruktionsprozess vorgestellt und das automatische Umschalten implementiert. Heute zeigen wir, wie man eine Patroni-Clusterumgebung unter einem Container erstellt. Als sofort einsatzbereites PG-Hochverfügbarkeitstool wird Patroni zunehmend von verschiedenen Anbietern in Cloud-Umgebungen verwendet.

Die grundlegende Architektur von Patroni ist in der Abbildung dargestellt:

Bildbeschreibung hier einfügen

etcd dient als verteiltes Registrierungszentrum und führt die Cluster-Masterwahl durch; vip-manager legt die Drift-IP für den Masterknoten fest; patroni ist für die Erstellung, den Betrieb und die Verwaltung des Clusters verantwortlich und kann patronictl für den Terminalzugriff verwenden.

Spezifischer Prozess:
1. Starten Sie zuerst den etcd-Cluster. In diesem Beispiel beträgt die Anzahl der etcd 3.
2. Nachdem Sie überprüft haben, dass der etcd-Cluster fehlerfrei ist, starten Sie Patroni und konkurrieren Sie um die Wahl des Leiters. Andere Follower-Knoten führen eine Datensynchronisierung durch.
3. Starten Sie vip-manager und ermitteln Sie, ob der aktuelle Knoten die IP des Masterknotens ist, indem Sie auf den spezifischen Wert im Schlüssel /SERVICENAME/{SERVICE_NAME}/SERVICEN​AME/{CLUSTER_NAME}/leader im etcd-Cluster zugreifen. Wenn ja, legen Sie vip für den Knoten fest, um externe Lese- und Schreibdienste bereitzustellen.
Hinweis: Es wird empfohlen, etcd auf einem separaten Container in einer realen Umgebung bereitzustellen, um externe Dienste bereitzustellen.

Erstellen eines Images

Dateistruktur

Unter diesen ist Dockerfile die Hauptdatei des Images, und der Docker-Dienst erstellt das Image über diese Datei im lokalen Warehouse. entrypoint.sh ist die Einstiegsdatei des Containers, die für die Verarbeitung der Geschäftslogik verantwortlich ist. function ist die Einstiegsdatei zum Ausführen von Geschäftsmethoden, die für das Starten von etcd, die Überwachung des Status des etcd-Clusters sowie das Starten von patroni und vip-manager verantwortlich ist. generatefile generiert die entsprechende Konfigurationsdatei für den gesamten Container, einschließlich etcd, patroni und vip-manager.

Die Verzeichnisstruktur sieht ungefähr so ​​aus wie in der Abbildung:

Bildbeschreibung hier einfügen

Hinweis: Bitte erstellen Sie das Datenbankinstallationspaket und das Patroni-Installationspaket selbst.

DockerDatei

VON centos:7

WARTUNGSPERSÖNLICHKEIT wangzhibin <wangzhibin>

ENV USER="postgresql" \
    PASSWORT=123456 \
    GRUPPE=postgresql 
	
RUN useradd ${USER} \
       && chown -R ${BENUTZER}:${GRUPPE} /home/${BENUTZER} \
       && yum -y update && yum install -y iptables sudo net-tools iproute openssh-server openssh-clients which vim sudo crontabs
#Installieren Sie etcd
KOPIEREN Sie etcd/etcd /usr/sbin
KOPIEREN etcd/etcdctl /usr/sbin

#Datenbank installieren
KOPIEREN Sie lib/ /home/${USER}/lib
KOPIEREN include/ /home/${USER}/include
KOPIEREN share/ /home/${USER}/share
KOPIEREN bin/ /home/${USER}/bin/
KOPIEREN patroni/ /home/${USER}/patroni

#Vip-Manager installieren
KOPIEREN Sie vip-manager/vip-manager /usr/sbin
#Ausführungsskript installieren COPY runtime/ /home/${USER}/runtime
KOPIEREN Sie entrypoint.sh /sbin/entrypoint.sh

#Setzen Sie die Umgebungsvariable ENV LD_LIBRARY_PATH /home/${USER}/lib
ENV-PFAD /home/${USER}/bin:$PATH
ENV ETCDCTL_API=3

#Patroni installieren
RUN yum -y install epel-release python-devel && yum -y install python-pip \
    && pip install /home/${USER}/patroni/1/pip-20.3.3.tar.gz \
    && pip install /home/${USER}/patroni/1/psycopg2-2.8.6-cp27-cp27mu-linux_x86_64.whl \
    && pip install --no-index --find-links=/home/${USER}/patroni/2/ -r /home/${USER}/patroni/2/requirements.txt \
    && pip install /home/${USER}/patroni/3/patroni-2.0.1-py2-none-any.whl

#Ausführungsberechtigungen ändern RUN chmod 755 /sbin/entrypoint.sh \ 
&& mkdir /home/${USER}/etcddata \
&& chown -R ${BENUTZER}:${GRUPPE} /home/${BENUTZER} \
&& echo 'root:root123456' | chpasswd \
&& chmod 755 /sbin/etcd \
&& chmod 755 /sbin/etcdctl \
&& chmod 755 /sbin/vip-manager

#Sudo einrichten
RUN chmod 777 /etc/sudoers \
       && sed -i '/## Erlaubt root, beliebige Befehle überall auszuführen/a '${USER}' ALL=(ALL) NOPASSWD:ALL' /etc/sudoers \
       && chmod 440 /etc/sudoers

#Benutzer wechseln USER ${USER}

#Arbeitsverzeichnis wechseln WORKDIR /home/${USER}

#Starten Sie das Eingabeprogramm CMD ["/bin/bash", "/sbin/entrypoint.sh"]

Einstiegspunkt.sh

#!/bin/bash
setze -e

# Shellcheck-Quelle = Laufzeit/Funktionen
Quelle "/home/${USER}/runtime/function"

configure_patroni

Funktion

#!/bin/bash

setze -e
Quelle /home/${USER}/runtime/env-defaults
Quelle /home/${USER}/runtime/generatefile

PG_DATADIR=/home/${USER}/pgdata
PG_BINDIR=/home/${USER}/bin

configure_patroni()
{
    #Konfigurationsdatei generate_etcd_conf generieren
    generate_patroni_conf
    vip_conf generieren
    #Starten Sie etcd
    etcdanzahl=${ETCD_COUNT}
    Anzahl=0
    ip_temp=""
    Array = ($ {HOSTLIST//,/ })
    für Host in ${array[@]}
    Tun
        ip_temp+="http://${host}:2380,"
    Erledigt
    etcd --config-file=/home/${USER}/etcd.yml >/home/${USER}/etcddata/etcd.log 2>&1 &
    während [ $Anzahl -lt $etcdAnzahl ]
    Tun
      Zeile=(`etcdctl --endpoints=${ip_temp%?} Endpunktgesundheit -w json`)
      Anzahl=`echo $line | awk -F"\"health\":true" '{print NF-1}'`
      echo "wartet auf etcd-Cluster"
      Schlaf 5
    Erledigt
    #Starten Sie Patroni
    Benutzer /home/${USER}/postgresql.yml > /home/${USER}/Benutzer/Benutzer.log 2>&1 &
    #VIP-Manager starten
    sudo vip-manager --config /home/${USER}/vip.yml
}

Datei generieren

#!/bin/bash
setze -e

HOSTNAME="`Hostname`"
hostip=`ping ${HOSTNAME} -c 1 -w 1 | sed '1{s/[^(]*(//;s/).*//;q}'`

#etcd generieren
generieren_etcd_conf()
{
    echo "Name: ${HOSTNAME}" >> /home/${USER}/etcd.yml
    echo "Datenverzeichnis: /home/${USER}/etcddata" >> /home/${USER}/etcd.yml
    echo "listen-client-urls: http://0.0.0.0:2379" >> /home/${USER}/etcd.yml
    echo "advertise-client-urls: http://${hostip}:2379" >> /home/${USER}/etcd.yml
    echo "listen-peer-urls: http://0.0.0.0:2380" >> /home/${USER}/etcd.yml
    echo "initial-advertise-peer-urls: http://${hostip}:2380" >> /home/${USER}/etcd.yml
    ip_temp="Anfangscluster: "
    Array = ($ {HOSTLIST//,/ })  
    für Host in ${array[@]}
    Tun
    	ip_temp+="${host}=http://${host}:2380," 
    Erledigt
    echo ${ip_temp%?} >> /home/${USER}/etcd.yml
    echo "initial-cluster-token: etcd-cluster-token" >> /home/${USER}/etcd.yml
    echo "Initialclusterstatus: neu" >> /home/${USER}/etcd.yml
}

#patronengenerieren
patroni_conf() generieren
{
  echo "Umfang: ${CLUSTER_NAME}" >> /home/${USER}/postgresql.yml
  echo "Namespace: /${SERVICE_NAME}/ " >> /home/${USER}/postgresql.yml
  echo "name: ${HOSTNAME} " >> /home/${USER}/postgresql.yml
  echo "restapi: " >> /home/${USER}/postgresql.yml 
  echo " listen: ${hostip}:8008 " >> /home/${USER}/postgresql.yml 
  echo " Verbindungsadresse: ${hostip}:8008 " >> /home/${USER}/postgresql.yml
  echo "etcd: " >> /home/${USER}/postgresql.yml
  echo " Host: ${hostip}:2379 " >> /home/${USER}/postgresql.yml
  echo " Benutzername: ${ETCD_USER} " >> /home/${USER}/postgresql.yml
  echo " Passwort: ${ETCD_PASSWD} " >> /home/${USER}/postgresql.yml
  echo "bootstrap: " >> /home/${USER}/postgresql.yml
  echo " dcs: " >> /home/${USER}/postgresql.yml
  echo " ttl: 30 " >> /home/${USER}/postgresql.yml
  echo " loop_wait: 10 " >> /home/${USER}/postgresql.yml
  echo " Wiederholungstimeout: 10 " >> /home/${USER}/postgresql.yml
  echo " maximum_lag_on_failover: 1048576 " >> /home/${USER}/postgresql.yml
  echo " postgresql: " >> /home/${USER}/postgresql.yml
  echo " use_pg_rewind: true " >> /home/${USER}/postgresql.yml
  echo " use_slots: true " >> /home/${USER}/postgresql.yml
  echo " Parameter: " >> /home/${USER}/postgresql.yml
  echo " initdb: " >> /home/${USER}/postgresql.yml
  echo " - Kodierung: UTF8 " >> /home/${USER}/postgresql.yml
  echo " - Datenprüfsummen " >> /home/${USER}/postgresql.yml
  echo " pg_hba: " >> /home/${USER}/postgresql.yml
  echo " - Host-Replikation ${USER} 0.0.0.0/0 md5 " >> /home/${USER}/postgresql.yml
  echo " - host alle alle 0.0.0.0/0 md5 " >> /home/${USER}/postgresql.yml
  echo "postgresql: " >> /home/${USER}/postgresql.yml
  echo " listen: 0.0.0.0:5432 " >> /home/${USER}/postgresql.yml
  echo " Verbindungsadresse: ${hostip}:5432 " >> /home/${USER}/postgresql.yml
  echo " Datenverzeichnis: ${PG_DATADIR} " >> /home/${USER}/postgresql.yml
  echo " bin_dir: ${PG_BINDIR} " >> /home/${USER}/postgresql.yml
  echo " pgpass: /tmp/pgpass " >> /home/${USER}/postgresql.yml
  echo " Authentifizierung: " >> /home/${USER}/postgresql.yml
  echo " Replikation: " >> /home/${USER}/postgresql.yml
  echo " Benutzername: ${USER} " >> /home/${USER}/postgresql.yml
  echo " Passwort: ${PASSWD} " >> /home/${USER}/postgresql.yml
  echo " superuser: " >> /home/${USER}/postgresql.yml
  echo " Benutzername: ${USER} " >> /home/${USER}/postgresql.yml
  echo " Passwort: ${PASSWD} " >> /home/${USER}/postgresql.yml
  echo " zurückspulen: " >> /home/${USER}/postgresql.yml
  echo " Benutzername: ${USER} " >> /home/${USER}/postgresql.yml
  echo " Passwort: ${PASSWD} " >> /home/${USER}/postgresql.yml
  echo " Parameter: " >> /home/${USER}/postgresql.yml
  echo " unix_socket_directories: '.' " >> /home/${USER}/postgresql.yml
  echo " wal_level: hot_standby " >> /home/${USER}/postgresql.yml
  echo " max_wal_senders: 10 " >> /home/${USER}/postgresql.yml
  echo " max_replication_slots: 10 " >> /home/${USER}/postgresql.yml
  echo "tags: " >> /home/${USER}/postgresql.yml
  echo " nofailover: false " >> /home/${USER}/postgresql.yml
  echo " noloadbalance: false " >> /home/${USER}/postgresql.yml
  echo " clonefrom: false " >> /home/${USER}/postgresql.yml
  echo " nosync: false " >> /home/${USER}/postgresql.yml
}
#........ Inhalt weglassen

Erstellen des Images

docker build -t patroni.

Ausführen des Images

Führen Sie Containerknoten 1 aus:
docker run --privileged --name patroni1 -itd --hostname patroni1 --net my_net3 --restart always --env 'CLUSTER_NAME=patronicluster' --env 'SERVICE_NAME=service' --env 'ETCD_USER=etcduser' --env 'ETCD_PASSWD=etcdpasswd' --env 'PASSWD=zalando' --env 'HOSTLIST=patroni1,patroni2,patroni3' --env 'VIP=172.22.1.88' --env 'NET_DEVICE=eth0' --env 'ETCD_COUNT=3' patroni
Führen Sie Containerknoten 2 aus:
docker run --privileged --name patroni2 -itd --hostname patroni2 --net my_net3 --restart always --env 'CLUSTER_NAME=patronicluster' --env 'SERVICE_NAME=service' --env 'ETCD_USER=etcduser' --env 'ETCD_PASSWD=etcdpasswd' --env 'PASSWD=zalando' --env 'HOSTLIST=patroni1,patroni2,patroni3' --env 'VIP=172.22.1.88' --env 'NET_DEVICE=eth0' --env 'ETCD_COUNT=3' patroni
Führen Sie Containerknoten 3 aus:
docker run --privileged --name patroni3 -itd --hostname patroni3 --net my_net3 --restart always --env 'CLUSTER_NAME=patronicluster' --env 'SERVICE_NAME=service' --env 'ETCD_USER=etcduser' --env 'ETCD_PASSWD=etcdpasswd' --env 'PASSWD=zalando' --env 'HOSTLIST=patroni1,patroni2,patroni3' --env 'VIP=172.22.1.88' --env 'NET_DEVICE=eth0' --env 'ETCD_COUNT=3' patroni

Zusammenfassen

Dieser Betriebsvorgang ist auf die experimentelle Umgebung beschränkt, um die allgemeine Containerisierung von etcd+Patroni+Vipmanager zu demonstrieren. In einer realen Umgebung sollte etcd in verschiedenen Containern bereitgestellt werden, um einen unabhängigen verteilten Cluster zu bilden, und der PG-Speicher sollte der lokalen Festplatte oder der Netzwerkfestplatte zugeordnet werden. Darüber hinaus sollten beim Aufbau des Containerclusters so weit wie möglich Orchestrierungstools wie Docker-Compose, Docker-Warm oder Kubernetes verwendet werden.

Angehängte Fotos

Der etcd-Clusterstatus ist wie unten dargestellt:

Bildbeschreibung hier einfügen

Der Status des Patroni-Clusters ist wie folgt:

Bildbeschreibung hier einfügen

Der VIP-Manager-Status ist wie unten dargestellt:

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Dies ist das Ende dieses Artikels über die eingehende Analyse von Patroni in Docker-Containern. Weitere relevante Inhalte zu Patroni im Docker-Container finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung verschiedener Speichermethoden von Docker-Containern
  • Schritte für den Exit-Fehlercode des Docker-Containers
  • Probleme mit dem benannten Mount und dem anonymen Mount des Docker-Container-Datenvolumens

<<:  Lösung für das Problem, dass die vertikale Zentrierung des Flex-Innenknopfs nicht zentriert ist

>>:  So implementieren Sie ein Dropdown-Menü für die HTML-Eingabe

Artikel empfehlen

Detaillierte Erklärung und Zusammenfassung der URL zur Datenbankverbindung

Detaillierte Erklärung und Zusammenfassung der UR...

Einführung in die Überwachung des MySQL MHA-Betriebsstatus

Inhaltsverzeichnis 1. Projektbeschreibung 1.1 Hin...

So erstellen Sie einen Tabellenindex in MySQL

Inhaltsverzeichnis Unterstützt mehrere Filterarte...

So migrieren Sie das Datenverzeichnis in Docker

Inhaltsverzeichnis Datenträgernutzung anzeigen Da...

43 Webdesign-Fehler, auf die Webdesigner achten sollten

Dies ist ein Artikel über die Benutzerfreundlichk...

Erstellen von responsiven E-Mails mit Vue.js und MJML

MJML ist ein modernes E-Mail-Tool, mit dem Entwic...

Reiner CSS3-Code zur Implementierung einer laufenden Uhr

Wirkung der OperationCode-Implementierung html &l...

Installieren Sie MySQL 5.7.17 im Win10-System

Das Betriebssystem Win10 MySQL ist die 64-Bit-ZIP...

Zusammenfassung und Praxis des Javascript-Prototyp-Kettendiagramms

Inhaltsverzeichnis Prototypenkette Wir können ein...

Problem mit der Kompilierung des Nginx RTMP-Moduls in der Arm-Version

Inhaltsverzeichnis 1. Vorbereitung: 2. Quellcode-...