Felsökning av etcd
Info
Hela proceduren ska utföras som root. För att höja dina privilegier till root kan du använda kommandot su -.
etcd är ett distribuerat nyckel-värde-lager som används som samordningspunkt mellan noderna i PostgreSQL-clustret. Det centraliserar och delar på ett tillförlitligt sätt clustrets tillstånd, bland annat ledarens identitet, medlemmarnas tillstånd och låsmekanismerna.
patroni förlitar sig på etcd för att styra valet av ledarnod och för att automatiskt utlösa redundansväxlingar när en incident inträffar. etcd är installerat på alla noder och garanterar clustrets övergripande konsekvens, utan att delta i lagringen eller behandlingen av PostgreSQL-data.
patroni är därför beroende av etcd och kan inte fungera korrekt om etcd inte fungerar.
Info
Konfigurationen för etcd lagras i filen /etc/default/etcd på varje nod.
Loggar
Hela proceduren bygger på loggarna för tjänsten etcd, som du hämtar med kommandot nedan:
Tips
Lägg till alternativet -f i kommandot för att följa loggarna i realtid:
Info
Loggarna för etcd finns också i /var/log/syslog.
Förklaring av felloggar
health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Om flödet TCP/2380 inte är öppet mellan två noder överskrids tidsgränsen för anslutningen och etcd skriver följande loggar:
| Apr 15 11:48:09 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:09 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:14 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:14 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:19 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:19 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
|
Där <PEER_PSQL_NODE_ID> är det ID som etcd har tilldelat målnoden och <PEER_IP_PSQL_NODE> är målnodens IP-adress.
Exempel
I vårt exempel är PostgreSQL-clustret konfigurerat på följande sätt:
| Nod |
Nodens IP |
ID i etcd |
| PSQL_1 |
192.168.1.1 |
53d2c129945ccb8b |
| PSQL_2 |
192.168.1.2 |
7176dd381f583d83 |
| PSQL_3 |
192.168.1.3 |
e3d5ef565a5bb46c |
Om du kör kommandot journalctl -fu etcd från servern PSQL_1 får du följande loggar:
| Apr 15 11:50:39 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:44 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:44 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:49 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:49 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
|
Dessa loggar visar att anslutningen från servern PSQL_1 till servern med IP-adressen 192.168.1.2 (PSQL_2) och ID 7176dd381f583d83 i etcd, på porten TCP/2380, inte lyckades: tidsgränsen överskreds.
Vi kan dra slutsatsen att flödet från servern PSQL_1 till servern PSQL_2 blockeras (DROP) av en brandvägg.
Detta flöde kan blockeras (DROP) av PostgreSQL-appliancens lokala brandvägg: kontrollera appliancens brandväggskonfiguration på de berörda noderna.
Om denna konfiguration är korrekt är det en brandvägg i infrastrukturen som blockerar (DROP) flödet TCP/2380 mellan de två noderna.
health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
När en anslutning mellan två noder avvisas rapporterar etcd det med följande loggar:
| Apr 15 14:04:30 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:30 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:35 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:35 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:40 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:40 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
|
Där <PEER_PSQL_NODE_ID> är det ID som etcd har tilldelat målnoden och <PEER_IP_PSQL_NODE> är målnodens IP-adress.
Avvisningen kan ha flera orsaker:
- Tjänsten
etcd fungerar inte som den ska eller är stoppad på målnoden. Kontrollera i så fall statusen (systemctl status etcd) och loggarna för tjänsten etcd på den noden.
- En brandvägg avvisar (
REJECT) flödet TCP/2380 mellan de två noderna. Det kan vara appliancens lokala brandvägg eller en brandvägg i infrastrukturen.
Exempel
I vårt exempel är PostgreSQL-clustret konfigurerat på följande sätt:
| Nod |
Nodens IP |
ID i etcd |
| PSQL_1 |
192.168.1.1 |
53d2c129945ccb8b |
| PSQL_2 |
192.168.1.2 |
7176dd381f583d83 |
| PSQL_3 |
192.168.1.3 |
e3d5ef565a5bb46c |
Om du kör kommandot journalctl -fu etcd från servern PSQL_1 får du följande loggar:
| Apr 15 14:04:15 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:15 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:20 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:20 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:25 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
|
Dessa loggar visar att anslutningen från servern PSQL_1 till servern med IP-adressen 192.168.1.3 (PSQL_3) och ID e3d5ef565a5bb46c i etcd, på porten TCP/2380, avvisades.
På servern PSQL_3 visar kommandot systemctl status etcd att etcd har stoppats:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | ○ etcd.service - etcd - highly-available key value store
Loaded: loaded (/lib/systemd/system/etcd.service; enabled; preset: enabled)
Active: inactive (dead) since Wed 2026-04-15 16:09:34 CEST; 38s ago
Duration: 1min 36.087s
Docs: https://etcd.io/docs
man:etcd
Process: 1400558 ExecStart=/usr/bin/etcd $DAEMON_ARGS (code=killed, signal=TERM)
Main PID: 1400558 (code=killed, signal=TERM)
CPU: 49.071s
Apr 15 12:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1665243 (took 583.297µs)
Apr 15 13:26:32 PSQL_3 etcd[1197556]: store.index: compact 1665949
Apr 15 13:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1665949 (took 574.496µs)
Apr 15 14:26:32 PSQL_3 etcd[1197556]: store.index: compact 1666658
Apr 15 14:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1666658 (took 567.196µs)
Apr 15 15:26:32 PSQL_3 etcd[1197556]: store.index: compact 1667368
Apr 15 15:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1667368 (took 568.096µs)
Apr 15 16:09:34 PSQL_3 systemd[1]: etcd.service: Deactivated successfully.
Apr 15 16:09:34 PSQL_3 systemd[1]: Stopped etcd.service - etcd - highly-available key value store.
Apr 15 16:09:34 PSQL_3 systemd[1]: etcd.service: Consumed 49.071s CPU time.
|
När etcd har startats är problemet löst.
rejected connection from "<PEER_IP_PSQL_NODE>:35956" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Om certifikaten för PostgreSQL-clustret har gått ut, eller om de inte har installerats eller förnyats korrekt på den nod där du läser loggarna, visas följande fel i loggarna för etcd:
| Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49274" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49294" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49288" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49316" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49304" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:60958" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
|
Där <PEER_IP_PSQL_NODE> är IP-adressen för en av noderna i clustret.
Denna logg visar att när den nod som du är ansluten till försökte upprätta en anslutning till de andra noderna i clustret (<PEER_IP_PSQL_NODE>) avvisade de den och rapporterade ett fel i den aktuella nodens certifikat.
Du bör därför kontrollera giltigheten för clustrets certifikat på den nod som du är ansluten till.
Varning
Om den certifikatutfärdare som är konfigurerad på en fjärrnod (i /etc/etcd/ca.crt) är felaktig visas felet också på den nod där du läser loggarna: det betyder då att fjärrnoden inte kan validera det certifikat som visas upp, eftersom den inte har rätt CA.
Exempel
I vårt exempel är PostgreSQL-clustret konfigurerat på följande sätt:
| Nod |
Nodens IP |
ID i etcd |
| PSQL_1 |
192.168.1.1 |
53d2c129945ccb8b |
| PSQL_2 |
192.168.1.2 |
7176dd381f583d83 |
| PSQL_3 |
192.168.1.3 |
e3d5ef565a5bb46c |
Om du kör kommandot journalctl -fu etcd från servern PSQL_1 får du följande loggar:
| Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.2:49274" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.3:49294" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.2:49288" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.2:49316" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.3:49304" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.3:60958" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
|
Dessa loggar visar att noderna PSQL_2 och PSQL_3 avvisade anslutningen från noden PSQL_1, eftersom certifikatet för PSQL_1 inte är giltigt i detta sammanhang.
Vi kontrollerar därför giltigheten för certifikaten på noden PSQL_1 genom att följa proceduren för kontroll av clustrets certifikat:
| openssl x509 -in /etc/etcd/peer.crt -noout -enddate
openssl x509 -in /etc/etcd/ca.crt -noout -enddate
|
Resultatet visar att nodens certifikat har gått ut:
| notAfter=Dec 18 14:04:09 2025 GMT
notAfter=Dec 17 14:03:47 2030 GMT
|
I så fall måste du förnya certifikaten för PostgreSQL-clustret.
error listing data dir: /var/lib/etcd/cleanroom
Om etcd inte har rätt behörigheter för katalogen /var/lib/etcd/cleanroom vägrar tjänsten att starta och skriver följande loggar:
| Apr 10 14:15:26 PSQL_1 etcd[454701]: Go OS/Arch: linux/amd64
Apr 10 14:15:26 PSQL_1 etcd[454701]: setting maximum number of CPUs to 1, total number of available CPUs is 1
Apr 10 14:15:26 PSQL_1 etcd[454701]: error listing data dir: /var/lib/etcd/cleanroom
Apr 10 14:15:26 PSQL_1 systemd[1]: etcd.service: Main process exited, code=exited, status=1/FAILURE
Apr 10 14:15:26 PSQL_1 systemd[1]: etcd.service: Failed with result 'exit-code'.
Apr 10 14:15:26 PSQL_1 systemd[1]: Failed to start etcd.service - etcd - highly-available key value store
|
Lös problemet genom att tilldela katalogen rätt behörigheter med följande kommando:
| chown -R etcd:etcd /var/lib/etcd/cleanroom
|