PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изпълнение на множество екземпляри на PostgreSQL на един хост

Наскоро обявихме пускането на ClusterControl 1.7.3, който включва различни подобрения и новодобавени функции. Една от тези нови функции е добавянето на поддръжка в ClusterControl, за да позволи на потребителя да настрои и управлява множество екземпляри на PostgreSQL на един и същ хост. Тази нова функция е това, което ще обсъдим в нашия блог по-долу, включително причините защо този тип настройка може да ви помогне да спестите ресурси, както и да предостави инструкции стъпка по стъпка за това как да постигнете този тип инсталация в ClusterControl.

Защо ще ви е необходима инсталация с множество PostgreSQL на един хост?

С днешното бързо развитие и подобряване на технологиите от хардуер до софтуер, обхватът на изискванията стана по-адаптивен, гъвкав и мащабируем. Някои организации дори предпочитат да използват технологичния стек, тъй като мащабирането му е по-лесно. Освен това има ситуации, в които може да искате да разположите сървър на база данни на мощен сървър от висок клас, който съдържа голям процесор, много памет и бързи, мощни и енергонезависими устройства за съхранение, като SSD/Fusion IO /NVMe. Това обаче понякога може да бъде загуба на ресурси, ако искате да стартирате споделените ресурси на сървър на база данни (като например да го използвате като подчинен, машина за горещо архивиране или дори като сървър за проверка на резервно копие). При определени настройки може да искате да използвате наличните ресурси във вашия мощен сървър като сървър за разработка и QA, за да избегнете нежелани хардуерни разходи (вместо да купувате специална машина или да създавате нова изчислителна инстанция в облака).

Как да настроите инсталация на Multi-PostgreSQL

За този пример ще създадем клъстер с инсталация с множество PostgreSQL, заедно с множество работещи инстанции на PostgreSQL в един хост, използвайки ClusterControl.

Забележка:от текущата версия (т.е. ClusterControl 1.7.3), ClusterControl не ви позволява да създавате клъстер или да инициализирате клъстер, ако посочите информация за главен и подчинен с инсталиран PostgreSQL с няколко версии или с мулти -екземпляри на PostgreSQL, работещи в рамките на един хост. Можете обаче да импортирате възел с инсталирана мултиверсия или няколко екземпляра на PostgreSQL, работещи в един хост.

Подробности и информация за сървъра

Тъй като в момента не можем да инициираме или създадем клъстер, когато има инсталирана множество версии на PostgreSQL, ще импортираме съществуващ или работещ екземпляр на PostgreSQL. По-долу е информацията за сървъра.

IP: 192.168.30.10
Потребител на ОС: vagrant
Тип и версия на ОС: Ubuntu 16.04.6 LTS (xenial)

и малко информация от моя /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'

При което вече са инсталирани съществуващи версии:

[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

Освен това за тази настройка има допълнителни екземпляри, които се изпълняват...

[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  

За този пример ще използваме PostgreSQL 9.6.

Изграждане на Master-Slave PostgreSQL клъстер

За да създадем клъстер, трябва ръчно да настроим екземпляра на PostgreSQL и след това да импортираме този екземпляр в ClusterControl по-късно. Като алтернатива можем да създадем клъстер само с един главен възел и да оставим ClusterControl да го управлява, но за да направим това, ще трябва да изключим всички други работещи възли. Това не би било идеално, ако работите на натоварени PostgreSQL сървъри на база данни.

Сега нека направим ръчната настройка... 

[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

След това стартирайте базата данни, като изпълните командата по-долу,

[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

Сега нека проверим дали екземплярът работи и използва желания порт, който използвахме:

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

Сега изглежда правилно. Пидът от 18403г показва, че можем да го стартираме и има отворени IPv4 и IPv6.

Сега нека импортираме това в ClusterControl. Отидете на Внедряване → Импортиране на съществуващ сървър/база данни , за да импортираме желания главен възел, който просто настройваме.

След като натиснете бутона Импортиране, ще можете да имате клъстер с един главен възел точно както по-долу:

Сега нека създадем подчинен в рамките на същия хост (т.е. с IP 192.168.30.10).

И не се притеснявайте, ClusterControl ще се справи с това вместо вас, както е показано по-долу примерен дневник за работа.

Можете да видите, че е настроен и инсталиран успешно. Технически ClusterControl ще създаде директория под /etc/postgresql//p за базирана на Debian/Ubuntu система и генериране на необходимите конфигурационни файлове. Докато за базирани на RHEL/Centos/Fedora системи, той ще генерира под data_dir път.

Сега нека потвърдим с pg_lsclusters и вижте дали мулти-PostgreSQL екземплярът работи паралелно в хост. Вижте по-долу:

[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

В допълнение към това, показателите за клъстерите за логическа репликация се виждат по-долу:

Промотиране на подчинения в много-PostgreSQL работещи инстанции в един хост

Подчинената промоция е лесна за работещи екземпляри с множество PostgreSQL в един хост. Както можете да видите по-долу, този тип среда работи безупречно, когато се обработва от ClusterControl.

Сега, нека видим какво се случва на заден план, докато ClusterControl насърчава подчинения. Вижте пълната спецификация и подробности за работата

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

Както виждате, това се обработва гладко дори на един и същ хост. Резултатът от топологията показва, че е бил успешно повишен.

Заключение

Ние сме развълнувани от пускането на ClusterControl 1.7.3, смятаме, че има какво да предложи. Ние също така смятаме, че тези нови екземпляри на Multi-PostgreSQL, работещи на една и съща хост функция, са още една страхотна стъпка в подобряването на цялостната ни поддръжка за PostgreSQL. Изпробвайте го и ни уведомете какво мислите по-долу за тази нова функция.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как се тълкува sql с рекурсивно изявление?

  2. DatabaseError:текущата транзакция е прекратена, командите се игнорират до края на блока на транзакцията?

  3. Бърз начин да откриете броя на редовете на таблица в PostgreSQL

  4. Как да принудя Postgres да използва конкретен индекс?

  5. Как да прочетем съдържанието на .sql файл в R скрипт, за да изпълним заявка?