powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / осудите стратегию репликации
57 сообщений из 57, показаны все 3 страниц
осудите стратегию репликации
    #38504150
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Разрабатываю рукописную репликацию справочников.

Репликация односторонняя, т.е. база tgt должна следовать за базой src.
В базе tgt запись в справочники не происходит иначе, как чем через репликацию.

Стратегия принята примерно такая:

все пишущие транзакции в системе - snapshot.

имеется таблица
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE RPL_EDITION (
    ID          D_UPID NOT NULL /* D_UPID = NUMERIC(18,0) */,
    REC_ID      SIMPLE_BIGINT NOT NULL /* SIMPLE_BIGINT = BIGINT */,
    TABLE_NAME  VARCHAR32 NOT NULL /* VARCHAR32 = VARCHAR(32) */
);



имеется набор триггеров, заносящих в неё запись при insert и update
(delete пока вовсе не обрабатывается, потом планирую сделать поле пометки, как в dbf).

id в ней - это суррогатный ключ, порождается генератором.

Для маленьких таблиц rec_id всегда = 0, для больших - rec_id = суррогатный ключ изменяемой записи.
Для таблиц, подчинённых большим - rec_id = значение FK ссылки на владельца.

За репликацию отвечает отдельное приложение, подключенное к обеим базам.
Периодически или по пинку от пользователя оно запускает репликацию, к-рая состоит в следующем:

1. стартуется одна транзакция в src и одна - в tgt (обе - snapshot)

2. Смотрим, есть ли в таблице rpl_edition базы src записи, которых нет в такой же таблице базы tgt.
Если есть, то берём всё множество таких записей и упорядочиваем его в порядке ссылки таблиц
(так, чтобы записи, на которую идут ссылки, появились до того, как записи, которые ссылаются).
Циклические и рекурсивные ссылки разрешаются тем, что таблица обрабатывается более одного раза,
но в первый раз поля, образующие цикл, остаются null-ами.
3. По каждой отличающейся записи в rpl_edition проводим соответствующую репликацию, т.е. берём данные
из какой-то таблицы в src и пишем в такую же таблицу в tgt.
4. Все такие же записи вставляются в rpl_edition базы tgt.
5. commit в обоих базах (в src мы ничего не писали)
6. в отдельной транзакции с коротким таймаутом, отдельным тредом стираем все совпадающие записи
в rpl_edition базы src. Если не стёрлось - откатываем её.
7. Повторение п.7 для базы tgt.
8. Отключение триггеров на реплицируемых таблицах: видимо, будет стоять развязка по пользователю, т.е., если пользователь= репликатор, то определённые триггеры отключаются (спасибо Ivan_Pisarevsky), хотя для начала хочу полениться
и сделать просто переменную контекста, которую устанавливаем и тем самым отключаем триггер.

Думал чуть ни неделю над этим алгоритмом. Вроде всё нормально, но покоя в душе нет.
Прошу осудить и кинуть тапком, сказав, какие грабли меня при этом ждут.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504305
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас все по другому и у DS не так.
изобретаешь велосипед?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504322
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, изобретаю потихоньку... А как у вас?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504327
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyУ нас все по другому и у DS не так.
изобретаешь велосипед?
Оно доступно в исходниках? Или идейно описано?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504396
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сабжу - "алгоритм" о[б]суждать не буду
(я даже не всё осилил из сказанного), его
и без меня тут раскритикуют в пух и прах,
замечу только, что если в SRC ничего не
меняется за "первый проход", то может и
не нужно снапшот в ней стартовать-то?
Дело ведь небыстрое, чего зазря БД и
сервер напрягать. RC read достаточно.

P.S. И почему tgt, а не dst (или хотя бы trgt)?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504405
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам, привычка укладываться в 8.3 :)

Может, dst было бы и правильнее, но уже поздно для данного о(б)суждения.

src может меняться в любой момент времени, отсюда и снапшот.

Я вообще хочу все перевести на снапшоты, ввиду моей
неспособности/лени проанализировать, как всё
будет работать с read committed - слишком много возможных
аномалий нужно предполагать на каждую строчку кода.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504445
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden> src может меняться в любой момент времени, отсюда и снапшот.

