зеркало из
				https://github.com/iharh/notes.git
				synced 2025-10-31 13:46:08 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			115 строки
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			115 строки
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| https://www.postgresql.org/docs/current/logical-replication-subscription.html
 | |
| 
 | |
| 2024
 | |
| https://habr.com/ru/companies/postgrespro/articles/793158/
 | |
| https://habr.com/ru/companies/postgrespro/articles/793156/
 | |
| https://habr.com/ru/companies/postgrespro/articles/793068/
 | |
| https://www.dolthub.com/blog/2024-03-08-postgres-logical-replication/
 | |
| ???
 | |
| https://www.crunchydata.com/blog/active-active-postgres-16
 | |
| https://www.unixmen.com/database-system-postgresql-replication-ubuntu-16-04/
 | |
| 
 | |
| *******************************************************************************************************************************************************************
 | |
| Про потоковую (физическую) репликацию мы с вами много уже говорили. Пришла пора поговорить про логическую репликацию в PostgreSQL и настроить ее.
 | |
| 
 | |
| Для начала вспомним что это такое. Если говорить про разницу между логической и потоковой репликацией, то это как разница между pg_dump и pg_basebackup, 
 | |
| т.е. в первом случае мы передаем SQL код, во втором физические файлы.
 | |
| 
 | |
| Логическая репликация появилась в PostgreSQL с версии 10, и с тех пор сильно продвинулась в своем развитии.
 | |
| 
 | |
| Логическая репликация позволяет передавать не всю базу целиком в отличии от потоковой, а только необходимые данные и снимает ряд ограничений физической репликации. 
 | |
| В частности, нам нет необходимости, чтобы на главном сервере и на сервере реплики стояли одинаковые версии PostgreSQL, и была полная бинарная совместимость ОС.
 | |
| 
 | |
| Сценарии применения логической репликации могут быть следующие:
 | |
| 
 | |
| ✅ Консолидация данных по определенным таблицам в главной базе;
 | |
| 
 | |
| ✅ Наоборот, отправка только необходимых таблиц в другие базы;
 | |
| 
 | |
| ✅ С помощью логической репликации можно ухитриться и обновить версию PostgreSQL без простоя;
 | |
| 
 | |
| И много чего еще...
 | |
| 
 | |
| Как видите, тут горизонты шире чем при потоковой репликации, но она и предназначена для других целей, для бэкапов и обеспечения отказоустойчивости в основном.
 | |
| 
 | |
| Важное ограничение логической репликации заключается в том, что реплицируемые таблицы должны иметь первичный ключ (primary key). 
 | |
| Кроме того, операции DDL, схема базы данных и последовательности не реплицируются. 
 | |
| Также нужно быть осторожным с операцией TRUNCATE, так как опусташаются только таблицы, входящие в репликацию (подписку).
 | |
| 
 | |
| Логическая репликация работает по принципу публикации и подписки, т.е. сервер реплики подписывается на изменения объектов на сервере мастере и принимает изменения.
 | |
| 
 | |
| Теперь давайте посмотрим как это настроить. Первое что нам нужно сделать, изменить параметр wal_level на logical в файле postgresql.conf и перезапустить службу PostgreSQL для принятия изменений.
 | |
| 
 | |
| Предположим, что мы хотим реплицировать на сервер реплику одну таблицу с именем my_table.
 | |
| 
 | |
| Создаем публикацию для этой таблицы на мастере:
 | |
| 
 | |
| CREATE PUBLICATION my_publication FOR TABLE my_table;   
 | |
| 
 | |
| Теперь идем на реплику. На реплике база данных, в которую мы хотим реплицировать таблицу уже должна существовать. Создаем подписку:
 | |
| 
 | |
| CREATE SUBSCRIPTION my_subscription CONNECTION 'host=ip_адрес_мастера port=5432 dbname=имя_базы' PUBLICATION my_publication;
 | |
| 
 | |
