Incidentu reaģēšana

PostgreSQL "Connection refused": vai serveris darbojas? Kā to noskaidrot

"Connection refused" nozīmē, ka jūsu klients vispār nav sasniedzis PostgreSQL. Cēlonis gandrīz vienmēr ir viens no pieciem, un lielā datubāzē viens no tiem ir vienkārši serveris, kas pēc avārijas vēl atskaņo WAL.

· 12 min lasīšanai · AG Data komanda

PostgreSQL "Connection refused" ir klienta paziņojums, ka uz šīs adreses un porta neviens nepieņēma tā savienojumu. Tā nav autentifikācijas vai tiesību kļūda: PostgreSQL jūsu pieprasījumu nemaz neredzēja. Labā ziņa ir tā, ka cēloņu saraksts ir īss un parasti pietiek ar četrām komandām, lai saprastu, kurš no tiem ir jūsējais.

Pilno ziņojumu ģenerē libpq, tāpēc psql, lielākā daļa draiveru un daudzi rīki izdrukā to pašu tekstu. Pašreizējās versijās tas izskatās šādi:

$ psql -h 10.0.1.20 -U app appdb
psql: error: connection to server at "10.0.1.20", port 5432 failed: Connection refused
	Is the server running on that host and accepting TCP/IP connections?

$ psql appdb
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
	Is the server running locally and accepting connections on that socket?

Otrā rinda ir mājiens, nevis diagnoze. libpq pirmkods drukā "Is the server running on that host and accepting TCP/IP connections?" jebkurai šāda veida TCP kļūmei un soketa variantu lokāliem savienojumiem. Ja serveri sasniedzat un tas jūs noraida, saņemat citu kļūdu, piemēram, tās, kas aprakstītas mūsu pg_hba.conf ieraksta ceļvedī.

Atteikts, taimauts vai noraidīts: trīs dažādas problēmas

Pārbaude ar četrām komandām

# 1. vai serveris vispār atbild? (0 ok, 1 atsaka, 2 nav atbildes)
pg_isready -h 10.0.1.20 -p 5432; echo $?

# 2. datubāzes hostā: vai kaut kas klausās, un kur?
ss -ltnp | grep 5432
ss -lx  | grep PGSQL

# 3. vai serviss darbojas, un ko tas ierakstīja žurnālā?
systemctl status postgresql
journalctl -u postgresql --since "30 min ago"

# 4. kur serveris uzskata, ka tam jāklausās?
psql -c "SHOW listen_addresses" -c "SHOW port" -c "SHOW unix_socket_directories"

pg_isready ir ātrākais pirmais solis: tas atgriež 0, ja serveris pieņem savienojumus, 1, ja tos noraida (piemēram, starta laikā), 2, ja atbildes nav, un 3, ja mēģinājums netika veikts nepareizu parametru dēļ. Izejas kods 1 un izejas kods 2 ved uz pilnīgi atšķirīgu izmeklēšanu.

Biežākie cēloņi

  1. PostgreSQL nedarbojas. Tas avarēja, tika apturēts vai neizdevās startēt. Servisa statuss un servera žurnāls pasaka, kas tieši. Bieži iemesls, kāpēc tas nestartē, ir pilns disks, skatīt PostgreSQL disks pilns: pg_wal. Citi biežie ir drukas kļūda postgresql.conf, novecojis postmaster.pid pēc nekorektas apturēšanas vai trūkstošs datu katalogs, jo sējums netika piemontēts.
  2. Tas klausās tikai uz localhost. Noklusējuma listen_addresses ir localhost, kas atļauj tikai loopback TCP savienojumus. Attālie klienti saņem "Connection refused", līdz pievienojat servera adresi vai *. Šo parametru nolasa tikai servera startā, tāpēc reload neko nedara.
  3. Nepareizs ports. Noklusējums ir 5432, bet otrs klasteris tajā pašā hostā (bieži Debian un Ubuntu pēc jaunināšanas) bieži darbojas uz 5433. ss -ltnp parāda, kas patiešām ir piesaistīts.
  4. Nepareizs soketu katalogs. Lokāliem savienojumiem klientam un serverim jāsakrīt par unix_socket_directories. Dokumentācijā teikts, ka noklusējums parasti ir /tmp, bet to var mainīt kompilēšanas laikā, un Debian saimes pakotnes izmanto /var/run/postgresql. Klients, kas kompilēts vienam izkārtojumam, un serveris, kas kompilēts citam, dod "No such file or directory", lai gan PostgreSQL darbojas. Izmantojiet -h /ceļš/uz/soketu/katalogu, lai norādītu klientam pareizo vietu.
  5. Ugunsmūris pa vidu. Hosta ugunsmūris, mākoņa drošības grupa, Kubernetes tīkla politika. Noraidošs noteikums izskatās kā "refused", izmetošs noteikums izskatās kā taimauts.
# postgresql.conf (nepieciešams restarts, reload nepietiek)
listen_addresses = 'localhost,10.0.1.20'   # noklusējums ir 'localhost'
port = 5432
listen_addresses atvēršana ir tikai puse no izmaiņām. Kad serveris klausās uz publiskas vai privātas saskarnes, pg_hba.conf nosaka, kurš drīkst pieslēgties. Pievienojiet šaurus noteikumus lietotņu apakštīkliem, saglabājiet scram-sha-256 un nekad nekombinējiet listen_addresses = '*' ar plaši atvērtu ugunsmūri.

Smalks gadījums: adreses startā vēl nebija

Dokumentācijā norādīts, ka, ja listen_addresses nav tukšs, serveris startē, ja vien var klausīties vismaz uz vienas adreses, un par tām, kuras nevar atvērt, izdod tikai brīdinājumu. Ja PostgreSQL startē, pirms ir gatava virtuālā IP adrese, papildu saskarne vai mākoņa tīkla pievienojums, tas var sākt darbu tikai uz localhost un atteikt katram attālajam klientam, kamēr systemctl status rāda, ka tas darbojas. Meklējiet šo brīdinājumu starta žurnālā un lieciet servisam gaidīt vajadzīgo tīklu.

Kas mainās lielās datubāzēs: atjaunošana pēc avārijas prasa laiku

Noslogotā daudzterabaitu datubāzē visbiežākais iemesls, kāpēc klienti pēc incidenta nevar pieslēgties, nav konfigurācijas kļūda. Serveris atskaņo WAL. Pēc avārijas PostgreSQL jāatkārto viss, kas rakstīts kopš pēdējā kontrolpunkta, pirms tas pieņem savienojumus. Šajā laikā klienti redz the database system is starting up vai "Connection refused", ja postmaster vēl nav augšā, piemēram, kamēr uzraugs to vēl restartē.

LOG:  database system was interrupted; last known up at ...
LOG:  redo starts at 3A/1C000028
LOG:  redo in progress, elapsed time: 10.01 s, current LSN: 3A/5F2D1B40
LOG:  redo in progress, elapsed time: 20.02 s, current LSN: 3A/A1E09C88
...
LOG:  database system is ready to accept connections

Galvenās atziņas

PostgreSQL Savienojumi Problēmu novēršana Atjaunošana
Sadarbība ar mums

PostgreSQL nedarbojas un neatgriežas?

Mēs atjaunojam produkcijas PostgreSQL darbību: neveiksmīgi starti, ilga atjaunošana pēc avārijas, salūzuši failover un savienojumu problēmas, ar skaidru plānu, lai tas neatkārtotos.

Sazināties Vairāk no emuāra