Для этого снапшот не нужен, достаточно ID-шников.
Впрочем, это смотря как реализовано, в вашем случае,
может быть, и нельзя.

> Я вообще хочу все перевести на снапшоты

Ну Бог в помощь, что тут скажешь.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38504900
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeОно доступно в исходниках?Насколько я знаю нет. Внутренний проект.
NickDeeИли идейно описано?поглядел публикации... описано отрывочно и не все.
buddenА как у вас?традиционно. z-триггреы готовят стэйтменты, потом через сервисы на сокетах обмениваются с заданной периодичностью подпакованными скриптами. Ключи с разбивкой по диапазоном, гуевая админка и т.д.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505073
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, я вне традиции, видимо :)
Если она где-то описана, положи в тапок ссылку
и кинь в меня им.
Что такое z-триггеры? Яндекс промолчал.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505149
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenЧто такое z-триггеры?просто название такое, по триггеру на афтер всех событий, формирует портянку, которую потом можно применить на целевой БД.
вот просто пример на маленькой табличке:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
CREATE OR ALTER trigger tai_fabric_dop_z for fabric_dop
active after insert position 10
AS
 DECLARE VARIABLE Z_ID NUMERIC(18,0);
 DECLARE VARIABLE LOG_ID NUMERIC(18,0);
 DECLARE VARIABLE SQLTEXT VARCHAR(8192);
 DECLARE VARIABLE TESTSTR VARCHAR(8192);
BEGIN

/*********************************************************/
/*   WARNING! THIS SCRIPT IS CAN BE CREATED AUTOMATION!  */
/*              DONT CHANGE HIS MANUALLY !!!             */
/*********************************************************/

 EXECUTE PROCEDURE TEST_REPLICAT_TMP RETURNING_VALUES LOG_ID;
 Z_ID = GEN_ID(Z_ID_GEN, 1);

 SQLTEXT = 'insert into FABRIC_DOP (SPAG_OSN, SPAG_DOP, VM, TIMEP, LOGIN' || 
