Репликация PostgreSQL с помощью Bucardo
Репликация 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