Postgresql - uruchamianie nowego klastra na standardowych skryptach startowych

Archiwalne, stare wpisy FAQ i HowTo Użytkowników
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Postgresql - uruchamianie nowego klastra na standardowych skryptach startowych

Post autor: Bastian »

Witam.
Potrzebowałem uruchomić klaster bazy danych postgresql w innym miejscu w systemie niż domyślna:

Kod: Zaznacz cały

/usr/lib/postgresql/8.3/main/
Nie jest to wielkim problemem, gdyż wystarczy za pomocą standardowego pg_ctl utworzyć nowy klaster i tyle. Problem polega na tym, iż wcześniej trzeba wyłączyć chodzący klaster main, gdyż inaczej nie będziemy mogli uruchomić nowego (zajęty port). Jednak my chcemy, aby nowy klaster ładował się przy starcie systemu. Możemy to uzyskać na 2 sposoby:
[INDENT]- pisząc własny skrypt dla /init.d i podpinając za pomocą update-rc.d
- zmieniając/dodając pliki konfiguracyjne postgresa[/INDENT]
Pierwsze rozwiązanie, jest trudniejsze i trochę bezsensu, mając na uwadze, że możemy to zrobić prościej. Dodatkowo, musimy pamiętać o odpięciu (update-rc.d) oryginalnego skryptu ./postgresql-8.3 gdyż jego równoległy start z naszym spowoduje, iż jeden klaster na pewno się nie uruchomi gdyż w użyciu już będzie jeden port. Jeśli chcemy mieć więcej klastrów to również nasz skrypt musi być do tego przystosowany.

Prostszym rozwiązaniem jest edycja plików konfiguracyjnych w:

Kod: Zaznacz cały

/etc/postgresql/8.x/main
Z racji tego, że pliki startowe przeszukują wszystko co zawarte jest w /etc/postgresql

Zatem, zatrzymujemy postgresa:

Kod: Zaznacz cały

/etc/init.d/postgresql-8.3 stop
Wchodzimy do (pliki konfiguracyjne domyślnego klastra):

Kod: Zaznacz cały

/etc/postgresql/8.x/main
Otwieramy:

Kod: Zaznacz cały

postgresql.conf
W środku należy odszukać zawartość:

Kod: Zaznacz cały

data_directory = '/var/lib/postgresql/8.3/main/'        # use data in another 
                            #directory
                    # (change requires restart)
hba_file = '/var/lib/postgresql/8.3/main/pg_hba.conf'    # host-based 
                    #authentication file
                    # (change requires restart)
ident_file = '/var/lib/postgresql/8.3/main/pg_ident.conf'    # ident 
                    #configuration file
                    # (change requires restart)
i zamieniamy ścieżki na te prowadzące do nowego klastra.

Startujemy już nasz nowy klaster:

Kod: Zaznacz cały

/etc/init.d/postgresql-8.3 start
Teraz nasz nowy klaster jest obsługiwany przez domyślne skrypty. Należy pamiętać, iż konfiguracja klastra realizowana jest nadal przez:

Kod: Zaznacz cały

/etc/postgresql/8.x/main/postgresql.conf
zatem taki sam plik w nowej lokalizacji należy usunąć dla porządku. Może się zdarzyć, iż przy starcie nowego klastra otrzymamy komunikat o braku pliku uwierzytelnienia SSL/TLS. Wówczas chodzimy do katalogu nowego klastra i wydajemy kolejno polecenia:

Kod: Zaznacz cały

openssl req -new -text -out server.req
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
openssl req -x509 -in server.req -text -key server.key -out server.crt
chmod og-rwx server.key
czyli generujemy nowy klucz.

Teraz baza powinna wystartować. Można również zrobić dowiązanie symboliczne plików:

Kod: Zaznacz cały

server.crt -> /etc/ssl/certs/ssl-cert-snakeoil.pem
 server.key -> /etc/ssl/private/ssl-cert-snakeoil.key
I być może nawet jest to rozwiązanie bardziej eleganckie.

W przypadku gdy chcemy mieć dwa lub więcej działających klastrów, korzystających ze skryptów startowych Debiana, należy zdublować katalog main:

Kod: Zaznacz cały

cp -r /etc/postgresql/8.x/main /etc/postgresql/8.x/klaster2
i następnie w pliku:

Kod: Zaznacz cały

/etc/postgresql/8.x/klaster2/postgresql.conf
edytując odpowiednio ścieżki tak, aby wskazywały na kolejny klaster. Skrypty Debiana czytają wszystko co jest zapisane w /etc/postgresql/, tak więc pliki konfiguracyjne klastrów można zapisywać gdziekolwiek, ale dobrze jest zachować porządek i kłaść katalogi obok siebie.

Pozdrawiam.


PS. Podziękowania dla lessmiana2 za wskazówki ;)
Zablokowany