Установка


sudo sh -c "echo 'deb [arch=amd64] http://apt.ngn.eltex.loc/jammy/3.17 stable main extras external' > /etc/apt/sources.list.d/eltex-ecss10.list"
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 33CB2B750F8BB6A5


Перед установкой ecss-postgres-bdr-ssw в системе, в apt sources, должен быть добавлен docker для этого выполнить следующие команды:

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


sudo apt update && sudo apt upgrade


Установка вне кластера

Установка пакета ecss-postgres-bdr-ssw

sudo apt install ecss-postgres-bdr-ssw

При конфигурации пакета ecss-postgres-bdr-ssw будут заданы вопросы:

Вопросы ecss-postgres-bdr-sswОтветы для одиночного сервера
Текущий IP-адрес сетевого интерфейса. Выбрать из списка IP-адрес для работы с Postgres
Выберите <Да>, если пакет устанавливается на узле кластера.
Установка в кластере? 
No (необходимо выбрать)

Проверка

sudo docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                         NAMES
4887950e2633   resistanseltd/postgres-bdr   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:5439->5432/tcp, [::]:5439->5432/tcp   ecss-postgres-bdr-ssw-postgres-container-1

Установка в кластере

Установка пакета ecss-postgres-bdr-ssw

Выполняется последовательно, первым устанавливается на node работающий в режиме "Maser"

sudo apt install -y ecss-postgres-bdr-ssw

При конфигурации пакета ecss-postgres-bdr-ssw будут заданы вопросы:

Вопросы ecss-postgres-bdr-sswОтветы для ecss1 (Master)
Текущий IP-адрес сетевого интерфейса.Выбрать из списка IP-адрес для работы с Postgres
Установка в кластере?Yes (значение по умолчанию)
Является ли этот узел мастером?Yes  (необходимо выбрать)
sudo apt install -y ecss-postgres-bdr-ssw

При конфигурации пакета ecss-postgres-bdr-ssw будут заданы вопросы:

Вопросы ecss-postgres-bdr-sswОтветы для ecss2 (Slave)
Текущий IP-адрес сетевого интерфейса.Выбрать из списка IP-адрес для работы с Postgres
Установка в кластере?Yes (значение по умолчанию)
Является ли этот узел мастером?No (значение по умолчанию)
IP-адрес, используемый для подключения к кластеру:Указать IP-адрес Master (ecss1)

При установке на более чем 2 ноды

sudo apt install -y ecss-postgres-bdr-ssw

При конфигурации пакета ecss-postgres-bdr-ssw будут заданы вопросы:

Вопросы ecss-postgres-bdr-sswОтветы для ecssХ (Slave)
Текущий IP-адрес сетевого интерфейса.Выбрать из списка IP-адрес для работы с Postgres
Установка в кластере?Yes (значение по умолчанию)
Является ли этот узел мастером?No (значение по умолчанию)
IP-адрес, используемый для подключения к кластеру:Указать IP-адрес Master (ecss1)


Проверить корректность настройки репликации 

Во время установки в директорию /srv/ecss/ecss-postgres-bdr-ssw устанавливаются скрипт postgresbdr_ssw.sh

Для проверки репликации выполнить следующие команды:

cd /srv/ecss/ecss-postgres-bdr-ssw
sudo ./postgresbdr_ssw.sh check


Вывод на хостах должен быль одинаковый

При кластере из 3 нод в выводе будет 3 строки 

sudo ./postgresbdr_ssw.sh check
Enter master ip please
Like 10.150.150.15
10.0.10.51
Enter slave ip please
10.0.10.52
Press enter with empty password
Просто щелкайте Enter не вводя пароль
q - выход из просмотра таблицы (если необходимо)
таблица нод на мастере по ecss_storekeeper_db
таблица нод на слейве по ecss_storekeeper_db
таблица коннекций на мастер по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569499877813944343 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
 7569514001040228374 | host=10.0.10.52 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(2 rows)

таблица коннекций на слейве по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569499877813944343 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
 7569514001040228374 | host=10.0.10.52 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(2 rows)

