Настройка многопоточной репликации
Использование многопоточного применения позволяет увеличить скорость записи в БД до 10 раз. Данное увеличение скорости заявляется для профиля нагрузки, приведенного в документе Руководство по обеспечению надежности.
Для большего увеличения скорости записи в базу данных на стороне воркера-применителя удалите ограничения (constraints), первичные (primary key) и внешние ключи (foreign key).
Рекомендуется настраивать репликацию только в многопоточном режиме.
Последовательность выполнения
-
Установите отложенные ограничения (deferred constraints).
примечаниеИспользование отложенных ограничений (deferred constraints) без включения многопоточного применения не обеспечивает прироста скорости записи в БД. Настройка включения многопоточного применения описана в п.4.
Чтобы установить отложенные ограничения (deferred constraints):
-
Отредактируйте тип ограничений командой
ALTER:alter table <table_name> alter constraint <constraint_name> DEFERRABLE INITIALLY DEFERRED; -
Или при создании таблицы объявите внешние ключи как DEFERRABLE INITIALLY DEFERRED, если на таблицу нет ссылок из других таблиц по внешним ключам:
CREATE TABLE IF NOT EXISTS source.review(id bigint NOT NULL,check_in_date date,details character varying(5000) COLLATE pg_catalog."default",idx integer,rating integer,title character varying(255) COLLATE pg_catalog."default",trip_type integer,hotel_id bigint,CONSTRAINT review_pkey PRIMARY KEY (id) deferrable initially deferred,CONSTRAINT review_hotel_id_fkey FOREIGN KEY (hotel_id)REFERENCES source.hotel (id)DEFERRABLE INITIALLY DEFERRED);
-
-
Чтобы поменять все внешние ключи в указанной схеме на отложенные, пропишите в клиентском терминале postgresql, в БД применителя функцию:
CREATE OR REPLACE FUNCTION change_constraints_deferrable(p_schema_name character varying,p_def boolean)RETURNS setof textLANGUAGE 'plpgsql'COST 100VOLATILE PARALLEL UNSAFEAS $BODY$DECLAREv_table_name VARCHAR;v_constraint_name VARCHAR;BEGINFOR v_table_name INSELECT c.relname FROM pg_class cJOIN pg_namespace n ON n.oid = c.relnamespaceWHERE n.nspname = p_schema_name AND c.relkind = 'r'LOOPFOR v_constraint_name INSELECT conname FROM pg_constraintWHERE contype = 'f'AND condeferred != p_defAND conrelid = (SELECT c.oidFROM pg_class cJOIN pg_namespace nsp ON nsp.oid = C.RELNAMESPACEWHERE c.relname = v_table_name and nsp.nspname = p_schema_name )LOOPEXECUTE 'ALTER TABLE ' || p_schema_name || '.' || v_table_name || ' ALTER CONSTRAINT ' || v_constraint_name || case when p_def then ' DEFERRABLE INITIALLY DEFERRED' else '' end;RETURN NEXT v_table_name || '.'|| v_constraint_name;END LOOP;END LOOP;END;$BODY$; -
Для вызова функции, введите команду
SELECT:select * from change_constraints_deferrable(<schema_name>, true) -
Включите многопоточное применение.
Внимание!Многопоточное применение без установки отложенных ограничений (deferred constraints) не поддерживается.
Чтобы включить многопоточное применение, добавьте параметр
"apply.thread.count": {число_потоков}, указав число потоков, которое хотите запустить. Для этого в интерфейсе консоли управления перейдите на вкладку Соединения, откройте окно Редактирование свойств соединения для соединения Target и найдите поле Опции:
Параметры многопоточной репликации
apply.thread.count— количество потоков репликации (default = 1);max.pool.size— количество соединений к БД приемнику в пуле, рекомендуется установить какapply.thread.count+ 2;transaction.size— количество векторов изменений в транзакции (default = 500);db.linger.ms— количество миллисекунд на формирование пачки векторов изменений в транзакции (default = 1000).
Если время на сбор транзакции db.linger.ms меньше значения по умолчанию, то количество векторов изменений в одной транзакции transaction.size может быть меньше, чем выставлено в параметре.
Рекомендуемые значения параметров многопоточной репликации
{
"max.pool.size": 20,
"apply.thread.count": 18,
"transaction.size": 100,
"db.linger.ms": 1000
}
Результат
В интерфейсе консоли управления, во вкладке Соединения, окне Редактирование свойств соединения для соединения Target в поле Опции отображается число потоков и другие параметры многопоточной репликации.