sql >> Databasteknik >  >> RDS >> PostgreSQL

Köra flera PostgreSQL-instanser på en enda värd

Vi tillkännagav nyligen lanseringen av ClusterControl 1.7.3 som innehåller en mängd förbättringar och nyligen tillagda funktioner. En av dessa nya funktioner är tillägget av stöd i ClusterControl för att låta en användare ställa in och hantera flera PostgreSQL-instanser på samma värd. Den här nya funktionen är vad vi kommer att diskutera i vår blogg nedan, inklusive anledningar till varför den här typen av installation kan hjälpa dig att spara på resurser samt tillhandahålla steg-för-steg-instruktioner för hur du uppnår denna typ av installation i ClusterControl.

Varför skulle du behöva en Multiple-PostgreSQL-installation på en enda värd?

Med dagens snabba utveckling och förbättring av teknologier från hårdvara till mjukvara har kravomfånget blivit mer anpassningsbart, flexibelt och skalbart. Vissa organisationer föredrar till och med att utnyttja teknikstacken eftersom det är lättare att skala den. Dessutom finns det situationer där du kanske vill distribuera en databasserver på en avancerad, kraftfull server som innehåller en stor CPU, mycket minne och snabba, kraftfulla och icke-flyktiga lagringsenheter som SSD/Fusion IO /NVMe. Detta kan dock ibland vara ett slöseri med resurser om du funderar på att köra de delade resurserna för en databasserver (som att använda den som en slav, en hot-backup-maskin eller till och med som en backup-verifieringsserver). I vissa inställningar kanske du vill använda de tillgängliga resurserna på din kraftfulla server som både din utvecklings- och QA-server för att undvika oönskade hårdvarukostnader (istället för att köpa en dedikerad maskin eller skapa en ny beräkningsinstans i molnet).

Hur man ställer in en Multi-PostgreSQL-installation

För det här exemplet skapar vi ett kluster med en multi-PostgreSQL-installation tillsammans med multi-PostgreSQL-körningsinstanser i en enda värd med ClusterControl.

Obs:från och med den nuvarande versionen (d.v.s. ClusterControl 1.7.3) tillåter ClusterControl dig inte att skapa ett kluster eller initiera ett kluster om du anger en master- och slavinformation med en multiversion installerad PostgreSQL eller med en multiversion -instanser av PostgreSQL som körs inom en enda värd. Du kan dock importera en nod med flera versioner installerade eller flera instanser av PostgreSQL som körs i en enda värd.

Serverinformation och information

Eftersom vi för närvarande inte kan initiera eller skapa ett kluster när det finns flera versioner installerade av PostgreSQL, importerar vi en befintlig eller kör instans av PostgreSQL. Nedan finns serverinformationen.

IP: 192.168.30.10
OS-användare: vagrant
OStyp och version: Ubuntu 16.04.6 LTS (xenial)

och lite information från min /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'

Där en befintlig version redan har installerats:

[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

Dessutom, för den här installationen, finns det ytterligare instanser som körs...

[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  

För det här exemplet kommer vi att använda PostgreSQL 9.6.

Bygga Master-Slave PostgreSQL-klustret

För att skapa ett kluster måste vi ställa in PostgreSQL-instansen manuellt och sedan importera den instansen till ClusterControl senare. Alternativt kan vi skapa ett kluster med bara en huvudnod och låta ClusterControl hantera det men för att göra detta måste vi stänga av alla andra körande noder. Detta skulle inte vara idealiskt om du arbetar på upptagna PostgreSQL-databasservrar.

Låt oss nu göra den manuella installationen... 

[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

Starta sedan databasen genom att köra kommandot nedan,

[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

Låt oss nu verifiera om instansen körs och använder den önskade porten vi använde:

[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                 :::*           

Nu ser det rätt ut. Pid av 18403 visar att vi kan köra det och har både IPv4 och IPv6 öppna.

Låt oss nu importera detta till ClusterControl. Gå till Distribuera → Importera befintlig server/databas , för att importera den önskade huvudnoden har vi bara ställt in.

När du tryckt på knappen Importera kommer du att kunna ha ett kluster med en huvudnod precis som nedan:

Låt oss nu skapa en slav inom samma värd (dvs med IP 192.168.30.10).

Och oroa dig inte, ClusterControl kommer att hantera det åt dig som ett exempel på jobbaktivitetslogg visar nedan.

Du kan se att den konfigurerades och installerades framgångsrikt. Tekniskt sett kommer ClusterControl att skapa en katalog under /etc/postgresql//p för Debian/Ubuntu-baserat system och generera de nödvändiga konfigurationsfilerna. Medan för RHEL/Centos/Fedora-baserade system genereras den under data_dir sökväg.

Låt oss nu bekräfta med pg_lsclusters och se om multi-PostgreSQL-instansen körs parallellt i en värd. Se nedan:

[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

Utöver detta visas mätvärdena för de logiska replikeringsklustren nedan:

Marknadsföra slaven i en Multi-PostgreSQL-körningsinstans i en enda värd

Slav marknadsföring är lätt för en multi-PostgreSQL kör instanser i en enda värd. Som du kan se nedan fungerar den här typen av miljö felfritt när den hanteras av ClusterControl.

Låt oss nu se vad som händer i bakgrunden medan ClusterControl marknadsför slaven. Se hela jobbspecifikationen och detaljerna

[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]"
}

Som du ser sköttes det smidigt även på samma värd. Topologiresultatet visar att det har marknadsförts framgångsrikt.

Slutsats

Vi är glada över lanseringen av ClusterControl 1.7.3 och tror att den har mycket att erbjuda. Vi tror också att dessa nya Multi-PostgreSQL-instanser som körs på samma värdfunktion är ytterligare ett bra steg för att förbättra vårt övergripande stöd för PostgreSQL. Testa det och låt oss veta vad du tycker nedan om den här nya funktionen.


  1. Föråldrade funktioner att ta ur din verktygslåda – Del 3

  2. Hur man programmatiskt genererar DDL från Oracle-databas?

  3. När DISTINCT <> GROUP BY

  4. Hur man ökar den tillåtna storleken för bilagor när du skickar e-post i SQL Server (T-SQL)