Řešení potíží s etcd
Informace
Celý postup je nutné provádět jako root. Ke zvýšení oprávnění na úroveň root můžete použít příkaz su -.
etcd je distribuované úložiště typu klíč-hodnota, které slouží jako koordinační bod mezi uzly clusteru PostgreSQL. Spolehlivě centralizuje a sdílí stav clusteru, včetně identity vedoucího uzlu, stavu členů a zamykacích mechanismů.
patroni se spoléhá na etcd při řízení volby vedoucího uzlu a při automatickém spouštění převzetí služeb při selhání, když dojde k incidentu. Služba etcd, nainstalovaná na všech uzlech, zaručuje celkovou konzistenci clusteru, aniž by se podílela na ukládání nebo zpracování dat PostgreSQL.
Služba patroni je tedy závislá na službě etcd a nemůže správně fungovat, pokud etcd nefunguje.
Informace
Konfigurace etcd je uložena v souboru /etc/default/etcd na každém uzlu.
Logs
Celý postup vychází z logů služby etcd, které získáte níže uvedeným příkazem:
Tip
Chcete-li sledovat logy v reálném čase, přidejte k příkazu možnost -f:
Informace
Logy etcd jsou dostupné také v /var/log/syslog.
Vysvětlení chybových logů
health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Pokud síťový tok TCP/2380 mezi dvěma uzly není otevřen, vyprší časový limit připojení a etcd zapíše následující logy:
| 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
|
Kde <PEER_PSQL_NODE_ID> je ID přiřazené cílovému uzlu službou etcd a <PEER_IP_PSQL_NODE> je IP adresa cílového uzlu.
Příklad
V našem příkladu je cluster PostgreSQL nakonfigurován takto:
| Uzel |
IP uzlu |
ID etcd |
| PSQL_1 |
192.168.1.1 |
53d2c129945ccb8b |
| PSQL_2 |
192.168.1.2 |
7176dd381f583d83 |
| PSQL_3 |
192.168.1.3 |
e3d5ef565a5bb46c |
Spuštění příkazu journalctl -fu etcd na serveru PSQL_1 vrátí následující logy:
| 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
|
Tyto logy ukazují, že připojení ze serveru PSQL_1 k serveru s IP adresou 192.168.1.2 (PSQL_2) a ID etcd 7176dd381f583d83 na portu TCP/2380 neproběhlo úspěšně: vypršel časový limit.
Lze z toho vyvodit, že síťový tok ze serveru PSQL_1 na server PSQL_2 zahazuje (DROP) brána firewall.
Tento síťový tok může zahazovat (DROP) místní brána firewall appliance PostgreSQL: zkontrolujte konfiguraci brány firewall appliance na příslušných uzlech.
Pokud je tato konfigurace správná, zahazuje (DROP) síťový tok TCP/2380 mezi oběma uzly brána firewall infrastruktury.
health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Když je připojení mezi dvěma uzly odmítnuto, etcd to oznámí následujícími logy:
| 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
|
Kde <PEER_PSQL_NODE_ID> je ID přiřazené cílovému uzlu službou etcd a <PEER_IP_PSQL_NODE> je IP adresa cílového uzlu.
Odmítnutí může mít několik příčin:
- Služba
etcd na cílovém uzlu nefunguje správně nebo je zastavená. V takovém případě zkontrolujte stav (systemctl status etcd) a logy služby etcd na tomto uzlu.
- Brána firewall odmítá (
REJECT) síťový tok TCP/2380 mezi oběma uzly. Může jít o místní bránu firewall appliance nebo o bránu firewall infrastruktury.
Příklad
V našem příkladu je cluster PostgreSQL nakonfigurován takto:
| Uzel |
IP uzlu |
ID etcd |
| PSQL_1 |
192.168.1.1 |
53d2c129945ccb8b |
| PSQL_2 |
192.168.1.2 |
7176dd381f583d83 |
| PSQL_3 |
192.168.1.3 |
e3d5ef565a5bb46c |
Spuštění příkazu journalctl -fu etcd na serveru PSQL_1 vrátí následující logy:
| 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
|
Tyto logy ukazují, že připojení ze serveru PSQL_1 k serveru s IP adresou 192.168.1.3 (PSQL_3) a ID etcd e3d5ef565a5bb46c na portu TCP/2380 bylo odmítnuto.
Na serveru PSQL_3 příkaz systemctl status etcd ukazuje, že služba etcd je zastavená:
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.
|
Po spuštění služby etcd je problém vyřešen.
rejected connection from "<PEER_IP_PSQL_NODE>:35956" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Pokud vypršela platnost certifikátů clusteru PostgreSQL nebo pokud nebyly správně nainstalovány či obnoveny na uzlu, ze kterého čtete logy, zobrazí se v logech etcd následující chyba:
| 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")
|
Kde <PEER_IP_PSQL_NODE> je IP adresa jednoho z uzlů clusteru.
Tento log ukazuje, že když se uzel, ke kterému jste připojeni, pokusil navázat spojení s ostatními uzly clusteru (<PEER_IP_PSQL_NODE>), tyto uzly jej odmítly a nahlásily chybu certifikátu aktuálního uzlu.
Měli byste proto zkontrolovat platnost certifikátů clusteru na uzlu, ke kterému jste připojeni.
Upozornění
Pokud je certifikační autorita nakonfigurovaná na vzdáleném uzlu (v /etc/etcd/ca.crt) nesprávná, chyba se zobrazí také na uzlu, ze kterého čtete logy: v takovém případě znamená, že vzdálený uzel nemůže ověřit předložený certifikát, protože nemá správnou CA.
Příklad
V našem příkladu je cluster PostgreSQL nakonfigurován takto:
| Uzel |
IP uzlu |
ID etcd |
| PSQL_1 |
192.168.1.1 |
53d2c129945ccb8b |
| PSQL_2 |
192.168.1.2 |
7176dd381f583d83 |
| PSQL_3 |
192.168.1.3 |
e3d5ef565a5bb46c |
Spuštění příkazu journalctl -fu etcd na serveru PSQL_1 vrátí následující logy:
| 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")
|
Tyto logy ukazují, že uzly PSQL_2 a PSQL_3 odmítly připojení z uzlu PSQL_1, protože certifikát uzlu PSQL_1 není v tomto kontextu platný.
Zkontrolujeme proto platnost certifikátů uzlu PSQL_1 podle postupu kontroly certifikátů clusteru:
| openssl x509 -in /etc/etcd/peer.crt -noout -enddate
openssl x509 -in /etc/etcd/ca.crt -noout -enddate
|
Výstup ukazuje, že platnost certifikátu uzlu vypršela:
| notAfter=Dec 18 14:04:09 2025 GMT
notAfter=Dec 17 14:03:47 2030 GMT
|
V takovém případě je nutné obnovit certifikáty clusteru PostgreSQL.
error listing data dir: /var/lib/etcd/cleanroom
Pokud etcd nemá správná oprávnění k adresáři /var/lib/etcd/cleanroom, služba se odmítne spustit a zapíše následující logy:
| 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
|
Chcete-li tento problém vyřešit, přiřaďte adresáři správná oprávnění následujícím příkazem:
| chown -R etcd:etcd /var/lib/etcd/cleanroom
|