sql >> Databáze >  >> RDS >> PostgreSQL

Spuštění více instancí PostgreSQL na jednom hostiteli

Nedávno jsme oznámili vydání ClusterControl 1.7.3, které obsahuje řadu vylepšení a nově přidané funkce. Jednou z těchto nových funkcí je přidání podpory v ClusterControl, která uživateli umožňuje nastavit a spravovat více instancí PostgreSQL na stejném hostiteli. Tato nová funkce je tím, o čem budeme diskutovat v našem blogu níže, včetně důvodů, proč vám tento typ nastavení může pomoci ušetřit na zdrojích a také poskytuje podrobné pokyny, jak dosáhnout tohoto typu instalace v ClusterControl.

Proč byste potřebovali instalaci více PostgreSQL na jednom hostiteli?

S dnešním rychlým vývojem a zlepšováním technologií od hardwaru po software se rozsah požadavků stal přizpůsobivějším, flexibilnějším a škálovatelnějším. Některé organizace dokonce dávají přednost využití technologického zásobníku, protože jeho škálování je jednodušší. Kromě toho existují situace, kdy možná budete chtít nasadit databázový server na špičkový, výkonný server, který obsahuje velký CPU, spoustu paměti a rychlá, výkonná a energeticky nezávislá úložná zařízení, jako je SSD/Fusion IO. /NVMe. To však může někdy představovat plýtvání prostředky, pokud chcete provozovat sdílené prostředky databázového serveru (například jej používat jako slave, počítač se zálohováním za provozu nebo dokonce jako server pro ověřování záloh). V určitých nastaveních možná budete chtít využít zdroje dostupné na vašem výkonném serveru jako vývojový server i server kontroly kvality, abyste se vyhnuli nechtěným nákladům na hardware (místo nákupu vyhrazeného počítače nebo vytváření nové výpočetní instance v cloudu).

Jak nastavit instalaci Multi-PostgreSQL

V tomto příkladu vytvoříme cluster s multi-PostgreSQL instalací spolu s multi-PostgreSQL spuštěnými instancemi v jednom hostiteli pomocí ClusterControl.

Poznámka:od aktuální verze (tj. ClusterControl 1.7.3) vám ClusterControl neumožňuje vytvořit cluster nebo inicializovat cluster, pokud zadáte informace o hlavním a podřízeném zařízení s nainstalovanou více verzí PostgreSQL nebo s více -instance PostgreSQL běžící v rámci jednoho hostitele. Můžete však importovat uzel s nainstalovanými více verzemi nebo více instancemi PostgreSQL spuštěnými v jednom hostiteli.

Podrobnosti a informace o serveru

Protože v současné době nemůžeme iniciovat nebo vytvořit cluster, když je nainstalováno více verzí PostgreSQL, importujeme existující nebo běžící instanci PostgreSQL. Níže jsou uvedeny informace o serveru.

IP: 192.168.30.10
Uživatel operačního systému: vagrant
Typ a verze operačního systému: Ubuntu 16.04.6 LTS (xenial)

a některé informace z mého /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'

Kde již byly nainstalovány existující verze:

[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

Navíc pro toto nastavení existují další instance, které jsou spuštěny...

[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  

Pro tento příklad použijeme PostgreSQL 9.6.

Budování Master-Slave PostgreSQL Cluster

Abychom mohli vytvořit cluster, musíme instanci PostgreSQL nastavit ručně a poté tuto instanci importovat do ClusterControl později. Alternativně můžeme vytvořit cluster pouze s jedním hlavním uzlem a nechat ClusterControl, aby to zvládl, ale k tomu budeme muset vypnout všechny ostatní běžící uzly. To by nebylo ideální, pokud provozujete na vytížených databázových serverech PostgreSQL.

Nyní provedeme ruční nastavení... 

[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

Poté spusťte databázi spuštěním příkazu níže,

[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

Nyní ověřte, zda instance běží a používá požadovaný port, který jsme použili:

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

Teď to vypadá správně. Pid z 18403 ukazuje, že jsme schopni jej spustit a máme otevřené IPv4 i IPv6.

Nyní to importujeme do ClusterControl. Přejděte na Nasadit → Importovat existující server/databázi , pro import požadovaného hlavního uzlu jsme právě nastavili.

Po stisknutí tlačítka Importovat budete moci mít cluster s jedním hlavním uzlem, jak je uvedeno níže:

Nyní vytvořte slave v rámci stejného hostitele (tj. s IP 192.168.30.10).

A nebojte se, ClusterControl to zpracuje za vás, jak je ukázkový protokol činnosti úlohy níže.

Můžete vidět, že byl úspěšně nastaven a nainstalován. Technicky ClusterControl vytvoří adresář pod /etc/postgresql//p pro systém založený na Debian/Ubuntu a vygenerujte požadované konfigurační soubory. Zatímco pro systémy založené na RHEL/Centos/Fedora bude generovat pod data_dir cesta.

Nyní to potvrďte pomocí pg_lsclusters a zjistěte, zda instance multi-PostgreSQL běží paralelně v hostiteli. Viz níže:

[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

Kromě toho jsou níže uvedeny metriky pro clustery logické replikace:

Propagace Slave v multi-PostgreSQL spuštěných instancích v jediném hostiteli

Propagace Slave je snadná pro multi-PostgreSQL běžící instance na jediném hostiteli. Jak můžete vidět níže, tento typ prostředí funguje bezchybně, když jej zpracovává ClusterControl.

Nyní se podívejme, co se děje na pozadí, zatímco ClusterControl podporuje slave. Podívejte se na úplnou specifikaci úlohy a podrobnosti

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

Jak vidíte, šlo to hladce i na stejném hostiteli. Výsledek topologie ukazuje, že byla úspěšně povýšena.

Závěr

Jsme nadšeni z vydání ClusterControl 1.7.3 a myslíme si, že má co nabídnout. Také si myslíme, že tyto nové instance Multi-PostgreSQL běžící na stejném hostiteli jsou dalším skvělým krokem ke zlepšení naší celkové podpory pro PostgreSQL. Vyzkoušejte to a dejte nám níže vědět, co si o této nové funkci myslíte.


  1. Existuje způsob, jak načíst definici zobrazení ze serveru SQL pomocí prostého ADO?

  2. Jak hláskovat rok při formátování data v Oracle

  3. 8 způsobů, jak přidat mikrosekundy k hodnotě data a času v MariaDB

  4. Java SQLData - Cast na uživatelský objekt se seznamem/polí?