PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Uruchamianie wielu instancji PostgreSQL na jednym hoście

Niedawno ogłosiliśmy wydanie ClusterControl 1.7.3, które zawiera szereg ulepszeń i nowo dodane funkcje. Jedną z tych nowych funkcji jest dodanie obsługi w ClusterControl, która umożliwia użytkownikowi konfigurowanie i zarządzanie wieloma instancjami PostgreSQL na tym samym hoście. Tę nową funkcję będziemy omawiać na naszym blogu poniżej, w tym powody, dla których ten typ konfiguracji może pomóc Ci zaoszczędzić na zasobach, a także dostarczyć instrukcje krok po kroku, jak wykonać ten typ instalacji w ClusterControl.

Dlaczego miałbyś potrzebować instalacji wielu PostgreSQL na jednym hoście?

Wraz z dzisiejszym szybkim rozwojem i ulepszaniem technologii, od sprzętu po oprogramowanie, zakres wymagań stał się bardziej elastyczny, elastyczny i skalowalny. Niektóre organizacje wolą nawet wykorzystać stos technologii, ponieważ łatwiej jest go skalować. Ponadto istnieją sytuacje, w których możesz chcieć wdrożyć serwer bazy danych na zaawansowanym, wydajnym serwerze, który zawiera duży procesor, dużo pamięci oraz szybkie, wydajne i trwałe urządzenia pamięci masowej, takie jak SSD/Fusion IO /NVMe. Czasami jednak może to być marnowanie zasobów, jeśli chcesz uruchomić współdzielone zasoby serwera bazy danych (np. Używać go jako urządzenia podrzędnego, maszyny do tworzenia kopii zapasowych na gorąco lub nawet jako serwera weryfikacji kopii zapasowych). W niektórych konfiguracjach możesz chcieć wykorzystać zasoby dostępne na potężnym serwerze zarówno jako serwer deweloperski, jak i serwer QA, aby uniknąć niepożądanych kosztów sprzętu (zamiast kupowania dedykowanej maszyny lub tworzenia nowej instancji obliczeniowej w chmurze).

Jak skonfigurować instalację Multi-PostgreSQL

W tym przykładzie utworzymy klaster z instalacją multi-PostgreSQL wraz z uruchomionymi instancjami multi-PostgreSQL na jednym hoście za pomocą ClusterControl.

Uwaga:od obecnej wersji (tj. ClusterControl 1.7.3), ClusterControl nie pozwala na tworzenie klastra lub inicjowanie klastra, jeśli określisz informacje o master i slave z zainstalowanym wielowersyjnym PostgreSQL lub z wieloma -instancje PostgreSQL działające na jednym hoście. Możesz jednak zaimportować węzeł z zainstalowaną wieloma wersjami lub wieloma instancjami PostgreSQL działającymi na jednym hoście.

Szczegóły i informacje o serwerze

Ponieważ obecnie nie możemy zainicjować ani utworzyć klastra, gdy jest zainstalowanych wiele wersji PostgreSQL, zaimportujemy istniejącą lub działającą instancję PostgreSQL. Poniżej znajdują się informacje o serwerze.

IP: 192.168.30.10
Użytkownik systemu operacyjnego: włóczęga
Typ i wersja systemu operacyjnego: Ubuntu 16.04.6 LTS (xenial)

i trochę informacji z mojego /etc/postgresql/9.6/multi_pg/postgresql.conf,

data_directory = '/data/pgsql/master/data'
hba_file = '/etc/postgresql/9.6/multi_pg/pg_hba.conf'   
ident_file = '/etc/postgresql/9.6/multi_pg/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.6-main.pid'  
listen_addresses = '*'  
port = 7654
max_connections = 100   
shared_buffers = 511995kB
work_mem = 10239kB
maintenance_work_mem = 127998kB 
dynamic_shared_memory_type = posix
wal_level = hot_standby 
full_page_writes = on   
wal_log_hints = on
checkpoint_completion_target = 0.9
max_wal_senders = 16
wal_keep_segments = 32  
hot_standby = on
effective_cache_size = 1535985kB
logging_collector = on  
log_timezone = 'Etc/UTC'
cluster_name = '9.6/multi_pg'   
stats_temp_directory = '/var/run/postgresql/9.6-main.pg_stat_tmp'
datestyle = 'iso, mdy'
timezone = 'Etc/UTC'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8' 
default_text_search_config = 'pg_catalog.english'

