Перейти к основному содержимому

Настройка многопоточной репликации

Использование многопоточного применения позволяет увеличить скорость записи в БД до 10 раз. Данное увеличение скорости заявляется для профиля нагрузки, приведенного в документе Руководство по обеспечению надежности.

Для большего увеличения скорости записи в базу данных на стороне воркера-применителя удалите ограничения (constraints), первичные (primary key) и внешние ключи (foreign key).

примечание

Рекомендуется настраивать репликацию только в многопоточном режиме.

Последовательность выполнения​

  1. Установите отложенные ограничения (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
      );
  2. Чтобы поменять все внешние ключи в указанной схеме на отложенные, пропишите в клиентском терминале postgresql, в БД применителя функцию:

    CREATE OR REPLACE FUNCTION change_constraints_deferrable(
    p_schema_name character varying,
    p_def boolean)
    RETURNS setof text
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    AS $BODY$
    DECLARE
    v_table_name VARCHAR;
    v_constraint_name VARCHAR;
    BEGIN
    FOR v_table_name IN
    SELECT c.relname FROM pg_class c
    JOIN pg_namespace n ON n.oid = c.relnamespace
    WHERE n.nspname = p_schema_name AND c.relkind = 'r'
    LOOP
    FOR v_constraint_name IN
    SELECT conname FROM pg_constraint
    WHERE contype = 'f'
    AND condeferred != p_def
    AND conrelid = (SELECT c.oid
    FROM pg_class c
    JOIN pg_namespace nsp ON nsp.oid = C.RELNAMESPACE
    WHERE c.relname = v_table_name and nsp.nspname = p_schema_name )
    LOOP
    EXECUTE '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$;
  3. Для вызова функции, введите команду SELECT:

    select * from change_constraints_deferrable(<schema_name>, true)
  4. Включите многопоточное применение.

    Внимание!

    Многопоточное применение без установки отложенных ограничений (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 в поле Опции отображается число потоков и другие параметры многопоточной репликации.