CentOS 7 erstellt Hadoop 2.10 mit hoher Verfügbarkeit (HA)

CentOS 7 erstellt Hadoop 2.10 mit hoher Verfügbarkeit (HA)

Dieser Artikel beschreibt, wie man einen hochverfügbaren Hadoop 2.10-Cluster in CentOS 7 erstellt. Bereiten Sie zunächst 6 Maschinen vor: 2 NN (Namenode); 4 DN (Datanode); 3 JNS (Journalnodes)

IP Hostname Verfahren
192.168.30.141 s141 nn1 (Namensknoten), zkfc (DFSZKFailoverController), zk (QuorumPeerMain)
192.168.30.142 s142 dn (Datenknoten), jn (Journalknoten), zk (QuorumPeerMain)
192.168.30.143 s143 dn (Datenknoten), jn (Journalknoten), zk (QuorumPeerMain)
192.168.30.144 s144 dn (Datenknoten), jn (Journalknoten)
192.168.30.145 s145 dn (Datenknoten)
192.168.30.146 s146 nn2 (Namensknoten), zkfc (DFSZKFailoverController)

Jps-Prozess jeder Maschine:

Da ich virtuelle VMware-Maschinen verwende, verwende ich nach der Konfiguration einer Maschine Clone, um die verbleibenden Maschinen zu klonen und den Hostnamen und die IP zu ändern, sodass die Konfiguration jeder Maschine vereinheitlicht ist. Fügen Sie jeder Maschinenkonfiguration HDFS-Benutzer und Benutzergruppen hinzu, konfigurieren Sie die JDK-Umgebung und installieren Sie Hadoop. Dieses Mal wird ein Hochverfügbarkeitscluster unter dem HDFS-Benutzer erstellt. Weitere Informationen finden Sie unter: CentOS 7 erstellt Hadoop 2.10 im pseudoverteilten Modus

Hier sind einige Schritte und Details zur Installation eines Hochverfügbarkeitsclusters:

1. Legen Sie den Hostnamen und die Hosts für jede Maschine fest

Ändern Sie die Hosts-Datei. Nachdem die Hosts festgelegt sind, können Sie den Hostnamen verwenden, um auf den Computer zuzugreifen. Das ist bequemer. Ändern Sie die Datei wie folgt:

127.0.0.1 locahost
192.168.30.141 s141
192.168.30.142 s142
192.168.30.143 s143
192.168.30.144 s144
192.168.30.145 s145
192.168.30.146 s146

2. Richten Sie eine passwortfreie SSH-Anmeldung ein. Da s141 und s146 beides Namenodes sind, müssen Sie sich von diesen beiden Maschinen aus ohne Passwörter bei allen Maschinen anmelden. Am besten richten Sie eine passwortfreie Anmeldung sowohl für HDFS-Benutzer als auch für Root-Benutzer ein.

Wir setzen s141 auf nn1 und s146 auf nn2. Wir benötigen s141 und s146, um uns ohne Passwort über ssh bei anderen Maschinen anmelden zu können. Dazu müssen wir unter dem hdfs-Benutzer auf den Maschinen s141 und s146 ein Schlüsselpaar generieren, die öffentlichen Schlüssel s141 und s146 an andere Maschinen senden und sie in die Datei ~/.ssh/authorized_keys einfügen. Genauer gesagt müssen wir die öffentlichen Schlüssel zu allen Maschinen hinzufügen (einschließlich uns selbst).

Generieren Sie ein Schlüsselpaar auf den Maschinen s141 und s146:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

Hängen Sie den Inhalt der Datei id_rsa.pub an /home/hdfs/.ssh/authorized_keys auf den Maschinen s141-s146 an. Da andere Maschinen keine authorized_keys-Dateien haben, können wir id_rsa.pub in authorized_keys umbenennen. Wenn andere Maschinen bereits authorized_keys-Dateien haben, können wir den Inhalt von id_rsa.pub an die Datei anhängen. Zum Remote-Kopieren können wir den scp-Befehl verwenden:

Kopieren Sie den öffentlichen Schlüssel des S141-Rechners auf andere Rechner.

scp id_rsa.pub hdfs@s141:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s142:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s143:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s144:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s145:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s146:/home/hdfs/.ssh/id_rsa_141.pub

Kopieren Sie den öffentlichen Schlüssel des S146-Rechners auf andere Rechner.

scp id_rsa.pub hdfs@s141:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s142:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s143:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s144:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s145:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s146:/home/hdfs/.ssh/id_rsa_146.pub

