2015-11-25 19 views
5

Naprawdę nie mam pojęcia, na czym polega problem.Baza danych PostgreSQL losowo ulega awarii

Dzienniki czytać

FATAL: Niestety, zbyt wielu klientów już

kółko. Początkowo myślałem, że czasami połączenia trwały lub nie były zamykane poprawnie, przetestowałem to, łącząc się z bazą danych i sprawdzając, ile otwartych połączeń było w danym czasie, a odpowiedź zawsze była 1.

Próbowałem aby połączyć się z witryną, która korzysta z DB i udało mi się zobaczyć 2 lub 3 otwarte połączenia, które zostały natychmiast zamknięte po załadowaniu strony.

Moje pozostałe przypuszczenie jest takie, że czasami występują kolce w równoległych połączeniach ze stroną internetową, co powoduje, że baza danych przestaje akceptować nowe połączenia i w jakiś sposób nie pozwala na zerwanie bieżących połączeń.

Nie napisałem żadnego kodu, który łączy się z bazą danych, używam całkiem waniliowego backendu Django (1.7), który obsługuje wszystkie połączenia.

Nie znalazłem nic podczas wyszukiwania w Google, czy ktoś miał jakieś problemy?

EDIT:

Database configuration is here(PasteBin)

Niezbędna część:

port = 26445    # (change requires restart) 
max_connections = 500   # (change requires restart) 
unix_socket_directory = '/home/clearintent/webapps/norr2_db/run'  # (change requires restart) 

shared_buffers = 32MB   # min 128kB 
        # (change requires restart) 
log_destination = 'stderr'  # Valid values are combinations of 
logging_collector = on   # Enable capturing of stderr and csvlog 
log_directory = 'pg_log'  # directory where log files are written, 
log_filename = 'postgresql-%a.log' # log file name pattern, 
log_truncate_on_rotation = on  # If on, an existing log file with the 
log_rotation_age = 1d   # Automatic rotation of logfiles will 
log_rotation_size = 0   # Automatic rotation of logfiles will 
datestyle = 'iso, mdy' 
lc_messages = 'C'   # locale for system error message 
lc_monetary = 'C'   # locale for monetary formatting 
lc_numeric = 'C'   # locale for number formatting 
lc_time = 'C'    # locale for time formatting 
default_text_search_config = 'pg_catalog.english' 
+0

nie jest to awaria, FYI. –

+0

Proszę podać konfigurację bazy danych, być może problem jest tam. – noamk

+0

@CraigRinger Myślę, że to jest, nie mogę nawet zabić procesu, muszę "zabić -9" to – XelharK

Odpowiedz

3

Brzmi jak coś walnąć swój błąd PostgreSQL ale sama nie psuje DB.
Oznacza to po prostu, że ostatnia próba połączenia przekroczyła dozwoloną liczbę równoległych połączeń z bazą danych i została odrzucona.

Ale jeśli chcesz zrzucić ilość połączeń co minutę, można użyć tego skryptu

#!/bin/bash 

function spew_connections() { 
# Run psql on local if trust or auth is set. 
# Change dbadmin and dbname accordingly. 
/usr/bin/psql -d dbname -U dbadmin -w -t -c "SELECT localtimestamp(2), count(*) FROM pg_stat_activity;" 
} 

echo -n `spew_connections` >> /tmp/connections 
echo >> /tmp/connections 

A potem, aby wykonać go za pomocą crontab co minutę

crontab -e 
*/1 * * * * /path/to/executable/script 
+0

Dzięki. Spróbuję wrócić do wyników po kolejnej awarii. – XelharK

0

Django nie robi” t automatycznie zamyka połączenia.

Dodaj

'OPTIONS': { 
    'autocommit': True, 
} 

do konfiguracji bazy danych.

+2

Django [** robi ** automatycznie zamyka połączenia] (https://docs.djangoproject.com/en/1.7/ref/settings/#conn-max-age). Automatyczne zatwierdzanie jest [domyślnie włączone, ponieważ Django 1.6] (https://docs.djangoproject.com/en/1.7/ref/databases/#autocommit-mode) – Steven

+0

Tak, byłbym dość zszokowany. Używam Django 1.7. A także po moich testach widziałbym otwarte połączenia. – XelharK

+0

@Steven Tak, masz rację. Nie zauważyłem informacji o wersji Django. –

0

Spróbuj zainstalować narzędzia, takie jak pgBouncer między aplikacją a bazą danych.

PgBouncer to lekki moduł do obsługi połączeń dla PostgreSQL.

najważniejszych punktów:

[databases] 
pgbase = host=localhost dbname=bazdb 

[pgbouncer] 
listen_addr = * 
listen_port = 6432 

pool_mode = transaction 

A klient łączący się pgbase na localhost: 6432

+0

Czy nie zwiększyłoby to liczby połączeń, których potrzebuję? – XelharK

+0

Nie. PgBoucer zarządza połączeniami z bazą danych. Miałem ten sam problem w moim systemie. pgBoucer definitywnie rozwiązał ten problem. Kiedy złapię swojego administratora, wkleję tę konfigurację pgBoucer. –