W przypadku gdy istniejące wersje zostały już zainstalowane:

[email protected]:/home/vagrant# dpkg -l | grep 'object-relational'
ii  postgresql-11                     11.4-1.pgdg16.04+1                         amd64        object-relational SQL database, version 11 server
ii  postgresql-9.2                    9.2.24-1.pgdg16.04+1                       amd64        object-relational SQL database, version 9.2 server
ii  postgresql-9.6                    9.6.14-1.pgdg16.04+1                       amd64        object-relational SQL database, version 9.6 server

Dodatkowo dla tej konfiguracji istnieją dodatkowe instancje, które są uruchomione...

[email protected]:/data/pgsql/master# ps axufwww | grep 'postgre[s]'
postgres  1243  0.0  0.8 186064 17916 ?        S    15:59   0:00 /usr/lib/postgresql/9.2/bin/postgres -D /var/lib/postgresql/9.2/main -c config_file=/etc/postgresql/9.2/main/postgresql.conf
postgres  1285  0.0  0.1 186064  3860 ?        Ss   15:59   0:00  \_ postgres: checkpointer process   
postgres  1286  0.0  0.2 186064  4620 ?        Ss   15:59   0:00  \_ postgres: writer process   
postgres  1287  0.0  0.1 186064  3860 ?        Ss   15:59   0:00  \_ postgres: wal writer process   
postgres  1288  0.0  0.2 186808  6008 ?        Ss   15:59   0:00  \_ postgres: autovacuum launcher process   
postgres  1289  0.0  0.1 145808  3736 ?        Ss   15:59   0:00  \_ postgres: stats collector process   
postgres  1246  0.0  1.2 309600 25884 ?        S    15:59   0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
postgres  1279  0.0  0.1 309600  4028 ?        Ss   15:59   0:00  \_ postgres: 11/main: checkpointer   
postgres  1280  0.0  0.1 309600  4028 ?        Ss   15:59   0:00  \_ postgres: 11/main: background writer   
postgres  1281  0.0  0.4 309600  9072 ?        Ss   15:59   0:00  \_ postgres: 11/main: walwriter   
postgres  1282  0.0  0.3 310012  6496 ?        Ss   15:59   0:00  \_ postgres: 11/main: autovacuum launcher   
postgres  1283  0.0  0.1 164516  3528 ?        Ss   15:59   0:00  \_ postgres: 11/main: stats collector   
postgres  1284  0.0  0.3 309892  6596 ?        Ss   15:59   0:00  \_ postgres: 11/main: logical replication launcher  

W tym przykładzie użyjemy PostgreSQL 9.6.

Budowanie klastra Master-Slave PostgreSQL

Aby utworzyć klaster, musimy ręcznie skonfigurować instancję PostgreSQL, a następnie zaimportować ją do ClusterControl. Alternatywnie możemy utworzyć klaster z tylko jednym węzłem głównym i pozwolić ClusterControl obsłużyć go, ale aby to zrobić, będziemy musieli zamknąć wszystkie inne działające węzły. Nie byłoby to idealne rozwiązanie, jeśli pracujesz na obciążonych serwerach baz danych PostgreSQL.

Teraz zajmijmy się konfiguracją ręczną...

[email protected]:/etc/postgresql/9.6/multi_pg# sudo -iu postgres /usr/lib/postgresql/9.6/bin/pg_ctl -D /data/pgsql/master/data initdb
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /data/pgsql/master/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    /usr/lib/postgresql/9.6/bin/pg_ctl -D /data/pgsql/master/data -l logfile start

Następnie uruchom bazę danych, uruchamiając poniższe polecenie,

[email protected]:/etc/postgresql/9.6/multi_pg# sudo -iu postgres /usr/lib/postgresql/9.6/bin/pg_ctl -D /data/pgsql/master/data  -o "-c config_file=/etc/postgresql/9.6/multi_pg/postgresql.conf" -l /var/log/postgresql/postgresql-9.6-master.log start  
server starting

Sprawdźmy teraz, czy instancja działa i używa żądanego portu, którego użyliśmy:

