Сегодня мы поговорим как перенести боевую базу данных PostgreSQL без простоя нашего приложения. Для этого мы будем использовать репликацию.
Для начала нам нужен наш второй сервер, на который мы будем переносить базу, обратите вниманеи что для избежания большенства проблем, вам нужно использовать сервера с одинаковым программным обеспечением и версией PostgreSQL.
Для упрощения исходный сервер я буду называть master
, а сервер на который мы будем переносить базу replica
.
- СДЕЛАЙТЕ БЕКАП БАЗЫ ДАННЫХ И КОНФИГУРАЦИИ НА МАСТЕР СЕРВЕРЕ
- Включаем репликацию на мастер сервере, для этого в конфиг
postgresql.conf
добавляем следующие строки:
wal_level = replica
max_wal_senders = 3
wal_keep_size = 1024
- Разрешаем доступ к репликации, для этого в конфиг
pg_hba.conf
добавляем следующие строки:
host replication all <replica IP> scram-sha-256
- Производим первичную репликацию, при этом процессе у нас копируется вся информация с мастер сервера на реплику:
pg_basebackup -h <master IP> -D /var/lib/postgresql/data -U <replication_user> -Fp -Xs -P
- После этого мы можем запустить нашу реплику.
- Подготавливаем наши приложения к переносу, для этого мы должны изменить конфигурацию наших приложений, чтобы они использовали новый сервер.
- Останавливаем запись данных на мастер сервере:
SELECT pg_switch_wal();
- Переносим приложения на новый сервер.
- Повышаем реплику до мастера:
pg_ctl promote -D /var/lib/postgresql/data
Если что-то пошло не так
The database was initialized with LC_COLLATE “en_US.UTF-8”, which is not recognized by setlocale().
sudo locale-gen en_US.UTF-8
localedef -f UTF-8 -i en_US en_US.UTF-8
sudo update-locale
database “postgres” has a collation version mismatch
ALTER DATABASE guard REFRESH COLLATION VERSION;