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/
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:
• Role: master (slaves: 1)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/30020C0; 0/30020C0
<em style='color: #1abc9c;'>192.168.30.10</em>:7654:
• Role: slave (slaves: 0)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/30020C0; 0/30020C0
• 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:
• Role: slave (slaves: 0)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/3001820; 0/3001820
• Master: 192.168.30.10:7654
<em style='color: #1abc9c;'>192.168.30.10</em>:7654:
• Role: master (slaves: 1)
• Status: CmonHostOnline (NODE_CONNECTED)
• 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.