Docker-Container sichert regelmäßig die Datenbank und sendet sie an das angegebene Postfach (Designidee)

Docker-Container sichert regelmäßig die Datenbank und sendet sie an das angegebene Postfach (Designidee)

Projektadresse und Anweisungen: https://gitee.com/noovertime/mysqlmail

1. Hintergrund:

Meine ursprüngliche Absicht war, ein Skript zu schreiben, um die stark ausgelasteten Prozesse des Servers zu überwachen und sie mir per E-Mail zu senden. Dann wurde mir plötzlich klar, dass ich mit dieser Methode meine Datenbank sichern könnte, also begann ich daran zu arbeiten!

2. Gestaltungsideen:

Indem ich ein Shell-Skript schreibe, das Linux-Mail-Tool aufrufe, mysqldump verwende, um die SQL-Datei der Datenbank zu speichern, sie über das Mail-Tool einem Anhang hinzufüge und sie schließlich an mein Postfach sende.

3. Schreiben Sie ein Startskript

Schreiben wir zunächst ein Startskript. Um die zukünftige personalisierte Konfiguration zu erleichtern, extrahieren wir alle Variablen im Skript in eine Datei application.yml. Die Datei sieht folgendermaßen aus:

 RUNTIME: 084900 ##Startzeit. Aufgrund des Zeitzonenproblems des Containers ist die aktuelle Zeit minus 8 Stunden erforderlich. HOST: 172.17.0.3 ##Datenbank-IP-Adresse USER: root ##Datenbankbenutzer PASSWORD: 123456 ##Datenbankkennwort DATABASE: solo ##Datenbankname TARGETMAIL: [email protected] ##E-Mail-Adresse zum Senden

Als nächstes schreiben wir ein Shell-Skript. Die Logik ist ebenfalls sehr einfach. Wenn die aktuelle Zeit mit der Startzeit übereinstimmt, wird die Sendmail-Funktion aufgerufen, um eine E-Mail zu senden.

 #!/bin/bash
#Autor: chenteng

LAUFZEIT=$(cat ./application.yml | grep LAUFZEIT| awk '{print $2}')
HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')
BENUTZER=$(cat ./application.yml | grep BENUTZER| awk '{print $2}')
PASSWORT=$(cat ./application.yml | grep PASSWORT| awk '{print $2}')
DATENBANK=$(cat ./application.yml | grep DATENBANK| awk '{print $2}')
ZIELMAIL=$(cat ./application.yml | grep ZIELMAIL| awk '{print $2}')

Funktion sendmail(){
  mysqldump -h$HOST -u$USER -p$PASSWORT --complete-insert --skip-add-drop-table --hex-blob $DATABASE > $DATABASE.sql
  echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL
  Schlaf 1
}
während wahr
Tun 
  AKTUELLE_ZEIT=$(Datum +%H%M%S)
  wenn [ $CURRENT_TIME = $RUNTIME ];dann
    echo "Starte Bak MySQL-Datenbank"
    sendmail
    weitermachen
  anders
    echo $CURRENT_TIME
    Schlaf 1
  fi
Erledigt

4. Erstellen Sie ein Image

Da wir es letztendlich auf der K8S-Plattform platzieren werden, müssen wir ein Image erstellen. Bevor Sie das Image erstellen, legen Sie bitte application.yml demo.sh Dockerfile in dasselbe Verzeichnis
Das Dockerfile sieht wie folgt aus:
PS: MySQL-Client und Mail-Client hinzugefügt

 VON centos
RUN mkdir /app && yum install -y mysql.x86_64 sendmail mailx libreport-plugin-mailx 
ARBEITSVERZEICHNIS /app
KOPIEREN Sie demo.sh.
KOPIEREN Sie application.yml.
CMD ["/bin/sh","demo.sh"]

Verwenden Sie den Befehl „Docker Build“, um das Image zu erstellen. Denken Sie daran, den letzten Punkt hinzuzufügen

 Docker-Build -t mysqlmail-bak:1.0.1.