[email protected]:/etc/postgresql/9.6/multi_pg# netstat -ntlvp46|grep postgres
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      1246/postgres
tcp        0      0 127.0.0.1:5433          0.0.0.0:*               LISTEN      1243/postgres
tcp        0      0 0.0.0.0:7654            0.0.0.0:*               LISTEN      18403/postgres
tcp6       0      0 :::7654                 :::*           

Teraz wygląda poprawnie. Pid 18403 pokazuje, że jesteśmy w stanie go uruchomić i mamy otwarte zarówno IPv4, jak i IPv6.

Teraz zaimportujmy to do ClusterControl. Przejdź do Wdrażanie → Importuj istniejący serwer/bazę danych , aby zaimportować żądany węzeł główny, właśnie go skonfigurowaliśmy.

Po naciśnięciu przycisku Importuj będziesz mógł mieć klaster z jednym węzłem głównym, tak jak poniżej:

Teraz utwórzmy urządzenie podrzędne na tym samym hoście (tj. z adresem IP 192.168.30.10).

I nie martw się, ClusterControl obsłuży to za Ciebie, jak pokazano poniżej przykładowy dziennik aktywności zadania.

Możesz zobaczyć, że został pomyślnie skonfigurowany i zainstalowany. Z technicznego punktu widzenia ClusterControl utworzy katalog pod /etc/postgresql//p dla systemu opartego na Debianie/Ubuntu i wygeneruj wymagane pliki konfiguracyjne. Podczas gdy w przypadku systemów opartych na RHEL/Centos/Fedora, wygeneruje się w katalogu danych ścieżka.

Potwierdźmy teraz pg_lsclusters i zobacz, czy instancja multi-PostgreSQL działa równolegle na hoście. Zobacz poniżej:

[email protected]:/var/log/postgresql# pg_lsclusters 
Ver Cluster  Port Status          Owner    Data directory               Log file
9.2 main     5433 online          postgres /var/lib/postgresql/9.2/main /var/log/postgresql/postgresql-9.2-main.log
9.6 multi_pg 7654 online          postgres /data/pgsql/master/data      /var/log/postgresql/postgresql-9.6-master.log
9.6 pg_7653  7653 online,recovery postgres /data/pgsql/slave/data       pg_log/postgresql-%Y-%m-%d_%H%M%S.log
11  main     5432 online          postgres /var/lib/postgresql/11/main  /var/log/postgresql/postgresql-11-main.log

Oprócz tego metryki dotyczące klastrów replikacji logicznej są widoczne poniżej:

Promowanie jednostki podrzędnej w instancjach działających z wieloma serwerami PostgreSQL na jednym hoście

Promocja Slave jest łatwa w przypadku instancji działających z wieloma serwerami PostgreSQL na jednym hoście. Jak widać poniżej, ten typ środowiska działa bezbłędnie, gdy jest obsługiwany przez ClusterControl.

Zobaczmy teraz, co dzieje się w tle, gdy ClusterControl promuje urządzenie podrzędne. Zobacz pełną specyfikację pracy i szczegóły

[09:01:02]:Successfully promoted a new master.
[09:01:02]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: promote finished (this is the new master).
[09:01:02]:Servers after promote:
<em style='color: #1abc9c;'>192.168.30.10</em>:7653:
&bull; Role: master (slaves: 1)
&bull; Status: CmonHostOnline (NODE_CONNECTED)
&bull; Receive/replay: 0/30020C0; 0/30020C0

<em style='color: #1abc9c;'>192.168.30.10</em>:7654:
&bull; Role: slave (slaves: 0)
&bull; Status: CmonHostOnline (NODE_CONNECTED)
&bull; Receive/replay: 0/30020C0; 0/30020C0
&bull; Master: 192.168.30.10:7653


