PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Exécution de plusieurs instances PostgreSQL sur un seul hôte

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//p pour le système basé sur Debian/Ubuntu et générer les fichiers de configuration requis. Alors que pour les systèmes basés sur RHEL/Centos/Fedora, il sera généré sous data_dir chemin.

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:
&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]"
}

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é.