') values(';

 /* SPAG_OSN */
 IF (NEW.SPAG_OSN IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || CAST(NEW.SPAG_OSN AS VARCHAR(30)) || ', ';

 /* SPAG_DOP */
 IF (NEW.SPAG_DOP IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || CAST(NEW.SPAG_DOP AS VARCHAR(30)) || ', ';

 /* VM */
 IF (NEW.VM IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || CAST(NEW.VM AS VARCHAR(30)) || ', ';

 /* TIMEP */
 IF (NEW.TIMEP IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || '''' || CAST(NEW.TIMEP AS VARCHAR(30)) || '''' || ', ';

 /* LOGIN */
 IF (NEW.LOGIN IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ') ';
 ELSE BEGIN
   EXECUTE PROCEDURE REPLACE_SEP_STRING(NEW.LOGIN) RETURNING_VALUES(:TESTSTR);
   SQLTEXT = SQLTEXT || '''' || TESTSTR || '''' || ') ';
 END

 /* ВСТАВКА В Z_LOG_TABLE */
 insert into Z_LOG_TABLE (Z_ID, LOG_ID, L_TABLE, L_OPER, SQLTEXT)
 values(:Z_ID, :LOG_ID, 'FABRIC_DOP', 1, :SQLTEXT);

END


Купить готовый репликатор не? IBReplicator вполне демократичен по расценкам.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505299
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, да денег не жалко, в общем-то.
Но есть ряд причин. Основная - когда я в это ввязался, недооценил
сложность задачи. Второстепенная - своё легче кастомизовать,
если гибкости не хватило. И ещё есть причины, но не хочу лишние
буквы плодить.

А как у тебя упорядочиваются скрипты? Пусть у нас есть таблица
со ссылкой на себя. За счёт чего запись А придёт в tgt раньше, чем ссылающаяся
на неё запись Б? Учитывается время вставки? А если придут с меньшим
интервалом, чем разрешение часов? Генератор?

Каков уровень изоляции транзакций? Бывают ли сбои из-за внешних ключей,
особенно на delete?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505306
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenА как у тебя упорядочиваются скрипты?не понял вопрос. стэйтменты на базе приемнике выполняются ровно в том же порядке, что и в базе источнике. По диапазонам ключей, ключи 64 битные, обычные чиселки, таймштампы вообще не при делах.
buddenразрешение часов?Пап, это ты с кем сейчас разговаривал? (с)
buddenБывают ли сбоисистема отработанная, вполне себе устойчивая. встает практически только по "человеческому фактору"
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505433
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevskyвот просто пример на маленькой табличке:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
CREATE OR ALTER trigger tai_fabric_dop_z for fabric_dop
active after insert position 10
AS
 DECLARE VARIABLE Z_ID NUMERIC(18,0);
 DECLARE VARIABLE LOG_ID NUMERIC(18,0);
 DECLARE VARIABLE SQLTEXT VARCHAR(8192);
 DECLARE VARIABLE TESTSTR VARCHAR(8192);
BEGIN

/*********************************************************/
/*   WARNING! THIS SCRIPT IS CAN BE CREATED AUTOMATION!  */
/*              DONT CHANGE HIS MANUALLY !!!             */
/*********************************************************/

 EXECUTE PROCEDURE TEST_REPLICAT_TMP RETURNING_VALUES LOG_ID;
 Z_ID = GEN_ID(Z_ID_GEN, 1);

 SQLTEXT = 'insert into FABRIC_DOP (SPAG_OSN, SPAG_DOP, VM, TIMEP, LOGIN' || 
') values(';

 /* SPAG_OSN */
 IF (NEW.SPAG_OSN IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || CAST(NEW.SPAG_OSN AS VARCHAR(30)) || ', ';

 /* SPAG_DOP */
 IF (NEW.SPAG_DOP IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || CAST(NEW.SPAG_DOP AS VARCHAR(30)) || ', ';

 /* VM */
 IF (NEW.VM IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || CAST(NEW.VM AS VARCHAR(30)) || ', ';

 /* TIMEP */
 IF (NEW.TIMEP IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ', ';
 ELSE
   SQLTEXT = SQLTEXT || '''' || CAST(NEW.TIMEP AS VARCHAR(30)) || '''' || ', ';

 /* LOGIN */
 IF (NEW.LOGIN IS NULL) THEN
   SQLTEXT = SQLTEXT || 'NULL' || ') ';
 ELSE BEGIN
   EXECUTE PROCEDURE REPLACE_SEP_STRING(NEW.LOGIN) RETURNING_VALUES(:TESTSTR);
   SQLTEXT = SQLTEXT || '''' || TESTSTR || '''' || ') ';
 END

 /* ВСТАВКА В Z_LOG_TABLE */
 insert into Z_LOG_TABLE (Z_ID, LOG_ID, L_TABLE, L_OPER, SQLTEXT)
 values(:Z_ID, :LOG_ID, 'FABRIC_DOP', 1, :SQLTEXT);

END


Я вот тоже как-то делал двустороннюю репликацию для своей системы, но не на генерации sql.
У системы было два типа второстепенных серверов - филиальные и дилерские, и правила синхронизации для них разные.
Например дилерам не должны уходить внутрениие документы компании, кроме шаблонов и документов созданных самим дилером (причём дилерские документы не должны уходить другим дилерам). К тому же дилерам не уходит куча таблиц и многие поля. Так же и при возвращении данных с второстепенных серверов. Правила синхронизации настраиваются из интерфейса системы (для каждой таблицы и для кажого поля).
На sql-логе такого имхо не сделать.
Обошёлся тремя табличками:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE TABLE REPL_DATA (
    GUID           VARCHAR(32) CHARACTER SET NONE NOT NULL,
    RECORDID       INTEGER NOT NULL,
    EDITDATETIME   TIMESTAMP NOT NULL, -- = 'NOW' on insert or update
    RECORDVERSION  INTEGER NOT NULL, -- = gen_id(rec_version_id, 1) on insert or update
    TABLEID        INTEGER NOT NULL, -- ->REPL_TABLES
    ISDELETED      INTEGER NOT NULL -- 0, 1
);
ALTER TABLE REPL_DATA ADD CONSTRAINT UNQ_REPL_DATA_RECORDVERSION UNIQUE (RECORDVERSION);
ALTER TABLE REPL_DATA ADD CONSTRAINT UNQ_REPL_DATA_RECORDID_TABLEID UNIQUE (RECORDID, TABLEID);
ALTER TABLE REPL_DATA ADD CONSTRAINT PK_REPL_DATA PRIMARY KEY (GUID);

CREATE TABLE REPL_TABLES (
    ID         INTEGER NOT NULL,
    TABLENAME  VARCHAR(31) NOT NULL
);
ALTER TABLE REPL_TABLES ADD CONSTRAINT PK_REPL_TABLES PRIMARY KEY (ID);

CREATE TABLE REPL_VARIABLES (
    -- последний отправленный на центральный сервер REPL_DATA.RECORDVERSION
    LASTSENDEDRECVERSION    INTEGER NOT NULL, 
    -- последний полученный с центрального сервера REPL_DATA.RECORDVERSION
    LASTRECEIVEDRECVERSION  INTEGER NOT NULL  
);


Первые две таблицы лежат как на центральном сервере, так и на второстепенном. Третья нужна только на второстепенных серверах.
Процедура синхронизации инициируется второстепенным сервером.
Для начала он в снапшот-транзакции собирает все записи where REPL_DATA.RECORDVERSION > REPL_VARIABLES.LASTSENDEDRECVERSION, потаблично (это все данные, изменённые с момента последней удачной синхронизации).
Отсылает их на центральный сервер, вместе с REPL_VARIABLES.LASTRECEIVEDRECVERSION. Центральный сервер их применяет, в соответствии с правилами, и в соответствии с правилами (на основе уже данных в его REPL_DATA, и учитывая присланный с второстепенного сервера REPL_VARIABLES.LASTRECEIVEDRECVERSION) формирует пакет данных для отсылки на второстепенный сервер (в пакете есть и значение gen_id(rec_version_id, 0)).
Второстепенный сервер получает пакет, применяет, апдейтит у себя LASTSENDEDRECVERSION и LASTRECEIVEDRECVERSION.
Вот :)
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505445
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskybuddenЧто такое z-триггеры?по триггеру на афтер всех событий, формирует портянку, которую потом можно применить на целевой БД
Как я понял формируется таблица из insert-sql.
А как решается вопрос с блобами и большими varchar?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505451
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeДля начала он в снапшот-транзакции собирает все записи where
REPL_DATA.RECORDVERSION > REPL_VARIABLES.LASTSENDEDRECVERSION, потаблично (это все данные,
изменённые с момента последней удачной синхронизации).
Работоспособно исключительно в монопольном режиме.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505470
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПервые две таблицы лежат как на центральном сервере, так и на второстепенном. Третья нужна только на второстепенных серверах.
Процедура синхронизации инициируется второстепенным сервером.
У меня организованно похожим образом, только REPL_VARIABLES есть и на главном сервере (с кодами второстепенных баз).
Можно отсылать данные с главного сервера, например по почте. Отправляем все неподтвержденные данные, а база-приемник принимает только то, что еще не принимала.
После приема данных, чистится таблица REPL_DATA, где RECORDVERSION < select min(LASTRECEIVEDRECVERSION) from REPL_VARIABLES
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505485
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeДля начала он в снапшот-транзакции собирает все записи where
REPL_DATA.RECORDVERSION > REPL_VARIABLES.LASTSENDEDRECVERSION, потаблично (это все данные,
изменённые с момента последней удачной синхронизации).
Работоспособно исключительно в монопольном режиме.

Почему?
Пользователи второстепенного сервера работают дальше, вставляют и редактируют записи (при этом меняется RECORDVERSION в REPL_DATA, или туда добавляются записи). Эти изменения учтутся при следующей синхронизации.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505510
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПочему?
Снапшот не в состоянии увидеть записи, котрые были изменены раньше его старта, но
закоммичены позже. Для них REPL_DATA.RECORDVERSION навсегда меньше
REPL_VARIABLES.LASTSENDEDRECVERSION и изменения не попадают в репликационный пакет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505534
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeПочему?
Снапшот не в состоянии увидеть записи, котрые были изменены раньше его старта, но
закоммичены позже. Для них REPL_DATA.RECORDVERSION навсегда меньше
REPL_VARIABLES.LASTSENDEDRECVERSION и изменения не попадают в репликационный пакет.

Ага. Понятно о чём ты :)
У меня сервер приложений. И я начинаю процесс действительно эксклюзивно. Потом лок отпускаю.
Но применение полученных данных тоже происходит эксклюзивно.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505566
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeПочему?
Снапшот не в состоянии увидеть записи, котрые были изменены раньше его старта, но
закоммичены позже. Для них REPL_DATA.RECORDVERSION навсегда меньше
REPL_VARIABLES.LASTSENDEDRECVERSION и изменения не попадают в репликационный пакет.

Через все это пришлось пройти.
Решается добавлением в REPL_DATA поля
EDITTRANSACTION INTEGER DEFAULT current_transaction;
и процедуры получения GET_MAX_RECORDVERSION
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or alter procedure GET_MAX_RECORDVERSION
returns (
    RECORDVERSION integer)
AS
begin
  execute statement ('select min(mon$timestamp), min(mon$transaction_id) from mon$transactions where mon$read_only = 0 and mon$attachment_id <> current_connection')
  as user 'SYSDBA' password 'masterkey'
  into min_time, min_id;

  select max(RECORDVERSION) from REPL_DATA
  where id_transaction <= :endid and EDITTRANSACTION <= :min_id and EDITDATETIME < :min_time
  into RECORDVERSION;

  suspend;
end

...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505575
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийА как решается вопрос с блобамиположил в файл, взял из файла.
Шавлюк Евгенийбольшими varchar?их нет.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505581
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,

ага до первого б/р
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505584
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, вот тут и есть самое непонятное. Раз порядок стейтментов как-то определён и это не таймстамп, то значит генератор. Если генератор, то порядок следования апдейтов в репликации слабо связан с порядком старта и коммита транзакции, которая его создала. Если транзакция А стартовала до старта транзакции Б и финишировала до финиша транзакции Б, значит ли это, что она более ранняя? Если используется генератор, то запрос от транзакции Б может раньше пойти на репликацию, чем запрос от транзакции А. И получится, что транзакция Б - "раньше", чем А. Оттого я и спросил про таймстампы. Вроде из этого ничего страшного не следует, потому что есть ещё блокировка записей. Т.е., если здесь будет какие-то конфликтующие друг с другом изменения, одна из транзакций просто не будет закоммичена. Но я не могу сказать, что полностью уверен в надёжности.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505633
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисШавлюк Евгений,

ага до первого б/р
есть процедура before_replication, где
Код: sql
1.
2.
3.
  update REPL_DATA set
    EDITTRANSACTION = 0
  where EDITTRANSACTION > current_transaction or EDITTRANSACTION is null
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505634
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenгенераторда.
buddenпорядок следования апдейтов в репликации слабо связан с порядком старта и коммита транзакциипрошел коммит, попала строчка в репликацию; откатилась, возникла дырка в нумерации. Не вижу проблемы, ну подумаешь дырка, при 18 десятичных знаках на номер как-то дырки не беспокоят совсем. Если транзакции завершились в разное время, значит в базе приемнике они отработают тоже в разное время, что-то особой проблемы эмирически не видится, да и практика показывает, что ничего страшного не случается.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505700
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, да не в дырках дело. Вот какой сценарий
может быть проблемным:

началась транзакция А, да призадумалась
началась транзакция Б (read committed)
транзакция Б запросила генератор и получила 1
транзакция А запросила генератор и получила 2
транзакция А вставила запись АА в таблицу data
транзакция А вставила в таблицу скриптов репликации ('insert into data запись АА ',2)
транзакция А завершилась
транзакция Б вставила запись ББ в таблицу data
-- где запись ББ ссылается на АА
транзакция Б вставила в таблицу скриптов репликации ('insert into data запись ББ',1),
транзакция Б завершилась

Просыпается мафия репликатор.
select * from таблица_скриптов order by id

По порядку она отправляет в другую базу сначала запись ББ, потом запись АА.
Запись ББ не вставляется, т.к. нарушение FK.

Вот такой кошмарный сценарий рисуется мне.
Вроде как от него должно защитить то, что значения генератора не берутся заранее,
транзакция - снапшот, а таблицы я сортирую по ссылкам друг на друга.

Но вдруг есть ещё какая-нибудь лазейка.
Или, допустим, если ясно, что такой сценарий со снапшотом невозможен, то можно
и не сортировать таблицы, а отправлять именно поток изменений в "порядке" их
возникновения.

практика показывает, что ничего страшного не случается.
А вот это обнадёживает :)

NickDee, вариант с монопольной блокировкой базы или таблицы
мне не нравится.
Шавлюк Евгений, ваш вариант тоже не нравится из-за необходимости
лишних действий при б/р.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505729
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden,

после чтения трехдневных курсов я смутно понимаю этот топик, но зато я помню, что существует решение по нахождению новых вставленных и измененных записей, через доп. столбец с инкрементируемым генератором. При Insert и update этот генератор всегда инкрементируется, и пишется в этот доп. столбец.
Некая клиенская часть получает последний номер генератора и затем считывает данные с gen > N. Затем она запоминает кол-во записей и N+X, и при последующем чтении использует это значение для поиска новых записей. Как-то так.
Исключением тут является удаление записей, потому что удаленных записей нет, а значит и нечего вычитать из "столбца с генератором". Отсюда вывод - или не удалять записи (а лишь "помечать" их на удаление программно), или применять другое решение.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505776
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenNickDee, вариант с монопольной блокировкой базы или таблицы
мне не нравится.
Реализация такая. Но это не значит, что нельзя написать без блокировок, при том же концепте. Просто придётся обрабатывать конфликты записи. Писал бы сейчас - обработал бы.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505779
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee, в моей задаче вроде не предвидятся конфликты записей, т.к. база tgt не пишет в справочники. Поэтому для меня блокировка выглядит слишком уж тяжёлой ношей.

kdv, не совсем легко понять вас, но если я правильно понял, то вроде Dimitry Sibiryakov уже развенчал такой вариант.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505785
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvbudden,

после чтения трехдневных курсов я смутно понимаю этот топик, но зато я помню, что существует решение по нахождению новых вставленных и измененных записей, через доп. столбец с инкрементируемым генератором. При Insert и update этот генератор всегда инкрементируется, и пишется в этот доп. столбец.
Некая клиенская часть получает последний номер генератора и затем считывает данные с gen > N. Затем она запоминает кол-во записей и N+X, и при последующем чтении использует это значение для поиска новых записей. Как-то так.
Исключением тут является удаление записей, потому что удаленных записей нет, а значит и нечего вычитать из "столбца с генератором". Отсюда вывод - или не удалять записи (а лишь "помечать" их на удаление программно), или применять другое решение.
Вот ровно то, что ты сказал, реализовано у меня :) Только столбец с инкрементируемым генератором вынесен в общую таблицу. И там же флаг удаления.
А в прошлой редакции у меня было в каждой таблице поле IsDeleted. Надоело мне втыкать этот IsDeleted во все where, и вынес его в отдельную таблицу.
А вот держать генератор в каждой таблице - это я сразу отказался, т.к. при каждой синхронизации делать запрос к 100 таблицам только для того чтобы убедиться что синхронизировать там нечего - это было вне моей совести :)
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505811
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee, можно обернуть каждую таблицу во вьюху, где прятать этих невидимок.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505958
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, есть какая-то сермяжная правда в твоих словах, Ivan_Pisarevsky. Ненужного я нагородил. Повлияло то, что изначально решение по репликации уже было, но из другой программы и на других принципах. Пытался за них держаться, чтобы делать поменьше изменений. Но это было неправильно. Наверное, попробую пойти по твоим стопам и вести просто лог всех запросов, которые потом будут выполняться на целевой базе.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505962
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ппц, товарищи. Лог запросов (текстов операторов!) не
только с какого-то дуба назван традиционным решением, но
и выбран в качестве решения в 2013 (уже почти 2014) году.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505971
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЭто ппц, товарищи.
Ну а чего такого? Интерпретатор формул (компилятор) и репликатор баз данных это две вполне
тривиальные задачи. Каждый программист на своём веку должен написать хотя бы один.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38505979
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не против лисапеда. Я против деревянных треугольных колёс.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506006
Гаджимурадов РустамЭто ппц, товарищи. Лог запросов (текстов операторов!) не
только с какого-то дуба назван традиционным решением, но
и выбран в качестве решения в 2013 (уже почти 2014) году.
Гаджимурадов РустамЯ не против лисапеда. Я против деревянных треугольных колёс.

В отсутсвии канонического решения "от производителя" для всех видов репликации (а есть ещё частичная синхронизация разнометадатовых) высер не обоснован
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506008
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А "частичная синхронизация разнометадатовых" надо
делать методом складывания операторов DDL в лог, да.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506009
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамнадо делать методом складывания операторов DDL в лог, да.

Во-первых, не DDL, а DML. Во-вторых, а какая, собственно, разница в каком виде данные
складывать в лог? Я складываю в двоичном, Иван и Хольгерт - в виде скрипта. Каждое решение
имеет плюсы и минусы. У меня нет проблем с блобами, у них - возможность покопаться
грязными ручками если приспичит.

PS: А кто такой "производитель Firebird"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506014
Гаджимурадов Рустам,
Перечитал несколько раз. Если имелось ввиду что лог DML не спасёт отца русской чегототам - решение не самое идеальное, то я таки Вас не понял и мой опус должен последовать в топку.
Но даже в этом случае формулировка могла быть менее витиевата.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506030
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> Во-первых, не DDL, а DML

Зависит от того, что такое "разнометадатовых".
Я подумал, что это опечатка и "метаданные",
и тогда такие DDL, а не DML. Что подумал ты
и что имел в виду автор сего термина - ХЗ.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506213
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden пишет:

> Вот какой сценарий может быть проблемным:

> началась транзакция А, да призадумалась
> началась транзакция Б (read committed)
> транзакция Б запросила генератор и получила 1
> транзакция А запросила генератор и получила 2
> транзакция А вставила запись АА в таблицу data
> транзакция А вставила в таблицу скриптов репликации ('insert into data
> запись АА ',2) транзакция А завершилась
> транзакция Б вставила запись ББ в таблицу data
> -- где запись ББ ссылается на АА
> транзакция Б вставила в таблицу скриптов репликации ('insert into data
> запись ББ',1), транзакция Б завершилась

> Просыпается мафия репликатор.
> select * from таблица_скриптов order by id

> По порядку она отправляет в другую базу сначала запись ББ , потом запись
> АА. Запись ББ не вставляется, т.к. нарушение FK.

А зачем такой порядок ? Надо в порядке коммита: сначала АА, затем ББ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506459
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenНаверное, попробую пойти по твоим стопам и вести просто лог всех запросов, которые потом будут выполняться на целевой базе.Вообще-то выше я тебе предлагал к Сибирякову податься, а не идти по стопам. ;)
Гаджимурадов Рустамвыбран в качестве решения в 2013 (уже почти 2014) году.это решение было выбрано еще до меня лет 10 назад, не вижу никаких причин рыпаться с тем, что совершенно нормально работает.
Гаджимурадов РустамЯ против деревянных треугольных колёс.В этих интернетах вечно кто-то не прав! Хотя собсто выше про это тебе уже сказали , не вижу причин продолжать.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38506481
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЗависит от того, что такое "разнометадатовых".
Я подумал, что это опечатка и "метаданные",
Я прочитал это как "базы с отличающейся структурой".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38507054
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky> это решение было выбрано еще до меня лет 10 назад, не вижу
Ivan_Pisarevsky> никаких причин рыпаться с тем, что совершенно нормально работает.

Претензий к "не рыпаться" нет, не ломать работающее это
правильно, но это не делает сие решение "традиционным".

Dimitry Sibiryakov> Я прочитал это как "базы с отличающейся структурой".

Это вообще отдельный случай. И вряд ли в этом
случае логировать операторы - хорошее решение.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38507067
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, да уж поздно рыпаться - много сделал уже. Хотя на сайт Сибирякова заходил, ценник действительно демократичный. Сторонний продукт - всегда риск, что вдруг кастомизация окажется в чём-то недостаточной и начнёшь вокруг этого продукта плясать с бубном. Ну и другие причины, например, у нас есть уже свой сервер приложений, ну озадачим его ещё одним видом деятельности. Плюс к тому, я умею делать, чтобы метаданные для репликатора росли вместе со структурой базы. Плюс к тому, кастомный алгоритм назначения ид-ов. Плюс к тому, репликация должна идти не с нуля, а заменяет уже существующий алгоритм, который отчасти справляется с задачей, часть данных уже закачаны, и т.д., и т.п.

Я не буду создавать стейтменты в виде текста, буду раскладывать данные по полям, но в целом для меня самое важное то, что последовательность действий _можно_ передавать с одного сервера на другой и это работает. Это не было очевидно.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38507142
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden> Я не буду создавать стейтменты в виде текста

Аминь.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520530
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buddenIvan_Pisarevsky, да не в дырках дело. Вот какой сценарий
может быть проблемным:

началась транзакция А, да призадумалась
началась транзакция Б (read committed)
транзакция Б запросила генератор и получила 1
транзакция А запросила генератор и получила 2
транзакция А вставила запись АА в таблицу data
транзакция А вставила в таблицу скриптов репликации ('insert into data запись АА ',2)
транзакция А завершилась
транзакция Б вставила запись ББ в таблицу data
-- где запись ББ ссылается на АА
транзакция Б вставила в таблицу скриптов репликации ('insert into data запись ББ',1),
транзакция Б завершилась

Почему бы не сделать вставку в таблицу скриптов репликации в триггере на after insert, тогда описанной проблемы не возникнет в принципе.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520810
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех с прошедшими!
Fr0sT-Brutal,

началась транзакция A
А:insert into data values (AA)
А:триггер data_after_insert
gen_id(g_replication,1)->1
insert into replication_script values ('insert into data values (AA)',1)


началась транзакция Б
Б:insert into data values (ББ)
Б:триггер data_after_insert
gen_id(g_replication,1)->2
insert into replication_script values ('insert into data values (ББ)',2)
Б:commit

просыпается репликатор, видит запись 2 и отправляет её в другую БД

А:commit
просыпается репликатор, видит запись 1 и отправляет её в другую БД

Ничего, что они записи не по порядку номеров, да и вообще не пойми как?
На данный момент я уже этим вопросом не парюсь.
Репликацию написал, на тестировании посмотрим.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520823
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenНичего, что они записи не по порядку номеров, да и вообще не пойми как?

Одно из основных свойств транзакций это независимость. Две независимые транзакции могут
быть проведены в любом порядке. Результат от этого не меняется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38520880
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
budden, хочешь сказать, что можно закоммитить инсерт, ссылающийся на другой, незакоммиченный инсерт?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38531569
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, вроде бы и нельзя. Но я не понимаю, почему нельзя. Нету доказательства корректности этого алгоритма.
Во всяком случае, то, что пересекающиеся по времени транзакции могут попадать в репликатор в произвольном порядке,
вызывает определённую озабоченность. Остаётся только надеяться, что при уровне изоляции snapshot мы никогда не сошлёмся
на незакоммиченный инсерт, а благодаря блокировкам не сошлёмся на запись, которую удалила одновременная транзакция.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38531844
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такие фокусы должны зарубаться на уровне движка, иначе это фигня какая-то
Tr_A: insert A
Tr_B: insert subA => A
Tr_B: commit
Tr_A: rollback
и получаем сиротскую запись.

Так что удостоверяться, что действие произведено, надо только по коммиту. Надежность очередности действий при этом контролируется движком.
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38531862
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutalполучаем сиротскую запись.ФК придумали трусы и неудачники!
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38532759
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky, ты о чем? Речь и так идет о записях, связанных через FK
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38532770
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-BrutalРечь и так идет о записях, связанных через FKТогда о чем пространные рассуждения? Как, при наличие ФК могут появиться сироты?
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38533243
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky, не такие уж и пространные, а рассуждения - просто потому, что у вопрошающего сомнения
...
Рейтинг: 0 / 0
осудите стратегию репликации
    #38533577
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, вопрос не в том, чтобы они не появились, а чтобы база перекачивалась без затыков, ибо хочется избежать простоя.
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / осудите стратегию репликации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]