sudo ./postgresbdr_ssw.sh check
Enter master ip please
Like 10.150.150.15
10.0.10.51
Enter slave ip please
10.0.10.52
Press enter with empty password
Просто щелкайте Enter не вводя пароль
q - выход из просмотра таблицы (если необходимо)
таблица нод на мастере по ecss_storekeeper_db
таблица нод на слейве по ecss_storekeeper_db
таблица коннекций на мастер по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569499877813944343 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
 7569514001040228374 | host=10.0.10.52 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(2 rows)

таблица коннекций на слейве по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569499877813944343 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
 7569514001040228374 | host=10.0.10.52 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(2 rows)

sudo ./postgresbdr_ssw.sh check
[sudo] password for abf: 
Sorry, try again.
[sudo] password for abf: 
Enter master ip please
Like 10.150.150.15
10.0.10.51
Enter slave ip please
10.0.10.52
Press enter with empty password
Просто щелкайте Enter не вводя пароль
q - выход из просмотра таблицы (если необходимо)
таблица нод на мастере по ecss_storekeeper_db
     node_sysid      |                                    node_local_dsn                                     | node_init_from_dsn 
---------------------+---------------------------------------------------------------------------------------+--------------------
 7569871659329171478 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1 | 
(1 row)

таблица нод на слейве по ecss_storekeeper_db
psql: error: connection to server at "10.0.10.52", port 5439 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
таблица коннекций на мастер по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569871659329171478 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(1 row)

таблица коннекций на слейве по ecss_storekeeper_db
psql: error: connection to server at "10.0.10.52", port 5439 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?

sudo ./postgresbdr_ssw.sh check
Enter master ip please
Like 10.150.150.15
10.0.10.51
Enter slave ip please
10.0.10.52
Press enter with empty password
Просто щелкайте Enter не вводя пароль
q - выход из просмотра таблицы (если необходимо)
таблица нод на мастере по ecss_storekeeper_db
     node_sysid      |                                    node_local_dsn                                     | node_init_from_dsn 
---------------------+---------------------------------------------------------------------------------------+--------------------
 7569871659329171478 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1 | 
(1 row)

таблица нод на слейве по ecss_storekeeper_db
таблица коннекций на мастер по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569871659329171478 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(1 row)

таблица коннекций на слейве по ecss_storekeeper_db
     conn_sysid      |                                       conn_dsn                                        
---------------------+---------------------------------------------------------------------------------------
 7569499877813944343 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
 7569514001040228374 | host=10.0.10.52 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
 7569871659329171478 | host=10.0.10.51 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1
(3 rows)



Удаление Postgres BDR


sudo apt remove -y ecss-postgres-bdr-ssw

При удаления, чтобы не потерять данные, остается volume контейнера (находится по пути /srv/ecss/ecss-postgres-bdr-ssw/) имя папки дополняется_дата_время,  . 

/srv/ecss/ecss-postgres-bdr-ssw$ ll
total 99692
drwxr-xr-x 5 root root      4096 ноя  7 13:48 ./
drwxr-xr-x 3 root root      4096 ноя  7 12:43 ../
-rwx------ 1 root root      6529 окт 23 14:48 cluster_resolver5439.sh*
-rw-r--r-- 1 root root       360 ноя  1 11:45 docker-compose.container.yml
-rw-r--r-- 1 root root 102029198 окт 23 14:48 ecss_postgres_bdr.tar
-rwx------ 1 root root     16657 окт 23 14:48 postgresbdr_ssw.sh*
drwxr-xr-x 3 root root      4096 ноя  7 13:48 volumes/
drwxr-xr-x 3 root root      4096 ноя  7 12:44 volumes_2025_11_07_13_04/


sudo apt purge -y ecss-postgres-bdr-ssw

/srv/ecss/ecss-postgres-bdr-ssw$ ll
total 99692
drwxr-xr-x 5 root root      4096 ноя  7 13:48 ./
drwxr-xr-x 3 root root      4096 ноя  7 12:43 ../
drwxr-xr-x 3 root root      4096 ноя  7 13:48 volumes_2025_11_07_13_48/
drwxr-xr-x 3 root root      4096 ноя  7 12:44 volumes_2025_11_07_13_04/

sudo apt autoremove -y


Восстановления кластера

Postgres работает в режиме Multi-master Replication:

BDR (Bi-Directional Replication) основан на функции логического декодирования в PostgreSQL, которая извлекает все постоянные изменения из журнала WAL (Write Ahead Log)

и переводит их в форму, специфичную для приложения (поток строк или команды SQL).