Tutorial-Diagramm zum Erstellen eines Hadoop-Hochverfügbarkeitsclusters basierend auf ZooKeeper

Tutorial-Diagramm zum Erstellen eines Hadoop-Hochverfügbarkeitsclusters basierend auf ZooKeeper

1. Einführung in Hochverfügbarkeit

Hadoop High Availability ist in HDFS High Availability und YARN High Availability unterteilt. Die Implementierung der beiden ist grundsätzlich ähnlich, aber der HDFS NameNode hat viel höhere Anforderungen an Datenspeicherung und Konsistenz als der YARN ResourceManager, sodass seine Implementierung auch komplizierter ist. Daher erklären wir es zunächst:

1.1 Hochverfügbare Gesamtarchitektur

Die HDFS-Hochverfügbarkeitsarchitektur sieht wie folgt aus:

Bildquelle: https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/

Die HDFS-Hochverfügbarkeitsarchitektur besteht hauptsächlich aus den folgenden Komponenten:

Aktiver NameNode und Standby-NameNode: Zwei NameNodes bilden ein gemeinsames Backup, einer befindet sich im aktiven Zustand und ist der primäre NameNode, der andere befindet sich im Standby-Zustand und ist der Backup-NameNode. Nur der primäre NameNode kann Lese- und Schreibdienste für die Außenwelt bereitstellen.

  • Aktiv/Standby-Umschaltcontroller ZKFailoverController: ZKFailoverController wird als unabhängiger Prozess ausgeführt und übernimmt die Gesamtsteuerung über die Aktiv/Standby-Umschaltung von NameNode. ZKFailoverController kann den Gesundheitszustand von NameNode rechtzeitig erkennen und Zookeeper verwenden, um eine automatische Master-Slave-Wahl und -Umschaltung zu implementieren, wenn der Master-NameNode ausfällt. Natürlich unterstützt NameNode derzeit auch eine manuelle Master-Slave-Umschaltung, die nicht von Zookeeper abhängt.
  • Zookeeper-Cluster: Bietet Unterstützung für die Master-Slave-Wahl für den Master-Slave-Switch-Controller. Gemeinsam genutztes Speichersystem: Das gemeinsam genutzte Speichersystem ist der wichtigste Teil, um eine hohe Verfügbarkeit von NameNode zu erreichen. Das gemeinsam genutzte Speichersystem speichert die von NameNode während des Betriebs generierten HDFS-Metadaten.
  • Der primäre NameNode und der NameNode synchronisieren Metadaten über ein gemeinsames Speichersystem. Bei einem Master-Slave-Wechsel kann der neue Master-NameNode seine Dienste erst dann weiter bereitstellen, wenn bestätigt wurde, dass die Metadaten vollständig synchronisiert sind.
  • DataNode: Zusätzlich zum Teilen von HDFS-Metadateninformationen über das gemeinsam genutzte Speichersystem müssen der primäre NameNode und der Backup-NameNode auch die Zuordnungsbeziehung zwischen HDFS-Datenblöcken und DataNode teilen.
  • Der DataNode meldet die Standortinformationen des Datenblocks sowohl an den primären NameNode als auch an den Backup-NameNode.

1.2 Analyse des Datensynchronisierungsmechanismus eines gemeinsam genutzten Speichersystems basierend auf QJM

Derzeit unterstützt Hadoop die Verwendung von Quorum Journal Manager (QJM) oder Network File System (NFS) als gemeinsam genutztes Speichersystem. Hier wird der QJM-Cluster als Beispiel verwendet: Der Active NameNode übermittelt das EditLog zuerst an den JournalNode-Cluster, und dann synchronisiert der Standby NameNode das EditLog in regelmäßigen Abständen vom JournalNode-Cluster. Wenn der Active NameNode ausfällt, kann der Standby NameNode externe Dienste bereitstellen, nachdem bestätigt wurde, dass die Metadaten vollständig synchronisiert sind.

Es ist zu beachten, dass das Schreiben von EditLog in den JournalNode-Cluster der Strategie „Erfolg, wenn mehr als die Hälfte der Einträge geschrieben sind“ folgt, sodass Sie mindestens 3 JournalNode-Knoten haben müssen. Natürlich können Sie die Anzahl der Knoten weiter erhöhen, aber die Gesamtzahl der Knoten sollte eine ungerade Zahl sein. Wenn gleichzeitig 2N+1 JournalNodes vorhanden sind, kann gemäß dem Prinzip des Mehrheitsschreibens ein Ausfall von höchstens N JournalNodes toleriert werden.

1.3 NameNode Aktiv/Standby Umschaltung

