Репликация PostgreSQL с помощью Bucardo

Материал из megapuper
Перейти к: навигация, поиск

Репликация PostgreSQL с помощью Bucardo на Oracle Linux 8.5


Имеем два хоста с базами 172.19.3.109 и 172.19.3.110, которые будем реплицировать. Репликация будет master - master

Установим Postgresql13

dnf module disable postgresql
dnf install postgresql13-server postgresql13
/usr/pgsql-13/bin/postgresql-13-setup initdb


Вносим в настройки /var/lib/pgsql/13/data/pg_hba.conf записи для разрешения работы bucardo c репликой на реплицируемых хостах

host    all             bucardo         127.0.0.1/32               trust
host    all             bucardo         172.19.3.110/32            password

host    all             bucardo         127.0.0.1/32               trust
host    all             bucardo         172.19.3.109/32            password


Разрешаем слушать на всех интерфейсах /var/lib/pgsql/13/data/postgresql.conf

listen_addresses = '*'


Включаем автозапуск и запускаем

systemctl enable postgresql-13
systemctl restart postgresql-13


Устанавливаем необходимые пакеты

yum install bucardo postgresql13-plperl perl-DBI perl-DBD-Pg perl-DBIx-Safe


Создаем директории для логирования и запуска

mkdir /var/log/bucardo
mkdir /var/run/bucardo


Запускаем установку Bucardo

bucardo install


Вывод следующего окна где надо будет задать соответствующие параметры

This will install the bucardo database into an existing Postgres cluster.
Postgres must have been compiled with Perl support, and you must connect as a superuser

Current connection settings:
1. Host:           localhost
2. Port:           5432
3. User:           postgres
4. Database:       postgres
5. PID directory:  /var/run/bucardo
Enter a number to change it, P to proceed, or Q to quit: P


Заведём пароль пользователя bucardo на каждом из серверов:

psql -U postgres -c "ALTER USER bucardo WITH PASSWORD 'DB_PASS';"


Дальнейшие действия проводим на первом хосте. Запускаем Bucardo

bucardo start


Добавляем базы данных с которыми будем работать (Главное требование для работы на нем должна быть та же схема данных что и на первом)

bucardo add database keycloak1 dbname=keycloak dbhost=172.19.3.109 dbuser=bucardo dbpass=DB_PASS
bucardo add database keycloak2 dbname=keycloak dbhost=172.19.3.110 dbuser=bucardo dbpass=DB_PASS


Проверяем

bucardo list database
Database: keycloak1  Status: active  Conn: psql -U bucardo -d keycloak -h 172.19.3.109
Database: keycloak2  Status: active  Conn: psql -U bucardo -d keycloak -h 172.19.3.110


Эти настройки берутся из таблицы db базы bucardo, где и сидит упомянутый выше пароль

psql -U postgres bucardo -c "SELECT name,dbname,dbhost,dbuser,dbpass,status FROM db;"
   name    |  dbname  |    dbhost    | dbuser  |     dbpass     | status 
-----------+----------+--------------+---------+-----------------+--------
 keycloak1 | keycloak | 172.19.3.109 | bucardo | DB_PASS        | active
 keycloak2 | keycloak | 172.19.3.110 | bucardo | DB_PASS        | active
(2 rows)


Удаление баз

bucardo remove database keycloakX


Добавляем таблицы которые будем реплицировать (Важно исключить таблицы без Primary Key)

bucardo add table all --db=keycloak1 --herd=keycloak_herd

Здесь нужно заострить внимание на Primary Key. Bucardo, похоже, не работает с таблицами без первичных ключей. Синк сделать получится
Удаляем из обработки таблицу без Primary Key

bucardo remove table public.databasechangelog


Проверяем

bucardo list table
bucardo list herd


Удаление таблиц

bucardo remove table all


Добавляем последовательности, если есть, в кейклоке не было

bucardo add sequence all --db=keycloak1 --herd=keycloak_herd


Удаление

bucardo remove sequence all


Создаем репликационную группу. Здесь указываем базу которая будет источником, а которая реципиентом данных, source здесь тот, кто работает и как источник и как реципиент, а target — только реципиент.

bucardo add dbgroup keycloak_servers

для MASTER<->MASTER

bucardo add dbgroup keycloak_servers keycloak1:source
bucardo add dbgroup keycloak_servers keycloak2:source

для MASTER->SLAVE

bucardo add dbgroup keycloak_servers rkeycloak1:source
bucardo add dbgroup keycloak_servers keycloak2:target


Проверяем

bucardo list dbgroup
dbgroup: keycloak_servers  Members: keycloak1:source keycloak2:source


Удаление групп

bucardo remove dbgroup keycloak_server


Добавляем синхронизацию

bucardo add sync keycloak_sync herd=keycloak_herd dbs=keycloak_servers

Может выскочить ошибка из-за не удалённой таблицы с Primary Key, как избежать - выше

Failed to add sync: DBD::Pg::st execute failed: ERROR:  Table "public.databasechangelog" must specify a primary key! at line 119. at line 30.
CONTEXT:  PL/Perl function "validate_sync" at /sbin/bucardo line 4670.


Проверяем

bucardo list sync
Sync "keycloak_sync"  Relgroup "keycloak_herd" [Active]
  DB group "keycloak_servers" keycloak1:source keycloak2:source 


Удаление sync

bucardo remove sync keycloak_sync


Для вступления настроек в силу необходимо произвести рестарт

bucardo restart


Проверяем что всё завелось

bucardo status

PID of Bucardo MCP: 1565780
 Name                 State    Last good    Time      Last I/D    Last bad    Time  
====================+========+============+=========+===========+===========+=======
 keycloak_sync      | Good   | 17:54:27   | 12m 50s | 0/1       | none      |


Другими словами, можно почитать здесь:
https://itnan.ru/post.php?c=1&p=327674
http://www.zaweel.ru/2016/07/postgresql_22.html#bucardo