sql >> Database teknologi >  >> RDS >> PostgreSQL

Kørsel af flere PostgreSQL-instanser på en enkelt vært

Vi annoncerede for nylig udgivelsen af ​​ClusterControl 1.7.3, som indeholder en række forbedringer og nyligt tilføjede funktioner. En af disse nye funktioner er tilføjelsen af ​​support i ClusterControl for at give en bruger mulighed for at opsætte og administrere flere PostgreSQL-instanser på den samme vært. Denne nye funktion er, hvad vi vil diskutere i vores blog nedenfor, herunder årsager til, hvorfor denne type opsætning kan hjælpe dig med at spare på ressourcer samt give trin-for-trin instruktioner til, hvordan du opnår denne type installation i ClusterControl.

Hvorfor har du brug for en Multiple-PostgreSQL-installation på en enkelt vært?

Med nutidens hurtige udvikling og forbedring af teknologier fra hardware til software, er omfanget af krav blevet mere tilpasningsdygtigt, fleksibelt og skalerbart. Nogle organisationer foretrækker endda at udnytte teknologistakken, da det er nemmere at skalere den. Derudover er der situationer, hvor du måske ønsker at installere en databaseserver på en avanceret, kraftfuld server, som indeholder en stor CPU, masser af hukommelse og hurtige, kraftfulde og ikke-flygtige lagerenheder såsom SSD/Fusion IO /NVMe. Dette kan dog nogle gange være spild af ressourcer, hvis du ønsker at køre en databaseservers delte ressourcer (såsom at bruge den som en slave, en hot-backup-maskine eller endda som en backup-verifikationsserver). I visse opsætninger vil du måske bruge de tilgængelige ressourcer på din kraftfulde server som både din udviklings- og QA-server for at undgå uønskede hardwareomkostninger (i stedet for at købe en dedikeret maskine eller skabe en ny computerinstans i skyen).

Sådan konfigurerer du en Multi-PostgreSQL-installation

Til dette eksempel vil vi oprette en klynge med en multi-PostgreSQL-installation sammen med multi-PostgreSQL-kørende forekomster i en enkelt vært ved hjælp af ClusterControl.

Bemærk:fra den nuværende version (dvs. ClusterControl 1.7.3), tillader ClusterControl dig ikke at oprette en klynge eller initialisere en klynge, hvis du angiver en master- og slaveinformation med en multiversion installeret PostgreSQL eller med en multi -forekomster af PostgreSQL, der kører inden for en enkelt vært. Du kan dog importere en node med flere versioner installeret eller multi-forekomster af PostgreSQL, der kører på en enkelt vært.

Serverdetaljer og oplysninger

Da vi i øjeblikket ikke kan starte eller oprette en klynge, når der er installeret flere versioner af PostgreSQL, importerer vi en eksisterende eller kørende forekomst af PostgreSQL. Nedenfor er serveroplysningerne.

IP: 192.168.30.10
OS-bruger: vagrant
OS type og version: Ubuntu 16.04.6 LTS (xenial)

og nogle oplysninger fra min /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'

Hvor en eksisterende version allerede er installeret:

[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

Derudover er der til denne opsætning yderligere forekomster, som kører...

[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  

Til dette eksempel vil vi bruge PostgreSQL 9.6.

Opbygning af Master-Slave PostgreSQL-klyngen

For at oprette en klynge skal vi konfigurere PostgreSQL-instansen manuelt og derefter importere den instans til ClusterControl senere. Alternativt kan vi oprette en klynge med kun én hovedknude og lade ClusterControl håndtere det, men for at gøre dette bliver vi nødt til at lukke alle andre kørende noder. Dette ville ikke være ideelt, hvis du arbejder på travle PostgreSQL-databaseservere.

Lad os nu lave den manuelle opsætning... 

[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

Start derefter databasen ved at køre kommandoen nedenfor,

[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

Lad os nu kontrollere, om instansen kører og bruger den ønskede port, vi brugte:

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

Nu ser det rigtigt ud. Pid af 18403 viser, at vi er i stand til at køre det og har både IPv4 og IPv6 åbne.

Lad os nu importere dette til ClusterControl. Gå til Implementer → Importer eksisterende server/database , for at importere den ønskede masterknude, konfigurerer vi bare.

Når du har trykket på knappen Importer, vil du være i stand til at have en klynge med én hovedknude ligesom nedenfor:

Lad os nu oprette en slave inden for den samme vært (dvs. med IP 192.168.30.10).

Og bare rolig, ClusterControl vil håndtere det for dig, som et eksempel på jobaktivitetslog viser nedenfor.

Du kan se, at det blev konfigureret og installeret. Teknisk set vil ClusterControl oprette en mappe under /etc/postgresql//p til Debian/Ubuntu-baseret system og generer de nødvendige konfigurationsfiler. Mens for RHEL/Centos/Fedora baserede systemer, vil det generere under data_dir sti.

Lad os nu bekræfte med pg_lsclusters og se om multi-PostgreSQL-instansen kører parallelt i en vært. Se nedenfor:

[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

Ud over dette ses metrikken for logiske replikeringsklynger nedenfor:

Promovering af slaven i en multi-PostgreSQL-kørende forekomst i en enkelt vært

Slavepromovering er let for en multi-PostgreSQL, der kører forekomster i en enkelt vært. Som du kan se nedenfor, fungerer denne type miljø fejlfrit, når den håndteres af ClusterControl.

Lad os nu se, hvad der sker i baggrunden, mens ClusterControl promoverer slaven. Se hele jobspecifikationen og detaljerne

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

Som du kan se, blev det håndteret problemfrit selv på den samme vært. Topologiresultatet viser, at det er blevet promoveret med succes.

Konklusion

Vi er begejstrede for udgivelsen af ​​ClusterControl 1.7.3, men det har meget at byde på. Vi mener også, at disse nye Multi-PostgreSQL-instanser, der kører på den samme værtsfunktion, er endnu et godt skridt i at forbedre vores overordnede understøttelse af PostgreSQL. Prøv det, og fortæl os, hvad du synes om denne nye funktion nedenfor.


  1. Sådan fungerer WEIGHT_STRING() i MariaDB

  2. 5 ualmindelige Microsoft Access-tip til 2020

  3. DATE_FORMAT() Eksempler – MySQL

  4. Sådan skriver du UTF-8-strenge korrekt i MySQL gennem JDBC-grænsefladen