sql >> Base de Datos >  >> RDS >> PostgreSQL

Ejecución de múltiples instancias de PostgreSQL en un solo host

Recientemente anunciamos el lanzamiento de ClusterControl 1.7.3, que incluye una variedad de mejoras y funciones recientemente agregadas. Una de estas nuevas características es la adición de soporte en ClusterControl para permitir que un usuario configure y administre múltiples instancias de PostgreSQL en el mismo host. Esta nueva característica es lo que discutiremos en nuestro blog a continuación, incluidas las razones por las que este tipo de configuración puede ayudarlo a ahorrar recursos, así como también brindar instrucciones paso a paso sobre cómo lograr este tipo de instalación en ClusterControl.

¿Por qué necesitaría una instalación de PostgreSQL múltiple en un solo host?

Con el rápido desarrollo y la mejora de las tecnologías actuales, desde el hardware hasta el software, el alcance de los requisitos se ha vuelto más adaptable, flexible y escalable. Algunas organizaciones incluso prefieren aprovechar la pila de tecnología, ya que escalarla es más fácil. Además, hay situaciones en las que es posible que desee implementar un servidor de base de datos en un servidor potente de gama alta que contiene una CPU grande, mucha memoria y dispositivos de almacenamiento rápidos, potentes y no volátiles como SSD/Fusion IO. /NVMe. Esto, sin embargo, a veces puede ser una pérdida de recursos si está buscando ejecutar los recursos compartidos de un servidor de base de datos (como usarlo como esclavo, una máquina de copia de seguridad en caliente o incluso como un servidor de verificación de copia de seguridad). En determinadas configuraciones, es posible que desee utilizar los recursos disponibles en su potente servidor como su servidor de desarrollo y control de calidad para evitar costos de hardware no deseados (en lugar de comprar una máquina dedicada o generar una nueva instancia informática en la nube).

Cómo configurar una instalación multi-PostgreSQL

Para este ejemplo, crearemos un clúster con una instalación multi-PostgreSQL junto con instancias en ejecución multi-PostgreSQL en un solo host usando ClusterControl.

Nota:a partir de la versión actual (es decir, ClusterControl 1.7.3), ClusterControl no le permite crear un clúster o inicializar un clúster si especifica una información de maestro y esclavo con una versión múltiple instalada de PostgreSQL o con una multi -instancias de PostgreSQL que se ejecutan dentro de un solo host. Sin embargo, puede importar un nodo con múltiples versiones instaladas o múltiples instancias de PostgreSQL ejecutándose en un solo host.

Información y detalles del servidor

Dado que actualmente no podemos iniciar o crear un clúster cuando hay varias versiones instaladas de PostgreSQL, importaremos una instancia existente o en ejecución de PostgreSQL. A continuación se muestra la información del servidor.

IP: 192.168.30.10
Usuario del sistema operativo: vagabundo
Tipo y versión del sistema operativo: Ubuntu 16.04.6 LTS (xenial)

y alguna información de mi /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'

Donde ya se han instalado versiones existentes:

[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

Además, para esta configuración, hay instancias adicionales que se están ejecutando...

[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  

Para este ejemplo, usaremos PostgreSQL 9.6.

Creación del clúster de PostgreSQL maestro-esclavo

Para crear un clúster, debemos configurar la instancia de PostgreSQL manualmente y luego importar esa instancia a ClusterControl más adelante. Alternativamente, podemos crear un clúster con solo un nodo maestro y dejar que ClusterControl lo maneje, pero para hacer esto, tendremos que apagar todos los demás nodos en ejecución. Esto no sería ideal si está operando en servidores de bases de datos PostgreSQL ocupados.

Ahora, hagamos la configuración manual... 

[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

Luego inicie la base de datos ejecutando el siguiente comando,

[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

Ahora, verifiquemos si la instancia se ejecuta y usa el puerto deseado que usamos:

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

Ahora, parece correcto. El pid de 18403 muestra que podemos ejecutarlo y tiene abiertos tanto IPv4 como IPv6.

Ahora, importemos esto a ClusterControl. Vaya a Implementar → Importar servidor/base de datos existente , para importar el nodo maestro deseado que acabamos de configurar.

Después de presionar el botón Importar, podrá tener un clúster con un nodo maestro como se muestra a continuación:

Ahora, creemos un esclavo dentro del mismo host (es decir, con IP 192.168.30.10).

Y no se preocupe, ClusterControl lo manejará por usted como se muestra a continuación en un registro de actividad laboral de muestra.

Puede ver que se configuró e instaló correctamente. Técnicamente, ClusterControl creará un directorio en /etc/postgresql//p para el sistema basado en Debian/Ubuntu y genere los archivos de configuración necesarios. Mientras que para los sistemas basados ​​en RHEL/Centos/Fedora, se generará en data_dir camino.

Ahora confirmemos con pg_lsclusters y vea si la instancia multi-PostgreSQL se ejecuta en paralelo en un host. Ver a continuación:

[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

Además de esto, las métricas en cuanto a los clústeres de replicación lógica se ven a continuación:

Promoción del esclavo en instancias de ejecución multi-PostgreSQL en un único host

La promoción de esclavos es fácil para instancias que ejecutan múltiples PostgreSQL en un solo host. Como puede ver a continuación, este tipo de entorno funciona perfectamente cuando lo maneja ClusterControl.

Ahora, veamos qué sucede en segundo plano mientras ClusterControl promueve el esclavo. Ver las especificaciones y los detalles completos del trabajo

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

Como puede ver, se manejó sin problemas incluso en el mismo host. El resultado de la topología muestra que se ha promocionado correctamente.

Conclusión

Estamos entusiasmados con el lanzamiento de ClusterControl 1.7.3, creemos que tiene mucho que ofrecer. También creemos que estas nuevas instancias Multi-PostgreSQL que se ejecutan en la misma función de host es otro gran paso para mejorar nuestro soporte general para PostgreSQL. Pruébalo y cuéntanos qué piensas a continuación sobre esta nueva característica.