Der Vorgang, mit dem NameNode die Aktiv/Standby-Umschaltung implementiert, ist in der folgenden Abbildung dargestellt:

Nachdem HealthMonitor initialisiert wurde, startet er einen internen Thread, um regelmäßig die Methode der HAServiceProtocol RPC-Schnittstelle aufzurufen, die dem NameNode entspricht, um den Integritätsstatus des NameNode zu ermitteln.

Wenn der HealthMonitor feststellt, dass sich der Integritätsstatus des NameNode geändert hat, ruft er zur Verarbeitung die entsprechende vom ZKFailoverController registrierte Methode zurück.

Wenn ZKFailoverController feststellt, dass eine Aktiv/Standby-Umschaltung erforderlich ist, verwendet es zunächst ActiveStandbyElector, um die Aktiv/Standby-Knoten automatisch auszuwählen.

ActiveStandbyElector interagiert mit Zookeeper, um die automatische Master-Slave-Wahl durchzuführen.

Nachdem die Master/Slave-Wahl abgeschlossen ist, ruft ActiveStandbyElector die entsprechende Methode von ZKFailoverController zurück, um den aktuellen NameNode zu benachrichtigen, dass er zum Master-NameNode oder zum Standby-NameNode werden soll.

ZKFailoverController ruft die Methode der HAServiceProtocol RPC-Schnittstelle des entsprechenden NameNode auf, um den NameNode in den aktiven oder Standby-Zustand zu versetzen.

1.4 Hohe YARN-Verfügbarkeit

Die hohe Verfügbarkeit von YARN ResourceManager ist mit der von HDFS NameNode vergleichbar, aber im Gegensatz zu NameNode muss ResourceManager nicht so viele Metadateninformationen verwalten, sodass seine Statusinformationen direkt in Zookeeper geschrieben werden können und sich bei der Master-Slave-Wahl auf Zookeeper verlassen können.

2. Clusterplanung

Gemäß dem Entwurfsziel der hohen Verfügbarkeit müssen mindestens zwei NameNodes (einer aktiv und einer im Standby-Modus) und zwei ResourceManager (einer aktiv und einer im Standby-Modus) sichergestellt werden. Gleichzeitig müssen mindestens 3 JournalNode-Knoten vorhanden sein, um das Prinzip „mehr als die Hälfte der Schreibvorgänge sind erfolgreich“ zu erfüllen. Für den Aufbau werden hier drei Hosts verwendet und die Clusterplanung sieht wie folgt aus:

3. Voraussetzungen Auf allen Servern ist JDK installiert. Installationsschritte finden Sie unter: JDK-Installation unter Linux ; Einrichten des ZooKeeper-Clusters. Aufbauschritte finden Sie unter: Aufbau einer Zookeeper-Standalone-Umgebung und einer Clusterumgebung . Zwischen allen Servern ist eine passwortfreie SSH-Anmeldung konfiguriert.

4. Cluster-Konfiguration

4.1 Herunterladen und entpacken

Laden Sie Hadoop herunter. Hier habe ich die CDH-Version von Hadoop heruntergeladen, die Download-Adresse lautet: http://archive.cloudera.com/cdh5/cdh/5/

# tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz

4.2 Umgebungsvariablen konfigurieren

Bearbeiten Sie die profile :

# vim /etc/profile

Fügen Sie die folgende Konfiguration hinzu:

export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2export PATH=${HADOOP_HOME}/bin:$PATH

Führen Sie den source aus, damit die Konfiguration sofort wirksam wird:

 # source /etc/profile

4.3 Konfiguration ändern

Gehen Sie zum Verzeichnis ${HADOOP_HOME}/etc/hadoop und ändern Sie die Konfigurationsdatei. Der Inhalt jeder Konfigurationsdatei ist wie folgt:

1. hadoop-env.sh

 # 指定JDK的安裝位置export JAVA_HOME=/usr/java/jdk1.8.0_201/

2. core-site.xml

<Konfiguration>
 <Eigenschaft>
 <!-- Geben Sie die Kommunikationsadresse des HDFS-Protokolldateisystems des Namenodes an -->
 <name>fs.defaultFS</name>
 <Wert>hdfs://hadoop001:8020</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Geben Sie das Verzeichnis an, in dem der Hadoop-Cluster temporäre Dateien speichert -->
 <name>hadoop.tmp.dir</name>
 <Wert>/home/hadoop/tmp</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Adresse des ZooKeeper-Clusters -->
 <name>ha.zookeeper.quorum</name>
 <Wert>hadoop001:2181,hadoop002:2181,hadoop002:2181</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- ZKFC verbindet sich mit ZooKeeper, Timeout -->
 <name>ha.zookeeper.session-timeout.ms</name>
 <Wert>10000</Wert>
 </Eigenschaft>
