sql >> Database >  >> RDS >> PostgreSQL

Meerdere PostgreSQL-instanties op één host uitvoeren

We hebben onlangs de release van ClusterControl 1.7.3 aangekondigd, die een aantal verbeteringen en nieuw toegevoegde functies bevat. Een van deze nieuwe functies is de toevoeging van ondersteuning in ClusterControl waarmee een gebruiker meerdere PostgreSQL-instanties op dezelfde host kan instellen en beheren. Deze nieuwe functie is wat we zullen bespreken in onze blog hieronder, inclusief redenen waarom dit type installatie u kan helpen om middelen te besparen en stapsgewijze instructies te geven voor het bereiken van dit type installatie in ClusterControl.

Waarom zou je een Multiple-PostgreSQL-installatie op één host nodig hebben?

Met de huidige snelle ontwikkeling en verbetering van technologieën van hardware tot software, is de reikwijdte van de vereisten flexibeler, flexibeler en schaalbaarder geworden. Sommige organisaties geven er zelfs de voorkeur aan om gebruik te maken van de technologiestack, omdat schalen eenvoudiger is. Daarnaast zijn er situaties waarin u een databaseserver wilt implementeren op een hoogwaardige, krachtige server die een grote CPU, veel geheugen en snelle, krachtige en niet-vluchtige opslagapparaten zoals SSD/Fusion IO bevat. /NVMe. Dit kan echter soms een verspilling van bronnen zijn als u de gedeelde bronnen van een databaseserver wilt gebruiken (zoals het gebruiken als een slaaf, een hot-back-upmachine of zelfs als een back-upverificatieserver). In bepaalde opstellingen wilt u misschien de beschikbare bronnen op uw krachtige server gebruiken als zowel uw ontwikkel- als QA-server om ongewenste hardwarekosten te voorkomen (in plaats van een speciale machine te kopen of een nieuwe rekeninstantie in de cloud te spawnen).

Een Multi-PostgreSQL-installatie instellen

Voor dit voorbeeld maken we een cluster met een multi-PostgreSQL-installatie samen met meerdere PostgreSQL-exemplaren in een enkele host met behulp van ClusterControl.

Opmerking:vanaf de huidige versie (d.w.z. ClusterControl 1.7.3), staat ClusterControl u niet toe een cluster te maken of een cluster te initialiseren als u een master- en slave-informatie specificeert met een multi-versie geïnstalleerde PostgreSQL of met een multi-versie -instanties van PostgreSQL die binnen een enkele host worden uitgevoerd. U kunt echter wel een knooppunt importeren waarop meerdere versies zijn geïnstalleerd of waarop meerdere exemplaren van PostgreSQL op één host worden uitgevoerd.

Serverdetails en informatie

Aangezien we momenteel geen cluster kunnen starten of maken wanneer er meerdere versies van PostgreSQL zijn geïnstalleerd, importeren we een bestaande of actieve instantie van PostgreSQL. Hieronder vindt u de serverinformatie.

IP: 192.168.30.10
OS-gebruiker: zwerver
Type besturingssysteem en versie: Ubuntu 16.04.6 LTS (xenial)

en wat informatie uit mijn /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'

Waarin een bestaande versie al is geïnstalleerd:

[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

Bovendien zijn er voor deze opstelling extra instanties die actief zijn...

[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  

Voor dit voorbeeld gebruiken we PostgreSQL 9.6.

Het Master-Slave PostgreSQL-cluster bouwen

Om een ​​cluster te maken, moeten we de PostgreSQL-instantie handmatig instellen en die instantie later in ClusterControl importeren. Als alternatief kunnen we een cluster maken met slechts één hoofdknooppunt en ClusterControl dit laten afhandelen, maar om dit te doen, moeten we alle andere actieve knooppunten afsluiten. Dit zou niet ideaal zijn als u op drukke PostgreSQL-databaseservers werkt.

Laten we nu de handmatige configuratie uitvoeren... 

[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

Start vervolgens de database door de onderstaande opdracht uit te voeren,

[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

Laten we nu controleren of de instantie wordt uitgevoerd en de gewenste poort gebruikt die we hebben gebruikt:

[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, het ziet er correct uit. De pid van 18403 laat zien dat we het kunnen draaien en heeft zowel IPv4 als IPv6 open.

Laten we dit nu importeren in ClusterControl. Ga naar Implementeren → Bestaande server/database importeren , om het gewenste hoofdknooppunt te importeren dat we zojuist hebben ingesteld.

Nadat je op de knop Importeren hebt gedrukt, kun je een cluster hebben met één hoofdknooppunt, zoals hieronder:

Laten we nu een slave maken binnen dezelfde host (d.w.z. met IP 192.168.30.10).

En maak je geen zorgen, ClusterControl zal het voor je afhandelen, zoals een voorbeeld van een taakactiviteitenlogboek hieronder laat zien.

U kunt zien dat het met succes is ingesteld en geïnstalleerd. Technisch gezien zal ClusterControl een directory maken onder /etc/postgresql//p voor op Debian/Ubuntu gebaseerd systeem en genereer de vereiste configuratiebestanden. Terwijl het voor op RHEL/Centos/Fedora gebaseerde systemen genereert onder data_dir pad.

Laten we nu bevestigen met pg_lsclusters en kijk of de multi-PostgreSQL-instantie parallel in een host wordt uitgevoerd. Zie hieronder:

[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

Daarnaast zijn de statistieken zoals voor de logische replicatieclusters hieronder te zien:

De slave promoten in een multi-PostgreSQL die instances in een enkele host uitvoert

Slave-promotie is eenvoudig voor meerdere PostgreSQL-exemplaren die op één host worden uitgevoerd. Zoals je hieronder kunt zien, werkt dit type omgeving perfect wanneer het wordt afgehandeld door ClusterControl.

Laten we nu eens kijken wat er op de achtergrond gebeurt terwijl ClusterControl de slaaf promoot. Bekijk de volledige functiespecificaties en details

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

Zoals je ziet, werd het zelfs op dezelfde host soepel afgehandeld. Het topologieresultaat laat zien dat het succesvol is gepromoot.

Conclusie

We zijn enthousiast over de release van ClusterControl 1.7.3 en denken dat het veel te bieden heeft. We denken ook dat deze nieuwe Multi-PostgreSQL-instanties die op dezelfde hostfunctie draaien, weer een geweldige stap is in het verbeteren van onze algehele ondersteuning voor PostgreSQL. Probeer het uit en laat ons hieronder weten wat je van deze nieuwe functie vindt.


  1. Betere gelijktijdigheid in Oracle dan SQL Server?

  2. Hoe u ervoor kunt zorgen dat uw MySQL-database beveiligd is?

  3. psycopg2 lekt geheugen na grote zoekopdracht

  4. Hoe maak je een Postgres-tabel met een unieke gecombineerde primaire sleutel?