Nous avons récemment annoncé la sortie de ClusterControl 1.7.3 qui comprend une variété d'améliorations et de nouvelles fonctionnalités ajoutées. L'une de ces nouvelles fonctionnalités est l'ajout de la prise en charge dans ClusterControl pour permettre à un utilisateur de configurer et de gérer plusieurs instances PostgreSQL sur le même hôte. Cette nouvelle fonctionnalité est ce dont nous discuterons dans notre blog ci-dessous, y compris les raisons pour lesquelles ce type de configuration peut vous aider à économiser des ressources ainsi que des instructions étape par étape sur la façon de réaliser ce type d'installation dans ClusterControl.
Pourquoi auriez-vous besoin d'une installation multiple de PostgreSQL sur un seul hôte ?
Avec le développement rapide et l'amélioration des technologies d'aujourd'hui, du matériel au logiciel, la portée des exigences est devenue plus adaptable, flexible et évolutive. Certaines organisations préfèrent même tirer parti de la pile technologique, car sa mise à l'échelle est plus facile. De plus, dans certaines situations, vous souhaiterez peut-être déployer un serveur de base de données sur un serveur haut de gamme et puissant qui contient un gros processeur, beaucoup de mémoire et des périphériques de stockage rapides, puissants et non volatils tels que SSD/Fusion IO. /NVMe. Ceci, cependant, peut parfois être un gaspillage de ressources si vous cherchez à exécuter les ressources partagées d'un serveur de base de données (comme l'utiliser comme esclave, machine de sauvegarde à chaud ou même comme serveur de vérification de sauvegarde). Dans certaines configurations, vous souhaiterez peut-être utiliser les ressources disponibles dans votre puissant serveur à la fois comme serveur de développement et d'assurance qualité pour éviter des coûts matériels indésirables (au lieu d'acheter une machine dédiée ou de créer une nouvelle instance de calcul dans le cloud).
Comment configurer une installation multi-PostgreSQL
Pour cet exemple, nous allons créer un cluster avec une installation multi-PostgreSQL ainsi que des instances d'exécution multi-PostgreSQL sur un seul hôte à l'aide de ClusterControl.
Remarque :à partir de la version actuelle (c'est-à-dire ClusterControl 1.7.3), ClusterControl ne vous permet pas de créer un cluster ou d'initialiser un cluster si vous spécifiez des informations maître et esclave avec un PostgreSQL installé multi-version ou avec un multi -instances de PostgreSQL s'exécutant sur un seul hôte. Cependant, vous pouvez importer un nœud avec plusieurs versions installées ou plusieurs instances de PostgreSQL exécutées sur un seul hôte.
Détails et informations sur le serveur
Étant donné que nous ne pouvons pas actuellement initier ou créer un cluster lorsqu'il y a plusieurs versions installées de PostgreSQL, nous allons importer une instance existante ou en cours d'exécution de PostgreSQL. Vous trouverez ci-dessous les informations sur le serveur.
IP : 192.168.30.10
Utilisateur du système d'exploitation : vagabond
Type et version du système d'exploitation : Ubuntu 16.04.6 LTS (xénial)
et quelques informations de mon /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'
Où une version existante a déjà été installée :
[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
De plus, pour cette configuration, des instances supplémentaires sont en cours d'exécution...
[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
Pour cet exemple, nous utiliserons PostgreSQL 9.6.
Construire le cluster PostgreSQL maître-esclave
Afin de créer un cluster, nous devons configurer l'instance PostgreSQL manuellement, puis importer cette instance dans ClusterControl ultérieurement. Alternativement, nous pouvons créer un cluster avec un seul nœud maître et laisser ClusterControl le gérer, mais pour ce faire, nous devrons arrêter tous les autres nœuds en cours d'exécution. Ce ne serait pas idéal si vous travaillez sur des serveurs de base de données PostgreSQL occupés.
Passons maintenant à la configuration manuelle...
[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
Ensuite, démarrez la base de données en exécutant la commande ci-dessous,
[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
Maintenant, vérifions si l'instance s'exécute et utilise le port souhaité que nous avons utilisé :
[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 :::*
Maintenant, ça a l'air correct. Le pid de 18403 montre que nous sommes capables de l'exécuter et que IPv4 et IPv6 sont ouverts.
Maintenant, importons ceci dans ClusterControl. Accédez à Déployer → Importer un serveur/une base de données existants , pour importer le nœud maître souhaité que nous venons de configurer.
Après avoir cliqué sur le bouton Importer, vous pourrez avoir un cluster avec un nœud maître comme ci-dessous :
Maintenant, créons un esclave au sein du même hôte (c'est-à-dire avec l'IP 192.168.30.10).
Et ne vous inquiétez pas, ClusterControl s'en chargera pour vous comme le montre un exemple de journal d'activité de travail ci-dessous.
Vous pouvez voir qu'il a été configuré et installé avec succès. Techniquement, ClusterControl créera un répertoire sous /etc/postgresql/
Confirmons maintenant avec pg_lsclusters et voyez si l'instance multi-PostgreSQL s'exécute en parallèle sur un hôte. Voir ci-dessous :
[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
De plus, les métriques concernant les clusters de réplication logique sont présentées ci-dessous :
Promouvoir l'esclave dans plusieurs instances d'exécution PostgreSQL sur un seul hôte
La promotion des esclaves est facile pour une instance multi-PostgreSQL en cours d'exécution sur un seul hôte. Comme vous pouvez le voir ci-dessous, ce type d'environnement fonctionne parfaitement lorsqu'il est géré par ClusterControl.
Voyons maintenant ce qui se passe en arrière-plan pendant que ClusterControl promeut l'esclave. Voir les spécifications complètes du poste et les détails
[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]"
}
Comme vous le voyez, cela a été géré sans problème, même sur le même hôte. Le résultat de la topologie montre qu'il a été promu avec succès.
Conclusion
Nous sommes ravis de la sortie de ClusterControl 1.7.3 et pensons qu'il a beaucoup à offrir. Nous pensons également que ces nouvelles instances multi-PostgreSQL exécutées sur la même fonctionnalité d'hôte constituent une autre étape importante dans l'amélioration de notre prise en charge globale de PostgreSQL. Essayez-le et dites-nous ci-dessous ce que vous pensez de cette nouvelle fonctionnalité.