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: 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: Erstellen eines ImagesDateistrukturUnter 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: Hinweis: Bitte erstellen Sie das Datenbankinstallationspaket und das Patroni-Installationspaket selbst. DockerDateiVON 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 Imagesdocker build -t patroni. Ausführen des Images Führen Sie Containerknoten 1 aus: ZusammenfassenDieser 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 FotosDer etcd-Clusterstatus ist wie unten dargestellt: Der Status des Patroni-Clusters ist wie folgt: Der VIP-Manager-Status ist wie unten dargestellt: 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:
|
<<: 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
Detaillierte Erklärung und Zusammenfassung der UR...
Inhaltsverzeichnis 1 Einleitung 2 Grundlegende Be...
Bei der heutigen Projektoptimierung ist bei MySQL...
Inhaltsverzeichnis 1. Projektbeschreibung 1.1 Hin...
Inhaltsverzeichnis Unterstützt mehrere Filterarte...
Inhaltsverzeichnis Datenträgernutzung anzeigen Da...
Dies ist ein Artikel über die Benutzerfreundlichk...
Da eine bestimmte Funktion meines Projekts erford...
MJML ist ein modernes E-Mail-Tool, mit dem Entwic...
Wirkung der OperationCode-Implementierung html &l...
Das Betriebssystem Win10 MySQL ist die 64-Bit-ZIP...
Inhaltsverzeichnis Prototypenkette Wir können ein...
Inhaltsverzeichnis 1. Vorbereitung: 2. Quellcode-...
>>>>>SSH-Tutorial zur Installation...
Systemumgebung: Win10 64-bit MySQL-Version: mysql...