Репликация PostgreSQL с помощью Bucardo — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
 
(не показано 16 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
Репликация PostgreSQL с помощью Bucardo на Oracle Linux 8.5
 
Репликация PostgreSQL с помощью Bucardo на Oracle Linux 8.5
  
Имеем два хоста с базами и один на котором развернём Bucardo. Репликация будет master - master
 
  
 +
Имеем два хоста с базами 172.19.3.109 и 172.19.3.110, которые будем реплицировать. Репликация будет master - master
  
Устанавливаем Bucardo и необходимые пакеты
+
Установим Postgresql13
 +
dnf module disable postgresql
 +
dnf install postgresql13-server postgresql13
 +
/usr/pgsql-13/bin/postgresql-13-setup initdb
 +
 
 +
 
 +
Вносим в настройки <code>/var/lib/pgsql/13/data/pg_hba.conf</code> записи для разрешения работы 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
 +
 
 +
 
 +
Разрешаем слушать на всех интерфейсах <code>/var/lib/pgsql/13/data/postgresql.conf</code>
 +
listen_addresses = '*'
 +
 
 +
 
 +
Включаем автозапуск и запускаем
 +
systemctl enable postgresql-13
 +
systemctl restart postgresql-13
 +
 
 +
 
 +
Устанавливаем необходимые пакеты
 
  yum install bucardo postgresql13-plperl perl-DBI perl-DBD-Pg perl-DBIx-Safe
 
  yum install bucardo postgresql13-plperl perl-DBI perl-DBD-Pg perl-DBIx-Safe
  
Строка 10: Строка 33:
 
Создаем директории для логирования и запуска  
 
Создаем директории для логирования и запуска  
 
  mkdir /var/log/bucardo
 
  mkdir /var/log/bucardo
chmod 777 /var/log/bucardo
 
 
  mkdir /var/run/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 '<font color=blue>DB_PASS</font>';"
 +
 +
 +
Дальнейшие действия проводим на первом хосте. Запускаем Bucardo
 +
bucardo start
 +
 +
 +
Добавляем базы данных с которыми будем работать (Главное требование для работы на нем должна быть та же схема данных что и на первом)
 +
bucardo add database keycloak1 dbname=keycloak dbhost=172.19.3.109 dbuser=bucardo dbpass=<font color=blue>DB_PASS</font>
 +
bucardo add database keycloak2 dbname=keycloak dbhost=172.19.3.110 dbuser=bucardo dbpass=<font color=blue>DB_PASS</font>
 +
 +
 +
Проверяем
 +
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 | <font color=blue>DB_PASS      </font> | active
 +
  keycloak2 | keycloak | 172.19.3.110 | bucardo | <font color=blue>DB_PASS      </font> | active
 +
(2 rows)
 +
 +
 +
Удаление баз
 +
bucardo remove database keycloakX
 +
 +
 +
Добавляем таблицы которые  будем реплицировать (Важно исключить таблицы без Primary Key)
 +
bucardo add table all --db=keycloak1 --herd=keycloak_herd
 +
 +
Здесь нужно заострить внимание на Primary Key. Bucardo, похоже, не работает с таблицами без первичных ключей. Синк сделать получится<br>
 +
Удаляем из обработки таблицу без 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      |
 +
 +
 +
 +
Другими словами, можно почитать здесь:<br>
 +
https://itnan.ru/post.php?c=1&p=327674<br>
 +
http://www.zaweel.ru/2016/07/postgresql_22.html#bucardo

Текущая версия на 13:45, 31 марта 2022

Репликация 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