</Konfiguration>

3. hdfs-site.xml

<Konfiguration>
 <Eigenschaft>
 <!-- Geben Sie die Anzahl der HDFS-Replikate an -->
 <name>dfs.replikation</name>
 <Wert>3</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Der Speicherort der Namenode-Knotendaten (d. h. Metadaten). Sie können mehrere Verzeichnisse angeben, um Fehlertoleranz zu erreichen. Mehrere Verzeichnisse werden durch Kommas getrennt. -->
 <name>dfs.namenode.name.dir</name>
 <Wert>/home/hadoop/namenode/data</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Speicherort der Datanode-Knotendaten (d. h. Datenblöcke) -->
 <name>dfs.datanode.data.dir</name>
 <Wert>/home/hadoop/datanode/data</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Logischer Name des Clusterdienstes -->
 <name>dfs.nameservices</name>
 <Wert>meinCluster</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- NameNode-ID-Liste -->
 <name>dfs.ha.namenodes.mycluster</name>
 <Wert>nn1,nn2</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- nn1s RPC-Kommunikationsadresse -->
 <name>dfs.namenode.rpc-adresse.mycluster.nn1</name>
 <Wert>hadoop001:8020</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- nn2s RPC-Kommunikationsadresse -->
 <name>dfs.namenode.rpc-adresse.mycluster.nn2</name>
 <Wert>hadoop002:8020</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- nn1s HTTP-Kommunikationsadresse -->
 <name>dfs.namenode.http-adresse.mycluster.nn1</name>
 <Wert>hadoop001:50070</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- nn2s HTTP-Kommunikationsadresse -->
 <name>dfs.namenode.http-adresse.mycluster.nn2</name>
 <Wert>hadoop002:50070</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Gemeinsam genutztes Speicherverzeichnis für NameNode-Metadaten auf JournalNode -->
 <name>dfs.namenode.shared.edits.dir</name>
 <Wert>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Speicherverzeichnis für Journal-Editierdateien -->
 <name>dfs.journalnode.edits.dir</name>
 <Wert>/home/hadoop/journalnode/data</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Konfigurieren Sie den Isolationsmechanismus, um sicherzustellen, dass immer nur ein NameNode aktiv ist -->
 <name>dfs.ha.fencing.methods</name>
 <Wert>sshfence</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Bei Verwendung des SSHfence-Mechanismus ist eine passwortfreie SSH-Anmeldung erforderlich-->
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <Wert>/root/.ssh/id_rsa</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- SSH-Zeitüberschreitung -->
 <name>dfs.ha.fencing.ssh.connect-timeout</name>
 <Wert>30000</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Zugriffsproxyklasse, die verwendet wird, um den NameNode zu bestimmen, der sich derzeit im aktiven Status befindet -->
 <name>dfs.client.failover.proxy.provider.mycluster</name>
 <Wert>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Automatisches Failover aktivieren -->
 <name>dfs.ha.automatic-failover.enabled</name>
 <Wert>wahr</Wert>
 </Eigenschaft>
</Konfiguration>

4. yarn-site.xml

<Konfiguration>
 <Eigenschaft>
 <!--Konfigurieren Sie die auf dem NodeManager ausgeführten Hilfsdienste. MapReduce-Programme können auf Yarn erst ausgeführt werden, nachdem mapreduce_shuffle konfiguriert wurde. -->
 <name>yarn.nodemanager.aux-services</name>
 <Wert>mapreduce_shuffle</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Ob die Protokollaggregation aktiviert werden soll (optional) -->
 <name>yarn.log-aggregation-enable</name>
 <Wert>wahr</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Aggregierte Protokollspeicherzeit (optional) -->
 <name>yarn.log-aggregation.retain-seconds</name>
 <Wert>86400</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- RM HA aktivieren -->
 <name>yarn.resourcemanager.ha.aktiviert</name>
 <Wert>wahr</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- RM-Clusterkennung -->
 <name>Garn.Resourcemanager.Cluster-ID</name>
 <Wert>mein-Garn-Cluster</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- RM logische ID-Liste -->
 <name>garn.resourcemanager.ha.rm-ids</name>
 <Wert>rm1,rm2</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- RM1-Serviceadresse -->
 <name>garn.resourcemanager.hostname.rm1</name>
 <Wert>hadoop002</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- RM2-Serviceadresse -->
 <name>yarn.resourcemanager.hostname.rm2</name>
 <Wert>hadoop003</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Adresse der RM1-Webanwendung -->
 <name>yarn.resourcemanager.webapp.address.rm1</name>
 <Wert>hadoop002:8088</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Adresse der RM2-Webanwendung -->
 <name>yarn.resourcemanager.webapp.address.rm2</name>
 <Wert>hadoop003:8088</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Adresse des ZooKeeper-Clusters -->
 <name>yarn.resourcemanager.zk-Adresse</name>
 <Wert>hadoop001:2181,hadoop002:2181,hadoop003:2181</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Automatische Wiederherstellung aktivieren -->
 <name>yarn.resourcemanager.recovery.aktiviert</name>
 <Wert>wahr</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <!-- Klasse für persistenten Speicher-->
 <name>Garn.ResourceManager.Store.Klasse</name>
 <Wert>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</Wert>
 </Eigenschaft>