Auf jedem Rechner können Sie mit cat den Schlüssel an die Datei authorized_keys anhängen.

cat id_rsa_141.pub >> autorisierte Schlüssel
cat id_rsa_146.pub >> autorisierte Schlüssel

Zu diesem Zeitpunkt müssen die Berechtigungen der Datei authorized_keys auf 644 geändert werden (beachten Sie, dass die kennwortlose SSH-Anmeldung aufgrund dieses Berechtigungsproblems häufig fehlschlägt).

chmod 644 autorisierte Schlüssel

3. Konfigurieren Sie die Hadoop-Konfigurationsdatei (${hadoop_home}/etc/hadoop/)

Konfigurationsdetails:

Hinweis: s141 und s146 haben genau die gleiche Konfiguration, insbesondere ssh.

1) Nameservice konfigurieren

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.nameservices</name>
 <Wert>meinCluster</Wert>
</Eigenschaft>


2) dfs.ha.namenodes.[Nameservice-ID]

[hdfs-site.xml]
<!-- Zwei IDs des Name-Knotens unter myucluster -->
<Eigenschaft>
  <name>dfs.ha.namenodes.mycluster</name>
  <Wert>nn1,nn2</Wert>
</Eigenschaft>

3) dfs.namenode.rpc-address.[Nameservice-ID].[Namensknoten-ID]

[hdfs-site.xml]
Konfigurieren Sie die RPC-Adresse jedes NN.
<Eigenschaft>
 <name>dfs.namenode.rpc-adresse.mycluster.nn1</name>
 <Wert>s141:8020</Wert>
</Eigenschaft>
<Eigenschaft>
 <name>dfs.namenode.rpc-adresse.mycluster.nn2</name>
 <Wert>s146:8020</Wert>
</Eigenschaft>

4) dfs.namenode.http-address.[Nameservice-ID].[Namensknoten-ID]
Konfigurieren Sie den WebUI-Port

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.namenode.http-adresse.mycluster.nn1</name>
 <Wert>s141:50070</Wert>
</Eigenschaft>
<Eigenschaft>
 <name>dfs.namenode.http-adresse.mycluster.nn2</name>
 <Wert>s146:50070</Wert>
</Eigenschaft>

5) dfs.namenode.shared.edits.dir
Benennen Sie den Knoten als gemeinsam genutztes Bearbeitungsverzeichnis. Wählen Sie drei Journalknotenknoten aus, hier die drei Maschinen s142, s143 und s144.

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.namenode.shared.edits.dir</name>
 <Wert>qjournal://s142:8485;s143:8485;s144:8485/mycluster</Wert>
</Eigenschaft>

6) dfs.client.failover.proxy.provider.[Nameservice-ID]
Konfigurieren Sie eine HA-Failover-Java-Klasse (die Konfiguration ist fest) und der Client verwendet sie, um zu bestimmen, welcher Knoten aktiv ist.

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.client.failover.proxy.provider.mycluster</name>
 <Wert>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</Wert>
</Eigenschaft>

7) dfs.ha.fencing.methods
Skriptliste oder Java-Klasse im aktivierten Zustand „nn“ des Notfallwiederherstellungsschutzes.

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.ha.fencing.methods</name>
 <Wert>sshfence</Wert>
</Eigenschaft>

<Eigenschaft>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <Wert>/home/hdfs/.ssh/id_rsa</Wert>
</Eigenschaft>

8) fs.defaultFS
Konfigurieren Sie den HDFS-Dateisystem-Namensdienst. Hier ist mycluster der oben konfigurierte dfs.nameservices

[core-site.xml]
<Eigenschaft>
 <name>fs.defaultFS</name>
 <Wert>hdfs://mycluster</Wert>
</Eigenschaft>

9) dfs.journalnode.edits.dir
Konfigurieren Sie den lokalen Pfad, in dem JN Änderungen speichert.

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.journalnode.edits.dir</name>
 <Wert>/home/hdfs/hadoop/journal</Wert>
</Eigenschaft>

Vollständige Konfigurationsdatei:

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="konfiguration.xsl"?>

<Konfiguration>
 <Eigenschaft>
 <name>fs.defaultFS</name>
 <Wert>hdfs://mycluster/</Wert>
 </Eigenschaft>
 <Eigenschaft>
 <name>hadoop.tmp.dir</name>
 <Wert>/home/hdfs/hadoop</Wert>
 </Eigenschaft>
</Konfiguration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="konfiguration.xsl"?>