[09:01:02]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Restarted with new master.
[09:01:02]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Started PostgreSQL.
[09:00:53]:<em style='color: #1abc9c;'>192.168.30.10</em>: done
server started
[09:00:53]:<em style='color: #1abc9c;'>192.168.30.10</em>: waiting for server to start....
[09:00:52]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Executing: su - postgres -c '/usr/lib/postgresql/9.6/bin/pg_ctl start -w -o "-p 7654" --pgdata=/etc/postgresql/9.6/multi_pg/ --log /var/log/postgresql/postgresql-11-main.log'
[09:00:51]:192.168.30.10:7654: Start postgreSQL node.
[09:00:51]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Starting PostgreSQL.
[09:00:51]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Successfully created '<em style='color: #109602;'>/data/pgsql/master/data/recovery.conf</em>'.
[09:00:50]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Creating '<em style='color: #109602;'>/data/pgsql/master/data/recovery.conf</em>': Setting <em style='color: #1abc9c;'>192.168.30.10</em>:7653 as master.
[09:00:50]:<em style='color: #1abc9c;'>192.168.30.10</em>: servers diverged at WAL position 0/3001890 on timeline 1
no rewind required
[09:00:49]:Running /usr/lib/postgresql/9.6/bin/pg_rewind --target-pgdata=/data/pgsql/master/data --source-server="host=192.168.30.10 port=7653 user=dbapgadmin password=***** dbname=postgres"
[09:00:47]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Granting host (<em style='color: #1abc9c;'>192.168.30.10</em>:7654).
[09:00:45]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopped PostgreSQL.
[09:00:38]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Waiting to stop.
[09:00:38]:192.168.30.10:7654: node is already stopped. No need to stop it.
[09:00:38]:192.168.30.10:7654: Stop postgreSQL node.
[09:00:38]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopping PostgreSQL.
[09:00:38]:Switching slaves to the new master.
[09:00:38]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Became master, ok.
[09:00:37]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Waiting to become a master.
[09:00:37]:<em style='color: #1abc9c;'>192.168.30.10</em>: server promoting
[09:00:36]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Attempting to promote using <strong style='color: #59a449;'>pg_ctl</strong>.
[09:00:36]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Promoting host.
[09:00:35]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopped PostgreSQL.
[09:00:28]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Waiting to stop.
[09:00:28]:<em style='color: #1abc9c;'>192.168.30.10</em>: done
server stopped
[09:00:28]:<em style='color: #1abc9c;'>192.168.30.10</em>: waiting for server to shut down....
[09:00:27]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Executing: su - postgres -c '/usr/lib/postgresql/9.6/bin/pg_ctl stop --pgdata=/etc/postgresql/9.6/multi_pg/'
[09:00:26]:192.168.30.10:7654: Stop postgreSQL node.
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopping PostgreSQL.
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopping the current master.
[09:00:26]:Switching over to <em style='color: #1abc9c;'>192.168.30.10</em>:7653 (previous master is <em style='color: #1abc9c;'>192.168.30.10</em>:7654)
[09:00:26]:Servers:
<em style='color: #1abc9c;'>192.168.30.10</em>:7653:
&bull; Role: slave (slaves: 0)
&bull; Status: CmonHostOnline (NODE_CONNECTED)
&bull; Receive/replay: 0/3001820; 0/3001820
&bull; Master: 192.168.30.10:7654

<em style='color: #1abc9c;'>192.168.30.10</em>:7654:
&bull; Role: master (slaves: 1)
&bull; Status: CmonHostOnline (NODE_CONNECTED)
&bull; Receive/replay: 0/3001820; 0/3001820


[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Current master is <em style='color: #1abc9c;'>192.168.30.10</em>:7654.
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Promoting server to master.
Job spec: {
    "command": "promote_replication_slave",
    "group_id": 1,
    "group_name": "admins",
    "job_data": 
    {
        "clusterId": "6",
        "slave_address": "192.168.30.10:7653"
    },
    "user_id": 1,
    "user_name": "[email protected]"
}

Jak widać, było to obsługiwane płynnie nawet na tym samym hoście. Wynik topologii pokazuje, że został pomyślnie wypromowany.

Wniosek

Cieszymy się, że wydanie ClusterControl 1.7.3 ma wiele do zaoferowania. Uważamy również, że ta nowa instancja Multi-PostgreSQL działająca na tej samej funkcji hosta jest kolejnym wielkim krokiem w ulepszaniu naszej ogólnej obsługi PostgreSQL. Wypróbuj ją i daj nam znać, co myślisz o tej nowej funkcji poniżej.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy wartość istnieje w tablicy Postgres

  2. Aktualizacja do PostgreSQL 11 z replikacją logiczną

  3. serial w postgresie jest zwiększany mimo że dodałem na konflikcie nic nie rób

  4. Dodanie nowej wartości do istniejącego typu ENUM

  5. Jak działa current_time w PostgreSQL