PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ausführen mehrerer PostgreSQL-Instanzen auf einem einzelnen Host

Wir haben kürzlich die Veröffentlichung von ClusterControl 1.7.3 angekündigt, das eine Vielzahl von Verbesserungen und neu hinzugefügten Funktionen enthält. Eine dieser neuen Funktionen ist die zusätzliche Unterstützung in ClusterControl, die es einem Benutzer ermöglicht, mehrere PostgreSQL-Instanzen auf demselben Host einzurichten und zu verwalten. Diese neue Funktion werden wir unten in unserem Blog besprechen, einschließlich der Gründe, warum diese Art der Einrichtung Ihnen helfen kann, Ressourcen zu sparen, sowie Schritt-für-Schritt-Anleitungen, wie Sie diese Art der Installation in ClusterControl erreichen können.

Warum benötigen Sie eine Installation mit mehreren PostgreSQL auf einem einzelnen Host?

Mit der heutigen rasanten Entwicklung und Verbesserung der Technologien von der Hardware bis zur Software ist der Umfang der Anforderungen anpassungsfähiger, flexibler und skalierbarer geworden. Einige Organisationen ziehen es sogar vor, den Technologie-Stack zu nutzen, da die Skalierung einfacher ist. Darüber hinaus gibt es Situationen, in denen Sie möglicherweise einen Datenbankserver auf einem leistungsstarken High-End-Server bereitstellen möchten, der über eine große CPU, viel Arbeitsspeicher und schnelle, leistungsstarke und nichtflüchtige Speichergeräte wie SSD/Fusion IO verfügt /NVMe. Dies kann jedoch manchmal eine Verschwendung von Ressourcen sein, wenn Sie die gemeinsam genutzten Ressourcen eines Datenbankservers ausführen möchten (z. B. wenn Sie ihn als Slave, Hot-Backup-Maschine oder sogar als Backup-Verifizierungsserver verwenden). In bestimmten Konfigurationen möchten Sie möglicherweise die auf Ihrem leistungsstarken Server verfügbaren Ressourcen sowohl als Entwicklungs- als auch als QA-Server verwenden, um unerwünschte Hardwarekosten zu vermeiden (anstatt eine dedizierte Maschine zu kaufen oder eine neue Recheninstanz in der Cloud zu erstellen).

So richten Sie eine Multi-PostgreSQL-Installation ein

Für dieses Beispiel erstellen wir einen Cluster mit einer Multi-PostgreSQL-Installation zusammen mit Multi-PostgreSQL-laufenden Instanzen auf einem einzigen Host mit ClusterControl.

Hinweis:Ab der aktuellen Version (d. h. ClusterControl 1.7.3) erlaubt Ihnen ClusterControl nicht, einen Cluster zu erstellen oder einen Cluster zu initialisieren, wenn Sie Master- und Slave-Informationen mit einem PostgreSQL mit mehreren Versionen oder mit einem Multi angeben -Instanzen von PostgreSQL, die auf einem einzelnen Host ausgeführt werden. Sie können jedoch einen Knoten mit mehreren installierten Versionen oder mehreren Instanzen von PostgreSQL importieren, die auf einem einzigen Host ausgeführt werden.

Serverdetails und -informationen

Da wir derzeit keinen Cluster initiieren oder erstellen können, wenn mehrere Versionen von PostgreSQL installiert sind, importieren wir eine vorhandene oder laufende Instanz von PostgreSQL. Nachfolgend finden Sie die Serverinformationen.

IP: 192.168.30.10
Betriebssystembenutzer: vagrant
Betriebssystemtyp und -version: Ubuntu 16.04.6 LTS (xenial)

und einige Informationen aus meiner /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'

Wobei bereits vorhandene Versionen installiert sind:

[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

Darüber hinaus gibt es für dieses Setup zusätzliche Instanzen, die ausgeführt werden...

[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 dieses Beispiel verwenden wir PostgreSQL 9.6.

Erstellen des Master-Slave-PostgreSQL-Clusters

Um einen Cluster zu erstellen, müssen wir die PostgreSQL-Instanz manuell einrichten und diese Instanz später in ClusterControl importieren. Alternativ können wir einen Cluster mit nur einem Master-Knoten erstellen und ihn ClusterControl überlassen, aber dazu müssen wir alle anderen laufenden Knoten herunterfahren. Dies wäre nicht ideal, wenn Sie auf ausgelasteten PostgreSQL-Datenbankservern arbeiten.

Lassen Sie uns jetzt die manuelle Einrichtung vornehmen... 

[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

Starten Sie dann die Datenbank, indem Sie den folgenden Befehl ausführen,

[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

Lassen Sie uns nun überprüfen, ob die Instanz ausgeführt wird und den gewünschten Port verwendet, den wir verwendet haben:

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

Jetzt sieht es richtig aus. Die PID von 18403 zeigt, dass wir es ausführen können und hat sowohl IPv4 als auch IPv6 geöffnet.

Lassen Sie uns dies nun in ClusterControl importieren. Gehen Sie zu Bereitstellen → Vorhandenen Server/Datenbank importieren , um den gewünschten Master-Knoten zu importieren, den wir gerade eingerichtet haben.

Nachdem Sie auf die Schaltfläche Import geklickt haben, können Sie einen Cluster mit einem Master-Knoten wie unten haben:

Lassen Sie uns nun einen Slave innerhalb desselben Hosts erstellen (d. h. mit IP 192.168.30.10).

Und keine Sorge, ClusterControl übernimmt das für Sie, wie unten ein Beispiel für ein Job-Aktivitätsprotokoll zeigt.

Sie können sehen, dass es erfolgreich eingerichtet und installiert wurde. Technisch gesehen erstellt ClusterControl ein Verzeichnis unter /etc/postgresql//p für Debian/Ubuntu-basierte Systeme und generieren Sie die erforderlichen Konfigurationsdateien. Bei RHEL/Centos/Fedora-basierten Systemen wird es unter data_dir generiert Pfad.

Jetzt bestätigen wir mit pg_lsclusters und prüfen Sie, ob die Multi-PostgreSQL-Instanz parallel auf einem Host ausgeführt wird. Siehe unten:

[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

Darüber hinaus sind die Metriken für die Logical Replication-Cluster unten zu sehen:

Beförderung des Slaves in einer Multi-PostgreSQL-Ausführung von Instanzen auf einem einzelnen Host

Die Slave-Heraufstufung ist für Multi-PostgreSQL-Instanzen, die auf einem einzigen Host ausgeführt werden, einfach. Wie Sie unten sehen können, funktioniert diese Art von Umgebung einwandfrei, wenn sie von ClusterControl gehandhabt wird.

Sehen wir uns nun an, was im Hintergrund passiert, während ClusterControl den Slave befördert. Sehen Sie sich die vollständigen Jobspezifikationen und Details an

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

Wie Sie sehen, wurde es sogar auf demselben Host reibungslos gehandhabt. Das Topologieergebnis zeigt, dass es erfolgreich heraufgestuft wurde.

Schlussfolgerung

Wir freuen uns über die Veröffentlichung von ClusterControl 1.7.3 und denken, dass es viel zu bieten hat. Wir sind auch der Meinung, dass diese neue Multi-PostgreSQL-Instanz, die auf demselben Host ausgeführt wird, ein weiterer großer Schritt zur Verbesserung unserer allgemeinen Unterstützung für PostgreSQL ist. Probieren Sie es aus und teilen Sie uns unten Ihre Meinung zu dieser neuen Funktion mit.