</Konfiguration>

5. mapred-site.xml

<Konfiguration>
 <Eigenschaft>
 <!--Geben Sie den MapReduce-Job an, der auf YARN ausgeführt werden soll-->
 <name>mapreduce.framework.name</name>
 <value>Garn</value>
 </Eigenschaft>
</Konfiguration>

5. Sklaven

Konfigurieren Sie die Hostnamen oder IP-Adressen aller Slave-Knoten, einen pro Zeile. DataNode -Dienst und der NodeManager -Dienst werden auf allen Slave-Knoten gestartet.

hadoop001
hadoop002
hadoop003

4.4 Verteilungsverfahren

Verteilen Sie das Hadoop-Installationspaket auf die beiden anderen Server. Nach der Verteilung wird empfohlen, die Hadoop-Umgebungsvariablen auf den beiden Servern zu konfigurieren.

# Verteilen Sie das Installationspaket an hadoop002
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/
# Verteilen Sie das Installationspaket an hadoop003
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/

5.1 ZooKeeper starten

Starten Sie den ZooKeeper-Dienst jeweils auf den drei Servern:

 zkServer.sh start

5.2 Journalnode starten

Gehen Sie zum Verzeichnis ${HADOOP_HOME}/sbin jedes der drei Server und starten Sie den journalnode Prozess:

 hadoop-daemon.sh start journalnode

5.3 NameNode initialisieren

Führen Sie den NameNode -Initialisierungsbefehl auf hadop001 aus:

hdfs namenode -format

Nach der Ausführung des Initialisierungsbefehls müssen Sie den Inhalt des NameNode Metadatenverzeichnisses in andere unformatierte NameNode kopieren. Das Metadatenspeicherverzeichnis ist das Verzeichnis, das wir mit dfs.namenode.name.dir in hdfs-site.xml angegeben haben. Hier müssen wir es nach hadoop002 kopieren:

 scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/

5.4 HA-Status initialisieren

Verwenden Sie den folgenden Befehl auf einem beliebigen NameNode um den HA-Status in ZooKeeper zu initialisieren:

 hdfs zkfc -formatZK

5.5 HDFS starten

Gehen Sie zum Verzeichnis ${HADOOP_HOME}/sbin von hadoop001 und starten Sie HDFS. An diesem Punkt werden die NameNode -Dienste auf hadoop001 und hadoop002 sowie die DataNode Dienste auf den drei Servern gestartet:

 start-dfs.sh

5.6 YARN starten

Gehen Sie zum Verzeichnis ${HADOOP_HOME}/sbin von hadoop002 und starten Sie YARN. Zu diesem Zeitpunkt werden der ResourceManager -Dienst auf hadoop002 und NodeManager -Dienste auf den drei Servern gestartet:

 start-yarn.sh

Es ist zu beachten, dass der ResourceManager -Dienst auf hadoop003 zu diesem Zeitpunkt normalerweise nicht gestartet wird und manuell gestartet werden muss:

 yarn-daemon.sh start resourcemanager

6. Den Cluster anzeigen

6.1 Prozess anzeigen

Nach einem erfolgreichen Start sollte der Ablauf auf jedem Server wie folgt ablaufen:

[root@hadoop001 sbin]# jps
4512 DFSZKFailoverController
3714 Journalknoten
4114 NameNode
3668 QuorumPeerMain
5012 Datenknoten
4639 KnotenManager
[root@hadoop002 sbin]# jps
4499 RessourcenManager
4595 KnotenManager
3465 QuorumPeerMain
3705 NameNode
3915 DFSZKFailoverController
5211 Datenknoten
3533 Journalknoten
[root@hadoop003 sbin]# jps
3491 Journalknoten
3942 KnotenManager
4102 RessourcenManager
4201 Datenknoten
3435 QuorumPeerMain

