Skoči na vsebino

Odpravljanje težav z etcd

Informacije

Celoten postopek je treba izvesti kot root. Za dvig privilegijev na raven root lahko uporabite ukaz su -.

etcd je porazdeljena shramba ključev in vrednosti, ki se uporablja kot točka usklajevanja med vozlišči gruče PostgreSQL. Zanesljivo centralizira in deli stanje gruče, vključno z identiteto vodje, stanjem članov in mehanizmi zaklepanja.

patroni se zanaša na etcd pri vodenju izbire vodilnega vozlišča in samodejnem sprožanju preklopov ob napaki, ko pride do incidenta. etcd, nameščen na vseh vozliščih, zagotavlja splošno skladnost gruče, ne da bi sodeloval pri shranjevanju ali obdelavi podatkov PostgreSQL.

patroni je torej odvisen od etcd in ne more pravilno delovati, če etcd ne deluje.

Informacije

Konfiguracija etcd je shranjena v datoteki /etc/default/etcd na vsakem vozlišču.

Logs

Celoten postopek temelji na dnevnikih storitve etcd, ki jih dobite s spodnjim ukazom:

1
journalctl -u etcd

Nasvet

Če želite dnevnike spremljati sproti, ukazu dodajte možnost -f:

1
journalctl -fu etcd

Informacije

Dnevniki etcd so na voljo tudi v /var/log/syslog.

Razlaga dnevnikov napak

health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout

Če tok TCP/2380 med dvema vozliščema ni odprt, za povezavo poteče časovna omejitev in etcd zapiše naslednje dnevniške zapise:

1
2
3
4
5
6
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

Pri tem je <PEER_PSQL_NODE_ID> ID, ki ga etcd dodeli ciljnemu vozlišču, <PEER_IP_PSQL_NODE> pa naslov IP ciljnega vozlišča.

Primer

V našem primeru je gruča PostgreSQL konfigurirana takole:

Vozlišče IP vozlišča ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Zagon ukaza journalctl -fu etcd na strežniku PSQL_1 da naslednje dnevniške zapise:

1
2
3
4
5
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

Ti dnevniški zapisi kažejo, da povezava s strežnika PSQL_1 do strežnika z naslovom IP 192.168.1.2 (PSQL_2) in ID-jem etcd 7176dd381f583d83 na vratih TCP/2380 ni uspela: potekla je časovna omejitev. Iz tega lahko sklepamo, da tok s strežnika PSQL_1 do strežnika PSQL_2 zavrže (DROP) požarni zid.

Ta tok lahko zavrže (DROP) lokalni požarni zid appliance PostgreSQL: preverite konfiguracijo požarnega zidu appliance na zadevnih vozliščih. Če je ta konfiguracija pravilna, tok TCP/2380 med obema vozliščema zavrže (DROP) požarni zid infrastrukture.

health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused

Ko je povezava med dvema vozliščema zavrnjena, etcd to sporoči z naslednjimi dnevniškimi zapisi:

1
2
3
4
5
6
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

Pri tem je <PEER_PSQL_NODE_ID> ID, ki ga etcd dodeli ciljnemu vozlišču, <PEER_IP_PSQL_NODE> pa naslov IP ciljnega vozlišča.

Zavrnitev ima lahko več vzrokov:

  • Storitev etcd na ciljnem vozlišču ne deluje pravilno ali je ustavljena. V tem primeru preverite stanje (systemctl status etcd) in dnevnike storitve etcd na tem vozlišču.
  • Požarni zid zavrne (REJECT) tok TCP/2380 med obema vozliščema. To je lahko lokalni požarni zid appliance ali požarni zid infrastrukture.
Primer

V našem primeru je gruča PostgreSQL konfigurirana takole:

Vozlišče IP vozlišča ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Zagon ukaza journalctl -fu etcd na strežniku PSQL_1 da naslednje dnevniške zapise:

1
2
3
4
5
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

Ti dnevniški zapisi kažejo, da je bila povezava s strežnika PSQL_1 do strežnika z naslovom IP 192.168.1.3 (PSQL_3) in ID-jem etcd e3d5ef565a5bb46c na vratih TCP/2380 zavrnjena.

Na strežniku PSQL_3 ukaz systemctl status etcd pokaže, da je etcd ustavljen:

 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.

Ko se etcd zažene, je težava odpravljena.

rejected connection from "<PEER_IP_PSQL_NODE>:35956" (error "remote error: tls: bad certificate", ServerName "PSQL_1")

Če so potrdila gruče PostgreSQL potekla ali če niso bila pravilno nameščena ali obnovljena na vozlišču, s katerega berete dnevnike, se v dnevnikih etcd prikaže naslednja napaka:

1
2
3
4
5
6
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")

Pri tem je <PEER_IP_PSQL_NODE> naslov IP enega od vozlišč gruče.

Ta dnevniški zapis kaže, da so druga vozlišča gruče (<PEER_IP_PSQL_NODE>) zavrnila povezavo, ko jo je vozlišče, s katerim ste povezani, poskušalo vzpostaviti, in pri tem sporočila napako potrdila trenutnega vozlišča.

Zato preverite veljavnost potrdil gruče na vozlišču, s katerim ste povezani.

Opozorilo

Če je overitelj potrdil, konfiguriran na oddaljenem vozlišču (v /etc/etcd/ca.crt), napačen, se napaka prav tako prikaže na vozlišču, s katerega berete dnevnike: takrat pomeni, da oddaljeno vozlišče ne more preveriti predloženega potrdila, ker nima pravega overitelja potrdil (CA).

Primer

V našem primeru je gruča PostgreSQL konfigurirana takole:

Vozlišče IP vozlišča ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Zagon ukaza journalctl -fu etcd na strežniku PSQL_1 da naslednje dnevniške zapise:

1
2
3
4
5
6
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")

Ti dnevniški zapisi kažejo, da sta vozlišči PSQL_2 in PSQL_3 zavrnili povezavo z vozlišča PSQL_1, ker potrdilo vozlišča PSQL_1 v tem kontekstu ni veljavno.

Zato preverimo veljavnost potrdil vozlišča PSQL_1 po postopku preverjanja potrdil gruče:

1
2
openssl x509 -in /etc/etcd/peer.crt -noout -enddate
openssl x509 -in /etc/etcd/ca.crt -noout -enddate

Izpis pokaže, da je potrdilo vozlišča poteklo:

1
2
notAfter=Dec 18 14:04:09 2025 GMT
notAfter=Dec 17 14:03:47 2030 GMT

V tem primeru morate obnoviti potrdila gruče PostgreSQL.

error listing data dir: /var/lib/etcd/cleanroom

Če etcd nima ustreznih dovoljenj za mapo /var/lib/etcd/cleanroom, se storitev noče zagnati in zapiše naslednje dnevniške zapise:

1
2
3
4
5
6
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

Težavo odpravite tako, da mapi z naslednjim ukazom dodelite ustrezna dovoljenja:

1
chown -R etcd:etcd /var/lib/etcd/cleanroom