5. Hinzufügen eines Sidecar-Containers

Sidecar-Container: Ein Sidecar-Container ist ein Container, der in einem Pod mit dem Hauptcontainer ausgeführt wird, den Business-Container unterstützt und einen Netzwerkplatz gemeinsam nutzt, sodass Sie 127.0.0.1:3306 verwenden können, um eine Verbindung mit der Datenbank des Hauptcontainers herzustellen.

5.1 Erstellen einer Konfigurationsdatei

Um das Debuggen zu erleichtern, habe ich auch das Shell-Skript darin gemountet.
Erstellen Sie zwei ConfigMaps, die jeweils der Konfigurationsdatei und dem Shell-Skript im Container entsprechen. Wenn das Debuggen später nicht mehr erforderlich ist, können Sie das Mounten von mysqlshell abbrechen.

 API-Version: v1
Art: ConfigMap
Metadaten:
  Name: mysqlmail-conf
  Namespace: Solo
Daten:
  Anwendung.yml: |
    Laufzeit: 105800
    Host: 127.0.0.1
    BENUTZER: root
    PASSWORT: 123456
    DATENBANK: solo
    ZIEL-MAIL: [email protected]
---
API-Version: v1
Art: ConfigMap
Metadaten:
  Name: mysqlmail-shell
  Namespace: Solo
Daten:
  demo.sh: |
    #!/bin/bash
    #Autor: chenteng
    LAUFZEIT=$(cat ./application.yml | grep LAUFZEIT| awk '{print $2}')
    HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')
    BENUTZER=$(cat ./application.yml | grep BENUTZER| awk '{print $2}')
    PASSWORT=$(cat ./application.yml | grep PASSWORT| awk '{print $2}')
    DATENBANK=$(cat ./application.yml | grep DATENBANK| awk '{print $2}')
    ZIELMAIL=$(cat ./application.yml | grep ZIELMAIL| awk '{print $2}')
    Funktion sendmail(){
      mysqldump -h$HOST -u$USER -p$PASSWORT --complete-insert --skip-add-drop-table --column-statistics=0 --hex-blob $DATABASE > $DATABASE.sql
      echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL
      Schlaf 1
    }
    während wahr
    Tun 
      AKTUELLE_ZEIT=$(Datum +%H%M%S)
      wenn [ $CURRENT_TIME = $RUNTIME ];dann
        echo "Starte Bak MySQL-Datenbank"
        sendmail
        weitermachen
      anders
        echo $CURRENT_TIME
        Schlaf 1
      fi
    Erledigt

5.2 Erstellen Sie eine Stateful Service Deployment-Datei

Unsere Bereitstellungsdatei verwendet die YAML-Datei des im vorherigen Artikel erstellten MySQL-Stateful-Dienstes. Wenn Sie interessiert sind, können Sie meinen vorherigen Migrationsartikel lesen.

 API-Version: Apps/v1
Art: StatefulSet
Metadaten:
  Name: MySQL
  Namespace: Solo
Spezifikation:
  Dienstname: MySQL-Dienst
  Wähler:
    Übereinstimmungsetiketten:
      App: MySQL
  Replikate: 1
  Vorlage:
    Metadaten:
      Beschriftungen:
        App: MySQL
    Spezifikation:
      Behälter:
      - Name: mysqlmail-bak
        imagePullPolicy: IfNotPresent
        Bild: mysqlmail-bak:1.0.1
        Volumenhalterungen:
        - Name: mysqlmail-conf
          Mount-Pfad: /app/application.yml
          Unterpfad: application.yml
        - Name: mysqlmail-shell
          MountPfad: /app/demo.sh
          Unterpfad: demo.sh
      - Name: MySQL-Pod
        imagePullPolicy: IfNotPresent
        Bild:mysql:5.7
        Umgebung:
        - Name: MYSQL_ROOT_PASSWORD
          Wert: „123456“
        Häfen:
        - ContainerPort: 3306
          Name: msyql-listin
        Volumenhalterungen:
        - Name: MySQL-Daten
          Einhängepfad: /var/lib/mysql
          Unterpfad: MySQL-Daten
        - Name: mysql-conf
          Einhängepfad: /etc/mysql/conf.d/my.cnf
          Unterpfad: my.cnf
      Bände:
      - Name: MySQL-Daten
        Hostpfad:
          Pfad: /data/mysql
      - Name: mysql-conf
        Konfigurationskarte:
          Name: mysql-conf
      - Name: mysqlmail-conf
        Konfigurationskarte: 
          Name: mysqlmail-conf
      - Name: mysqlmail-shell
        Konfigurationskarte:
          Name: mysqlmail-shell
