|
|
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Добрый день! Разрабатываю рукописную репликацию справочников. Репликация односторонняя, т.е. база tgt должна следовать за базой src. В базе tgt запись в справочники не происходит иначе, как чем через репликацию. Стратегия принята примерно такая: все пишущие транзакции в системе - snapshot. имеется таблица Код: sql 1. 2. 3. 4. 5. имеется набор триггеров, заносящих в неё запись при 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), хотя для начала хочу полениться и сделать просто переменную контекста, которую устанавливаем и тем самым отключаем триггер. Думал чуть ни неделю над этим алгоритмом. Вроде всё нормально, но покоя в душе нет. Прошу осудить и кинуть тапком, сказав, какие грабли меня при этом ждут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 18:57:41 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
У нас все по другому и у DS не так. изобретаешь велосипед? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 21:41:54 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Ivan_Pisarevsky, изобретаю потихоньку... А как у вас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 21:54:43 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskyУ нас все по другому и у DS не так. изобретаешь велосипед? Оно доступно в исходниках? Или идейно описано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 22:01:20 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
По сабжу - "алгоритм" о[б]суждать не буду (я даже не всё осилил из сказанного), его и без меня тут раскритикуют в пух и прах, замечу только, что если в SRC ничего не меняется за "первый проход", то может и не нужно снапшот в ней стартовать-то? Дело ведь небыстрое, чего зазря БД и сервер напрягать. RC read достаточно. P.S. И почему tgt, а не dst (или хотя бы trgt)? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 23:56:32 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам, привычка укладываться в 8.3 :) Может, dst было бы и правильнее, но уже поздно для данного о(б)суждения. src может меняться в любой момент времени, отсюда и снапшот. Я вообще хочу все перевести на снапшоты, ввиду моей неспособности/лени проанализировать, как всё будет работать с read committed - слишком много возможных аномалий нужно предполагать на каждую строчку кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 00:22:08 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
budden> src может меняться в любой момент времени, отсюда и снапшот. Для этого снапшот не нужен, достаточно ID-шников. Впрочем, это смотря как реализовано, в вашем случае, может быть, и нельзя. > Я вообще хочу все перевести на снапшоты Ну Бог в помощь, что тут скажешь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 02:01:16 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
NickDeeОно доступно в исходниках?Насколько я знаю нет. Внутренний проект. NickDeeИли идейно описано?поглядел публикации... описано отрывочно и не все. buddenА как у вас?традиционно. z-триггреы готовят стэйтменты, потом через сервисы на сокетах обмениваются с заданной периодичностью подпакованными скриптами. Ключи с разбивкой по диапазоном, гуевая админка и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 12:27:40 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Ivan_Pisarevsky, я вне традиции, видимо :) Если она где-то описана, положи в тапок ссылку и кинь в меня им. Что такое z-триггеры? Яндекс промолчал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 13:36:05 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
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. Купить готовый репликатор не? IBReplicator вполне демократичен по расценкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 14:11:34 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Ivan_Pisarevsky, да денег не жалко, в общем-то. Но есть ряд причин. Основная - когда я в это ввязался, недооценил сложность задачи. Второстепенная - своё легче кастомизовать, если гибкости не хватило. И ещё есть причины, но не хочу лишние буквы плодить. А как у тебя упорядочиваются скрипты? Пусть у нас есть таблица со ссылкой на себя. За счёт чего запись А придёт в tgt раньше, чем ссылающаяся на неё запись Б? Учитывается время вставки? А если придут с меньшим интервалом, чем разрешение часов? Генератор? Каков уровень изоляции транзакций? Бывают ли сбои из-за внешних ключей, особенно на delete? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 15:12:57 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
buddenА как у тебя упорядочиваются скрипты?не понял вопрос. стэйтменты на базе приемнике выполняются ровно в том же порядке, что и в базе источнике. По диапазонам ключей, ключи 64 битные, обычные чиселки, таймштампы вообще не при делах. buddenразрешение часов?Пап, это ты с кем сейчас разговаривал? (с) buddenБывают ли сбоисистема отработанная, вполне себе устойчивая. встает практически только по "человеческому фактору" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 15:19:53 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
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. Я вот тоже как-то делал двустороннюю репликацию для своей системы, но не на генерации 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. Первые две таблицы лежат как на центральном сервере, так и на второстепенном. Третья нужна только на второстепенных серверах. Процедура синхронизации инициируется второстепенным сервером. Для начала он в снапшот-транзакции собирает все записи where REPL_DATA.RECORDVERSION > REPL_VARIABLES.LASTSENDEDRECVERSION, потаблично (это все данные, изменённые с момента последней удачной синхронизации). Отсылает их на центральный сервер, вместе с REPL_VARIABLES.LASTRECEIVEDRECVERSION. Центральный сервер их применяет, в соответствии с правилами, и в соответствии с правилами (на основе уже данных в его REPL_DATA, и учитывая присланный с второстепенного сервера REPL_VARIABLES.LASTRECEIVEDRECVERSION) формирует пакет данных для отсылки на второстепенный сервер (в пакете есть и значение gen_id(rec_version_id, 0)). Второстепенный сервер получает пакет, применяет, апдейтит у себя LASTSENDEDRECVERSION и LASTRECEIVEDRECVERSION. Вот :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:37:04 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskybuddenЧто такое z-триггеры?по триггеру на афтер всех событий, формирует портянку, которую потом можно применить на целевой БД Как я понял формируется таблица из insert-sql. А как решается вопрос с блобами и большими varchar? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:44:22 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
NickDeeДля начала он в снапшот-транзакции собирает все записи where REPL_DATA.RECORDVERSION > REPL_VARIABLES.LASTSENDEDRECVERSION, потаблично (это все данные, изменённые с момента последней удачной синхронизации). Работоспособно исключительно в монопольном режиме. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:45:54 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
NickDeeПервые две таблицы лежат как на центральном сервере, так и на второстепенном. Третья нужна только на второстепенных серверах. Процедура синхронизации инициируется второстепенным сервером. У меня организованно похожим образом, только REPL_VARIABLES есть и на главном сервере (с кодами второстепенных баз). Можно отсылать данные с главного сервера, например по почте. Отправляем все неподтвержденные данные, а база-приемник принимает только то, что еще не принимала. После приема данных, чистится таблица REPL_DATA, где RECORDVERSION < select min(LASTRECEIVEDRECVERSION) from REPL_VARIABLES ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 16:54:43 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovNickDeeДля начала он в снапшот-транзакции собирает все записи where REPL_DATA.RECORDVERSION > REPL_VARIABLES.LASTSENDEDRECVERSION, потаблично (это все данные, изменённые с момента последней удачной синхронизации). Работоспособно исключительно в монопольном режиме. Почему? Пользователи второстепенного сервера работают дальше, вставляют и редактируют записи (при этом меняется RECORDVERSION в REPL_DATA, или туда добавляются записи). Эти изменения учтутся при следующей синхронизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:02:26 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
NickDeeПочему? Снапшот не в состоянии увидеть записи, котрые были изменены раньше его старта, но закоммичены позже. Для них REPL_DATA.RECORDVERSION навсегда меньше REPL_VARIABLES.LASTSENDEDRECVERSION и изменения не попадают в репликационный пакет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:16:35 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovNickDeeПочему? Снапшот не в состоянии увидеть записи, котрые были изменены раньше его старта, но закоммичены позже. Для них REPL_DATA.RECORDVERSION навсегда меньше REPL_VARIABLES.LASTSENDEDRECVERSION и изменения не попадают в репликационный пакет. Ага. Понятно о чём ты :) У меня сервер приложений. И я начинаю процесс действительно эксклюзивно. Потом лок отпускаю. Но применение полученных данных тоже происходит эксклюзивно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:33:19 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:49:15 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Шавлюк ЕвгенийА как решается вопрос с блобамиположил в файл, взял из файла. Шавлюк Евгенийбольшими varchar?их нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:53:34 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Шавлюк Евгений, ага до первого б/р ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:58:38 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Ivan_Pisarevsky, вот тут и есть самое непонятное. Раз порядок стейтментов как-то определён и это не таймстамп, то значит генератор. Если генератор, то порядок следования апдейтов в репликации слабо связан с порядком старта и коммита транзакции, которая его создала. Если транзакция А стартовала до старта транзакции Б и финишировала до финиша транзакции Б, значит ли это, что она более ранняя? Если используется генератор, то запрос от транзакции Б может раньше пойти на репликацию, чем запрос от транзакции А. И получится, что транзакция Б - "раньше", чем А. Оттого я и спросил про таймстампы. Вроде из этого ничего страшного не следует, потому что есть ещё блокировка записей. Т.е., если здесь будет какие-то конфликтующие друг с другом изменения, одна из транзакций просто не будет закоммичена. Но я не могу сказать, что полностью уверен в надёжности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 17:59:44 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисШавлюк Евгений, ага до первого б/р есть процедура before_replication, где Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 18:18:50 |
|
||
|
осудите стратегию репликации
|
|||
|---|---|---|---|
|
#18+
buddenгенераторда. buddenпорядок следования апдейтов в репликации слабо связан с порядком старта и коммита транзакциипрошел коммит, попала строчка в репликацию; откатилась, возникла дырка в нумерации. Не вижу проблемы, ну подумаешь дырка, при 18 десятичных знаках на номер как-то дырки не беспокоят совсем. Если транзакции завершились в разное время, значит в базе приемнике они отработают тоже в разное время, что-то особой проблемы эмирически не видится, да и практика показывает, что ничего страшного не случается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2013, 18:21:24 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38505485&tid=1563959]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
458ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 756ms |

| 0 / 0 |