<Konfiguration>
 <Eigenschaft>
   <name>dfs.replikation</name>
   <Wert>3</Wert>
 </Eigenschaft>
 <Eigenschaft>
   <name>dfs.hosts</name>
   <Wert>/opt/soft/hadoop/etc/dfs.include.txt</Wert>
 </Eigenschaft>
 <Eigenschaft>
   <name>dfs.hosts.exclude</name>
   <Wert>/opt/soft/hadoop/etc/dfs.hosts.exclude.txt</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.nameservices</name>
  <Wert>meinCluster</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.ha.namenodes.mycluster</name>
  <Wert>nn1,nn2</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.namenode.rpc-adresse.mycluster.nn1</name>
  <Wert>s141:8020</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.namenode.rpc-adresse.mycluster.nn2</name>
  <Wert>s146:8020</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.namenode.http-adresse.mycluster.nn1</name>
  <Wert>s141:50070</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.namenode.http-adresse.mycluster.nn2</name>
  <Wert>s146:50070</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.namenode.shared.edits.dir</name>
  <Wert>qjournal://s142:8485;s143:8485;s144:8485/mycluster</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <Wert>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.ha.fencing.methods</name>
  <Wert>sshfence</Wert>
 </Eigenschaft>

 <Eigenschaft>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <Wert>/home/hdfs/.ssh/id_rsa</Wert>
 </Eigenschaft>
 <Eigenschaft>
  <name>dfs.journalnode.edits.dir</name>
  <Wert>/home/hdfs/hadoop/journal</Wert>
 </Eigenschaft>
</Konfiguration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="konfiguration.xsl"?>

<Konfiguration>
 <Eigenschaft>
 <name>mapreduce.framework.name</name>
 <value>Garn</value>
 </Eigenschaft>
</Konfiguration>

yarn-site.xml

<?xml version="1.0"?>

<Konfiguration>

<!-- Sitespezifische YARN-Konfigurationseigenschaften -->
 <Eigenschaft>
   <name>garn.resourcemanager.hostname</name>
   <Wert>s141</Wert>
 </Eigenschaft>
 <Eigenschaft>
    <name>yarn.nodemanager.aux-services</name>
   <Wert>mapreduce_shuffle</Wert>
 </Eigenschaft>
</Konfiguration>

4. Bereitstellungsdetails

1) Starten Sie die jn-Prozesse (s142, s143, s144) jeweils auf den jn-Knoten

hadoop-daemon.sh startet Journalnode

2) Synchronisieren Sie nach dem Starten von jn die Festplattenmetadaten zwischen den beiden NNs

a) Wenn es sich um einen brandneuen Cluster handelt, formatieren Sie zuerst das Dateisystem. Dies muss nur auf einem NN ausgeführt werden.
[s141|s146]

Hadoop-Namensknoten -Format

b) Wenn Sie einen Nicht-HA-Cluster in einen HA-Cluster konvertieren, kopieren Sie die Metadaten des ursprünglichen NN in ein anderes NN.

1. Schritt 1 Kopieren Sie auf der Maschine s141 die Hadoop-Daten in das Verzeichnis, das s146 entspricht

scp -r /home/hdfs/hadoop/dfs hdfs@s146:/home/hdfs/hadoop/

2. Schritt 2: Führen Sie den folgenden Befehl auf dem neuen nn (unformatiertes nn, meines ist s146) aus, um im Standby-Modus zu booten. Hinweis: s141namenode muss gestartet werden (Sie können ausführen: hadoop-daemon.sh start namenode).

hdfs-Namensknoten -BootstrapStandby

Wenn der Nameknoten s141 nicht gestartet wird, schlägt er fehl, wie in der Abbildung dargestellt:

Nach dem Starten des s141-Namensknotens führen Sie den Befehl auf s141 aus

hadoop-daemon.sh startet Namenode

Führen Sie dann den Standby-Boot-Befehl aus. Hinweis: Wenn Sie gefragt werden, ob eine Formatierung erfolgen soll, wählen Sie N, wie in der Abbildung gezeigt:

    3. Schritt 3

Führen Sie den folgenden Befehl auf einem der NNs aus, um die Übertragung des Bearbeitungsprotokolls an den jn-Knoten abzuschließen.

hdfs namenode -initializeSharedEdits

Wenn während der Ausführung der Fehler java.nio.channels.OverlappingFileLockException gemeldet wird:

Zeigt an, dass der Namenode gestartet wird und gestoppt werden muss (hadoop-daemon.sh stop namenode)

Überprüfen Sie nach der Ausführung, ob s142, s143 und s144 Bearbeitungsdaten haben. Überprüfen Sie hier, ob das Verzeichnis mycluster erstellt wurde, das Bearbeitungsprotokolldaten enthält, wie folgt:

4. Schritt 4

Starten Sie alle Knoten.

Starten Sie den Namensknoten und alle Datenknoten auf s141:

hadoop-daemon.sh startet Namenode
hadoop-daemons.sh startet Datanode

Starten Sie den Namensknoten auf s146

hadoop-daemon.sh startet Namenode

Besuchen Sie jetzt http://192.168.30.141:50070/ und http://192.168.30.146:50070/ im Browser und Sie werden feststellen, dass beide Namenodes im Standby-Modus sind.

Zu diesem Zeitpunkt müssen Sie den Befehl manuell verwenden, um einen von ihnen in den aktiven Zustand zu versetzen. Setzen Sie hier s141 (nn1) auf aktiv

hdfs haadmin -transitionToActive nn1

Zu diesem Zeitpunkt ist s141 aktiv

Allgemeine Befehle von hdfs haadmin:

Zu diesem Zeitpunkt ist die manuelle Konfiguration der hohen Verfügbarkeit für die Notfallwiederherstellung abgeschlossen. Diese Methode ist jedoch nicht intelligent und kann die Notfallwiederherstellung nicht automatisch erkennen. Im Folgenden wird daher die automatische Konfiguration der Notfallwiederherstellung vorgestellt.

5. Automatische Notfallwiederherstellungskonfiguration

Zwei Komponenten müssen eingeführt werden: Zookeeperquarum und ZK Disaster Recovery Controller (ZKFC).

Erstellen Sie einen Zookeeper-Cluster, wählen Sie die drei Maschinen s141, s142 und s143 aus und laden Sie Zookeeper herunter: http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.6

1) Zookeeper entpacken:

tar -xzvf apache-zookeeper-3.5.6-bin.tar.gz -C /opt/soft/zookeeper-3.5.6

2) Konfigurieren Sie Umgebungsvariablen, fügen Sie zk-Umgebungsvariablen in /etc/profile hinzu und kompilieren Sie die Datei /etc/profile neu

Kopieren Sie den Code wie folgt:
Quelle /etc/Profil

3) Konfigurieren Sie die zk-Konfigurationsdatei und vereinheitlichen Sie die Konfigurationsdateien der drei Maschinen

# Die Anzahl der Millisekunden jedes Ticks
tickZeit=2000
# Die Anzahl der Ticks, die der anfängliche 
# Die Synchronisationsphase kann dauern
initLimit=10
# Die Anzahl der Ticks, die zwischen 
# Senden einer Anfrage und Erhalten einer Bestätigung
syncLimit=5
# das Verzeichnis, in dem der Snapshot gespeichert ist.
# benutze /tmp nicht zur Speicherung, /tmp ist hier nur 
# Beispiel sei Dank.
dataDir=/home/hdfs/zookeeper
# der Port, an dem die Clients eine Verbindung herstellen
clientPort=2181
# die maximale Anzahl von Clientverbindungen.
# Erhöhen Sie diesen Wert, wenn Sie mehr Kunden bedienen müssen
#maxClientCnxns=60
#
# Lesen Sie unbedingt den Wartungsabschnitt der 
# Administratorhandbuch vor dem Aktivieren der automatischen Bereinigung.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# Die Anzahl der Snapshots, die im Datenverzeichnis aufbewahrt werden sollen
#autopurge.snapRetainCount=3
# Bereinigungsaufgabenintervall in Stunden
# Auf „0“ setzen, um die automatische Bereinigungsfunktion zu deaktivieren
#autopurge.purgeInterval=1
server.1=s141:2888:3888
server.2=s142:2888:3888
server.3=s143:2888:3888

4) Bzw.

Erstellen Sie eine MyID-Datei im Verzeichnis /home/hdfs/zookeeper von s141 (dem in der Konfigurationsdatei zoo.cfg konfigurierten dataDir-Pfad) mit dem Wert 1 (entspricht server.1 in der Konfigurationsdatei zoo.cfg).

Erstellen Sie eine MyID-Datei im Verzeichnis /home/hdfs/zookeeper von s142 (dem in der Konfigurationsdatei zoo.cfg konfigurierten dataDir-Pfad) mit dem Wert 2 (entspricht server.2 in der Konfigurationsdatei zoo.cfg).

Erstellen Sie eine MyID-Datei im Verzeichnis /home/hdfs/zookeeper von s143 (dem in der Konfigurationsdatei zoo.cfg konfigurierten dataDir-Pfad) mit dem Wert 3 (entspricht server.3 in der Konfigurationsdatei zoo.cfg).