| Соответственно, чтобы подключение состоялось, вам может понадобиться подправить файл pg_hba.conf на мастере, прописав в разрешенные подключения ip адрес сервера реплики.
 | |
| 
 | |
| На этом все! Логическая репликация должна работать. В этом посте мы посмотрели самые основы логической репликации, в дальнейшем будем развивать тему.
 | |
| 
 | |
| *******************************************************************************************************************************************************************
 | |
| CLI оркестратор логической репликации pg_easy_replicate.
 | |
| 
 | |
| Про основы логической репликации и ее простейшую настройку мы уже с вами говорили (https://t.me/pg_guru/788). 
 | |
| Сегодня поговорим о замечательной утилите, которая позволит нам упростить настройку логической репликации, и даже обеспечить switchover (передача роли основного узла другому узлу).
 | |
| 
 | |
| Речь пойдет об утилите pg_easy_replicate. Утилита написана на Ruby и поддерживает все версии PostgreSQL, начиная с 10й. 
 | |
| Она способна с помощью логической репликации перенести все данные из одного кластера PostgreSQL в другой, а потом перевести бывший основной кластер в режим только для чтения. 
 | |
| Такая фишка может пригодиться, например, для обновления PostgreSQL на мажорную версию с минимальным простоем.
 | |
| 
 | |
| Естественно, что для использования утилиты, ваша PostgreSQL уже должна быть настроена для логической репликации, т.е. параметр wal_level должен быть в значении logical 
 | |
| и должны быть настроены соответствующие разрешения в файле pg_hba.conf.
 | |
| 
 | |
| Для установки утилиты нам потребуется сам язык Ruby в системе не ниже версии 3.0. Устанавливаем его следующими командами:
 | |
| 
 | |
| # sudo apt update
 | |
| # sudo apt install ruby-full
 | |
| 
 | |
| Далее можем проверить версию Ruby с помощью следующей команды:
 | |
| 
 | |
| # ruby -v
 | |
| 
 | |
| Дальше устанавливаем утилиту с помощью местного (Ruby) менеджера пакетов:
 | |
| 
 | |
| # gem install pg_easy_replicate
 | |
| 
 | |
| Утилита доступна также в виде докер контейнера. Установить можно так:
 | |
| 
 | |
| # docker pull shayonj/pg_easy_replicate:latest
 | |
| 
 | |
| Теперь нам нужно установить несколько переменных окружения, чтобы в дальнейшем их использовать в командах
 | |
| 
 | |
| # export SOURCE_DB_URL="postgres://USERNAME:PASSWORD@host1:5432/DATABASE_NAME"
 | |
| # export TARGET_DB_URL="postgres://USERNAME:PASSWORD@host2:5432/DATABASE_NAME"
 | |
| 
 | |
| Как вы уже поняли, эти две переменные описывают методы подключения к вашим базам данных.
 | |
| 
 | |
| Далее нам необходимо создать специального пользователя для репликации с правами superuser и группу для репликации. 
 | |
| Группа в понимании утилиты - это логическая единица, объединяющая в себе настройки конкретной репликации. 
 | |
| Под одной группой вы можете реплицировать все таблицы одной базы в другую.
 | |
| 
 | |
| # pg_easy_replicate bootstrap --group-name replica1 --special-user-role="user_for_replica" --copy-schema
 | |
| 
 | |
| Также перед началом процесса репликации мы можем проверить настройки:
 | |
| 
 | |
| # pg_easy_replicate config_check --special-user-role="user_for_replica" --copy-schema
 | |
| 
 | |
| Если получили вот такое сообщение;
 | |
| 
 | |
| Config is looking good.
 | |
| 
 | |
| то можно начать процесс репликации с помощью команды:
 | |
| 
 | |
| # pg_easy_replicate start_sync --group-name replica1
 | |
| 
 | |
| Со всеми возможными настройками и возможностями утилиты вы можете ознакомиться в ее официальном GitHub:
 | |
| 
 | |
| ➡️ https://github.com/shayonj/pg_easy_replicate/
 | 
