
Ich arbeite an einem Projekt, für das zum Teilen von Daten zwei Raspberry Pis erforderlich sind.
Ich bin zu dem Schluss gekommen, dass es für mich am bequemsten wäre, eine MySQL-Datenbank zu verwenden, da ich darin ein wenig Erfahrung habe. Ich habe Apache, MariaDB und alle erforderlichen Tools für die MySQL-Datenbank installiert, eine Kopie der SD-Karte erstellt und verwende auf beiden Raspberry Pis dieselben Tools und Programme. Das bedeutet, dass ich auf beiden Raspberry Pi-Rechnern über auf separate MySQL-Datenbanken zugreifen kann http://localhost/phpmyadmin
.
Jetzt möchte ich, dass die Datenbank auf meinem Haupt-Raspberry Pi läuft http://localhost/phpmyadmin
und ich möchte diese Datenbank auf meinem sekundären Pi erreichen. Da ich die IP-Adresse meines Haupt-Raspberry Pi kenne, sollte der sekundäre Raspberry Pi diese Datenbank erreichen können, indem er sich wie folgt über den Browser mit PHPMyAdmin verbindet:
http://192.168.61.170/phpmyadmin
(192.168.61.170 ist die IP meines Haupt-Raspberry Pi, die ich auf meinem sekundären PI-Rechner erreichen möchte). Allerdings erhalte ich die Fehlermeldung „Die Site kann nicht erreicht werden“.
Nachdem ich ein bisschen gelesen hatte, wurde mir klar, dass ich möglicherweise die bind_address
MySQL-Konfiguration ändern muss. Ich habe das auf meinem Haupt-Raspberry PI getan und es in geändert 0.0.0.0
.
Ich habe das mit dem Befehl bestätigt:
sudo netstat -tlnpu | grep mysql
Bildbeschreibung hier eingeben
Allerdings kann ich die PHPMyAdmin-Seite immer noch nicht erreichen, wenn ich sie auf meinem sekundären Raspberry Pi mit der IP-Adresse erreiche. Ich habe auch irgendwo einen Thread gelesen, in dem ein Problem mit der Firewall erwähnt wird, die den Port 3306 blockiert.
Ich habe diesen Befehl ausgeführt:
firewall-cmd --get-active-zones
Und es scheint, dass ich nicht einmal eine Firewall installiert habe, denn die Ausgabe lautet:
firewall-cmd: command not found
Von daher sollte es in meinem Fall kein Problem mit der Firewall geben.
Kann mir jemand andere Methoden zum Debuggen/Lösen dieses Problems empfehlen, um auf meinem sekundären Pi eine Verbindung zu MySQL herstellen zu können?
Denken Sie daran, dass beide Raspberry PI-Maschinen mit demselben WLAN verbunden sind.
Sekundärer Raspberry PI:
Antwort1
Ich möchte darauf hinweisen, dass es hier nichts Raspberry Pi-Spezifisches gibt. Sie haben einfach zwei Computer, von denen einer einen Datenbankserver hostet, mit dem der andere eine Verbindung herstellen möchte. Das Folgende ist für MySQL sowie seine Klone, d. h. Percona, MariaDB (das, das Sie wahrscheinlich verwenden), vollständig relevant.
Schritte zur Lösung:
I. Prüfen Sie, ob es über TCP/IP verfügbar ist:
2nd-RPi$ telnet 192.168.61.170 3306
(Soweit ich Sie verstehe, ist dies die Adresse des Computers, der eine Datenbank hostet.) Eine erfolgreiche Verbindung bedeutet, dass der MySQL-Dienst zuhört und die Firewall überhaupt nicht blockiert.
Wenn Sie keine Verbindung herstellen können, überprüfen Sie auf dem 1. RPi:
- wenn es lauscht,
ss -lnpt
(odernetstat -lnpt
) muss mysqld anzeigen, das auf dem TCP-Port3306
auf der Adresse0.0.0.0
oder::
oder*
oder der lokalen externen Adresse lauscht, mit der Sie sich verbinden, wie192.168.61.170
.
LISTEN 0 70 *:3306 *:* users:(("mysqld",pid=505,fd=32))
- ob die Firewall eine Verbindung zulässt. Dies ist im Allgemeinen ein ziemlich langes Thema. Ich empfehle oft, die gesamte Ausgabe auszugeben
iptables-save
und zu lesen. Das ist eine vollständige Firewall-Konfiguration. Ich denke, die Firewall-Konfiguration ist kein Hauptthema dieser Antwort. Wenn das also ein Problem ist, sollten Sie sich besser andere Fragen ansehen – dieses Thema wird sehr gut abgedeckt.
II. Jetzt müssen Sie über einen MySQL-Benutzer verfügen, der von anderen Hosts aus zugreifen darf.
In MySQL haben Benutzer nicht nur einen Namen und ein Passwort, sondern auch einen Host, von dem aus eine Verbindung möglich ist. Wenn Sie beispielsweise mit GRANT
dem Befehl einen Benutzer hinzufügen, konfigurieren Sie außerdem Folgendes:
`GRANT ALL PRIVILEGES ON `mydatabase`.* TO 'username'@'hostname' IDENTIFIED BY 'password';
Der Hostname kann ein Prozentzeichen sein %
, das in MySQL ein Platzhalter ist, d. h. es sollte eine Verbindung von „jedem Host“ zulassen.
Um zu überprüfen, ob Ihr Benutzer eine Verbindung von anderen Hosts aus herstellen kann, stellen Sie von dort aus eine Verbindung zu Ihrem MySQL her, wo es funktioniert, und überprüfen Sie eine Tabelle mysql.user
:
SELECT `Host`, `User`, `Password` FROM `mysql`.`user`;
(das sind Backticks, sie sind in diesem Fall nicht unbedingt notwendig, aber wenn der Tabellenname oder Feldname oder die Datenbank spezielle Symbole enthält oder mit Schlüsselwörtern in Konflikt steht, werden sie benötigt, daher ist es eine gute Angewohnheit, sie zu verwenden)
Es werden alle Ihre Benutzer angezeigt. Passwörter sind unwiderruflich verschlüsselt, das ist normal. Wenn es keinen Benutzerdatensatz gibt, der von einem anderen Host zugelassen ist, können Sie ihn erstellen. Sie können ihn mit einem Befehl erstellen, den ich oben gezeigt habe (verwenden Sie ihn %
anstelle des Hostnamens).
Zusätzliche und erweiterte Dokumentation finden Sie im MySQL-Referenzhandbuch, AbschnittZugriffskontrolle und Kontoverwaltung.
Antwort2
Ich poste dies als Antwort, da ich noch keinen Kommentar abgeben kann. Ich gehe davon aus, dass Sie sich in einem Heimnetzwerk befinden und es sich leisten können, Ihre Raspberrys vorübergehend zu trennen.
No route to host
bedeutet, dass Ihr Raspberry den anderen nicht finden kann. Ich sehe das am häufigsten, wenn A) der Zielhost nicht verfügbar/nicht verbunden ist oder B) der Switch oder Router den Datenverkehr blockiert. Es könnte eine Sicherheitsfunktion Ihres WLANs sein, die verhindert, dass verschiedene Arbeitsstationen miteinander Kontakt aufnehmen. Wenn Sie Ihre Arbeitsstationen über Ethernet verbinden, ist der gleiche Schutz möglicherweise nicht konfiguriert.
Eine schnelle und sehr einfache Möglichkeit zu prüfen, ob Ihr WLAN die Verbindung blockiert, wäre
- Um zu versuchen, von einer Himbeere zur anderen zu pingen und umgekehrt
- Um zu versuchen, beide Raspberrys über Ethernet zu verbinden, legen Sie für die Raspberrys zwei statische IPs im gleichen Bereich fest, versuchen Sie einen Ping und dann eine Telnet-Verbindung (beachten Sie, dass dies nur zu Testzwecken dient, da Sie das WLAN nicht gleichzeitig nutzen können).
Wenn eine dieser Möglichkeiten funktioniert, liegt das Problem wahrscheinlich an Ihrem WLAN. Wenn nicht, können Sie versuchen, tcpdump zu verwenden, um zu sehen, ob Pakete Ihren Client Raspberry verlassen und/oder Ihren BDD-Server erreichen:
Ein grundlegendes Beispiel für einen tcpdump-Befehl in Ihrem Fall ist tcpdump -i <connected_interface> host <other_raspberry_ip>
, mit connected_interface
dem Namen Ihrer netzwerkverbundenen Schnittstelle (führen Sie ifconfig
oder ip a
aus, um Ihre Schnittstellen anzuzeigen). Sie können diesen Befehl auf beiden Raspberrys ausführen, dann Ping oder Telnet verwenden und sich deren Ausgaben ansehen. Sie sollten Pakete auf beiden Raspberrys sehen.
Wenn eine Firewall etwas blockiert, sollte ein Blick in /var/log/messages dies zeigen.
Antwort3
Ich kann bestätigen, dass dies etwas mit den Netzwerkeinstellungen zu tun hat. Ich habe eine Verbindung zu einem anderen Netzwerk hergestellt und es scheint einwandfrei zu funktionieren!
Das Netzwerk, das ich normalerweise verwende, lässt keine Verbindungen zwischen zwei separaten Geräten zu. Ein gegenseitiges Pingen führt zu der Fehlermeldung „Zielhost nicht erreichbar“.
Ich nehme an, ich müsste auf meine Routereinstellungen zugreifen und dort etwas ändern?