5) Starten Sie zk auf jedem Computer separat

zkServer.sh starten

Wenn der Start erfolgreich ist, wird der zk-Prozess angezeigt:

Konfigurieren Sie die HDFS-bezogene Konfiguration:

1) Stoppen Sie alle HDFS-Prozesse

stop-alles.sh

2) Konfigurieren Sie hdfs-site.xml und aktivieren Sie die automatische Notfallwiederherstellung.

[hdfs-site.xml]
<Eigenschaft>
 <name>dfs.ha.automatic-failover.enabled</name>
 <Wert>wahr</Wert>
</Eigenschaft>

3) Konfigurieren Sie core-site.xml und geben Sie die Verbindungsadresse von zk an.

<Eigenschaft>
 <name>ha.zookeeper.quorum</name>
 <Wert>s141:2181,s142:2181,s143:2181</Wert>
</Eigenschaft>

4) Verteilen Sie die beiden oben genannten Dateien an alle Knoten.

5) Initialisieren Sie in einem der NNs (s141) den HA-Zustand in ZK

hdfs zkfc -formatZK

Das folgende Ergebnis zeigt den Erfolg an:

Sie können es auch in zk überprüfen:

6) Starten Sie den HDFS-Cluster

start-dfs.sh

Sehen Sie sich die Prozesse der einzelnen Maschinen an:

Start erfolgreich, werfen Sie einen Blick auf die WebUI

s146 ist aktiviert

s141 ist im Standby-Modus

An diesem Punkt wird die automatische Disaster Recovery HA von Hadoop erstellt.

Zusammenfassen

Oben habe ich Ihnen den Aufbau von Hadoop2.10 High Availability (HA) auf Centos7 vorgestellt. Ich hoffe, es wird Ihnen helfen!

Das könnte Sie auch interessieren:
  • Detailliertes Beispiel für die parallele Verarbeitung mehrerer Jobs in Hadoop
  • Detaillierte Erläuterung häufiger Hadoop-Fehler und -Lösungen
  • So konfigurieren Sie Hadoop zur Verwendung von IntelliJ IDEA zum Remote-Debuggen von Code
  • Detailliertes Tutorial zur Verwendung von Hadoop in Spring (Schnellstart mit Big Data)
  • Detaillierte Methode zur Verwendung von IDEA zum Erstellen einer Hadoop-Entwicklungsumgebung unter Windows
  • Erfahren Sie, wie Sie einen Hadoop 3.x-Pseudocluster auf der Tencent Cloud erstellen
  • So führen Sie Hadoop aus und erstellen Images in Docker
  • Lernen Sie, wie Sie mit Hadoop bestimmte Inhalte aus einer Datei extrahieren

<<:  Über das Problem beim Schreiben von Plugins zum Mounten von DOM in vue3

>>:  Analyse des Prinzips des dynamischen Proxys des Mybatis-Mappers

Artikel empfehlen

Einige Fehler, die JavaScript-Anfänger häufig machen

Inhaltsverzeichnis Vorwort Verwechslung von „unde...

MySQL-Lernprogramm Clustered Index

Das Clustering ist eigentlich relativ zur InnoDB-...

Details zur Vue-Vorlagenkompilierung

Inhaltsverzeichnis 1. analysieren 1.1 Regeln für ...

Eine einfache Methode zum Ändern der Größe hochgeladener Nginx-Dateien

Originallink: https://vien.tech/article/138 Vorwo...

Erfahren Sie in einem Artikel mehr über TypeScript-Datentypen

Inhaltsverzeichnis Grundtypen jeder Typ Arrays Tu...

Detaillierte Analyse des MySQL 8.0-Redo-Logs

Inhaltsverzeichnis Vorwort Generierung eines Redo...

Nodejs-Fehlerbehandlungsprozessaufzeichnung

In diesem Artikel wird der Verbindungsfehler ECON...

Optimieren Sie MySQL mit 3 einfachen Tricks

Ich erwarte nicht, ein erfahrener Datenbankadmini...

So konfigurieren Sie den NAT-Modus für virtuelle VMware-Maschinen

In diesem Artikel wird der NAT-Konfigurationsproz...

MySQL-Sortierung mittels Index-Scan

Inhaltsverzeichnis Installieren Sie Sakila Index-...

CentOS7 verwendet yum zur Installation von MySQL 8.0.12

In diesem Artikel werden die detaillierten Schrit...

Mehrere beliebte Website-Navigationsrichtungen in der Zukunft

<br />Dies ist nicht nur ein Zeitalter der I...