---

API-Version: v1
Art: Dienstleistung
Metadaten:
  Name: MySQL-Dienst
  Namespace: Solo
  Beschriftungen:
    App: MySQL
Spezifikation:
  Häfen:
  ZielPort: 3306
    Port: 3306
  clusterIP: Keine
  Wähler:
     App: MySQL

6. Testen

Die oben eingestellte Zeit ist RUNTIME: 105800, also 18:58 in der Zeitzone von Shanghai. Schauen wir uns die Wirkung an und sehen uns das Protokoll an.
Hinweis: Wenn ein Pod mehrere Container enthält, verwenden Sie den Parameter -c, um anzugeben, welcher Container angezeigt werden soll.

 [root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0 -c mysqlmail-bak | grep mysql -C 5
105755
105756
105757
105758
105759
MySQL-Datenbank neu starten
mysqldump: [Warnung] Die Verwendung eines Passworts in der Befehlszeilenschnittstelle kann unsicher sein.
105801
105802

Aus dem Protokoll können Sie ersehen, dass die E-Mail erfolgreich versendet wurde! Wir überprüften unseren Briefkasten und stellten fest, dass auch dieser erfolgreich war. Unser Experiment war nun perfekt abgeschlossen!

Bildbeschreibung hier einfügen

Dies ist das Ende dieses Artikels zum Planen einer Datenbanksicherung im Docker-Container und zum Senden an ein angegebenes Postfach. Weitere Informationen zur geplanten Datenbanksicherung in Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Sicherung und Wiederherstellung von PSSQL-Datenbanken in Docker
  • Beispielcode für Datenbanksicherung in einer Docker-Umgebung (PostgreSQL, MySQL)

<<:  So zeigen Sie JSON-Daten auf einer HTML-Seite an und formatieren sie

>>:  Eine kurze Diskussion über Browserkompatibilitätsprobleme in JavaScript

Artikel empfehlen

Führen Sie die Schritte aus, um den Fehler 403 Forbidden in Nginx zu beheben.

Die Webseite zeigt 403 Forbidden an Nginx (Yum-In...

Detaillierte Beispiele für Ersetzen und Ersetzen in MySQL into_Mysql

„Replace“ und „Replace into“ von MySQL sind beide...

Docker-Netzwerkprinzipien und detaillierte Analyse benutzerdefinierter Netzwerke

Docker virtualisiert eine Brücke auf dem Host-Rec...

Vue implementiert die browserseitige Code-Scan-Funktion

Hintergrund Vor nicht allzu langer Zeit habe ich ...

Hinweise zur Verwendung der verknüpften Liste des Linux-Kernel-Gerätetreibers

/******************** * Anwendung von verknüpften...

Zusammenfassung der Ereignisse, die Browser registrieren können

HTML-Ereignisliste Allgemeine Ereignisse: onClick ...

So konfigurieren Sie die CDN-Planung mit dem Modul Nginx_geo

Einführung in das Geo-Modul von Nginx Die Geo-Dir...

Tutorial zum Importieren und Exportieren von Docker-Containern

Hintergrund Die Popularität von Docker hängt eng ...

JavaScript implementiert einfache Rechnerfunktion

In diesem Artikel wird der spezifische JavaScript...

Installation von Docker CE auf Ubuntu

Dieser Artikel dient zur Aufzeichnung der Install...