6.2 Web-Benutzeroberfläche anzeigen

Die Portnummern von HDFS und YARN sind 50070 bzw. 8080 Die Schnittstelle sollte wie folgt aussehen:

Zu diesem Zeitpunkt befindet sich NameNode auf hadoop001 in einem verfügbaren Status:

NameNode auf hadoop002 befindet sich im Standby-Zustand:



ResourceManager auf hadoop002 befindet sich im verfügbaren Status:



ResourceManager auf hadoop003 befindet sich im Standby-Zustand:



Gleichzeitig verfügt die Schnittstelle auch über relevante Informationen zum Journal Manager :


7. Sekundärstart des Clusters

Der erste Start des oben genannten Clusters erfordert einige notwendige Initialisierungsvorgänge, daher ist der Vorgang etwas umständlich. Sobald der Cluster jedoch erstellt ist, ist es praktisch, ihn wieder zu aktivieren. Die Schritte sind wie folgt (stellen Sie zunächst sicher, dass der ZooKeeper-Cluster gestartet ist):

Starten Sie HDFS in hadoop001 . Zu diesem Zeitpunkt werden alle mit der Hochverfügbarkeit von HDFS verbundenen Dienste gestartet, einschließlich NameNode, DataNode und JournalNode:

 start-dfs.sh

Starten Sie YARN in hadoop002 :

 start-yarn.sh

Zu diesem Zeitpunkt ist der ResourceManager -Dienst auf hadoop003 normalerweise nicht gestartet und muss manuell gestartet werden:

 yarn-daemon.sh start resourcemanager

Verweise

Die oben genannten Konstruktionsschritte sind hauptsächlich aus der offiziellen Dokumentation entnommen:

Hohe Verfügbarkeit von HDFS mithilfe des Quorum Journal Managers Hohe Verfügbarkeit von ResourceManager

Zusammenfassen

Das Obige ist ein Tutorial zum Erstellen eines Hadoop-Hochverfügbarkeitsclusters basierend auf ZooKeeper. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • Erfahren Sie, wie Sie einen Hadoop 3.x-Pseudocluster auf der Tencent Cloud erstellen
  • Methoden und Schritte zum Erstellen eines verteilten Hadoop-Clusters
  • So erstellen Sie eine Hadoop-Clusterumgebung mit Ubuntu Docker
  • Detaillierte Erklärung zum Erstellen von Hadoop- und HBase-Clustern mit Docker
  • Detaillierte Erklärung zum Erstellen der Ubuntu-Version des Hadoop-Clusters
  • Detaillierte Erklärung, wie Sie mit Docker schnell von Grund auf eine Hadoop-Clusterumgebung erstellen können
  • Detaillierte Erläuterung der Verwendung von Docker zum Erstellen eines verteilten Hadoop-Clusters
  • Allgemeine Überlegungen zum Erstellen eines Hadoop 3.2.0-Clusters

<<:  Grafisches Tutorial zur Konfigurationsmethode für die Installationsversion von MySQL5.7.17 winx64 unter Windows Server 2008 R2

>>:  Detaillierte Erklärung der jQuery-Kettenaufrufe

Artikel empfehlen

JavaScript-Interview: So implementieren Sie die Methode zur Array-Abflachung

Inhaltsverzeichnis 1. Was ist Array-Flattening? 2...

Detaillierte Erklärung der globalen Variablenimplementierung von Uniapp

Vorwort In diesem Artikel werden einige Implement...

JavaScript zum Implementieren eines Dropdown-Listenauswahlfelds

In diesem Artikelbeispiel wird der spezifische Ja...

Detaillierte Erklärung des Sidecar-Modus in Docker Compose

Inhaltsverzeichnis Was ist Docker Compose Anforde...

MySQL verwendet UNIQUE, um das Einfügen nicht doppelter Daten zu implementieren

SQL UNIQUE-Einschränkung Die UNIQUE-Einschränkung...

Extrahieren Sie bestimmte Dateipfade in Ordnern basierend auf Linux-Befehlen

In letzter Zeit besteht der Bedarf, automatisch n...

Sechs Möglichkeiten zur Steigerung der Geschwindigkeit Ihrer Website

1. Ersetzen Sie die Adresse Ihrer .js-Bibliotheks...

Tipps zur Verwendung von DIV-Containern mit fester Höhe in IE6 und IE7

Es gibt viele Unterschiede zwischen IE6 und IE7 in...

Concat() von kombinierten Feldern in MySQL

Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...