|
17.01.2008, 16:12 | #1 |
Ищу людей. Дорого.
|
Реализация репликации данных
Снова поднимаю давно избитую тему. Много было сказано о том надо или не надо ее использовать, а о том как ее использовать, какими методами ее реализовывать не особо. Тема конечно затрагивалась но не раскрывалась.. но это все вода.. теперь ближе к делу.
Была поставлена задача реплицировать набор справочников из головного офиса в дочерние. Есть обязательное условие: все справочники заводятся в Центральном офисе. На текущий момент я вижу следующие проблемы при реализации репликации 1. RecID. Генерация «своих» RecID на подписчиках. 2. Невозможность синхронизации таблиц на публикаторе при использовании стандартной репликации MSSQL 3. При стандартной репликации MSSQL проблемы с восстановлением базы из архивной копии 4. Номерные серии на подписчике 5. Добавление новых полей в таблицы сводится к пересозданию всей репликации 6. Код фирмы ‘dat’. 7. При репликации MSSQL контроль первичных ключей (По умолчанию DataAreaID и RecId). Если RecID будет меняться на подписчике, то может быть дублирование записей 8. При использовании репликации MSSQL на таблицах создаются триггеры. Теперь краткие пояснения 1. можно конечно извратиться и написать процедуру, но сколько будет подводных камней никто не знает 2. пока таблицы будут учавствовать в репликации изменить их скуль не даст, так же как и не даст поднять базу из бакапа (не дай бог). Если же каким то хитрожопым способом удастся таблицу синхронизировать, то слетят тригеры на таблице, которые навешивает репликация. Короче, если не ветрянка, то понос. 3. см. выше 4. тут проще и можно закрыть глаза, так как справочники заводятся на публикаторе. 5. точнее так. Желание добавить поле, требует пересоздания репликации (см. 2) 6. Везде по одной компании, коды будут одинаковы. пропускаем 7. Если первичный ключ включает поле RecId, а репликация использует этот ключ, то при изменении RecId на подписчике на RecId базы подписчика может дать и точно даст сбой. при инсерте - дублирование, при апдейте и удалении, ошибка о том, что невозможно найти запись 8. см пункт 2. Вот что мы имеем в итоге. Я хочу предложить на растерзание следующую схему 1. Данные из Аксапты попадают в специальную базу 2 Эта база реплицируется на подписчик, 3. там эти данные переносятся в аксапту Теперь о том как это должно происходить. 1. Можно повесить тригеры, которые будут обрабатывать изменения, но при первой же синхронизации, тригеры слетят и все пойдет прахом. А программисты очень любят про это забывать.. ладно если потом скажут. Поэтому нужно другое решение. Например джоб с хранимкой, которая ослеживает по ModifyTime и перекладывает записи. Но тут могут быть проблемы с удалением. Их нельзя будет отследить. Возможен вариант, что бы аксапта сама отслеживала изменения, внутренним функционалом, а потом делала SQL инструкцию по вставке данных в другую базу в таблицу (Кстати так и работет репликация Коруса для Кристалла). Если подписчиков будет несколько то скорее всего для каждого подписчика нужно будет создавать свою запись (планируется хранить и передавать измененные данные а не полную копию таблицы) а то потом не поймешь кто забрал а кто нет и когда запись нужно удалять. В итоге мы положили изменившиеся данные из аксапты в отдельную базу 2. База переносится на подписчики, здесь можно использовать как и репликацию транзакциями , так и передачу данных с помощью DTS . как лучше пока не знаю, может вы скажите?? В итоге мы имеем данные на сервере подписчика. 3. Как закатывать данные в аксапту? можно хранимкой, но тут возникает проблема сгенерацией RecID. Можно написать пакет в аксапте, который будет с определенной периодикой закатывать запросы к соседней базе в SQL инструкции, обрабатывать полученные данные и вставлять их внутренними средствами. Данные "успешно" отреплицировались. Немного запутанно, но все же наверное понятно.. У кого есть какие замечания и советы по поводу этой схемы, может кто то использует другую схему, поделитесь знаниями. Что я не учел, какие проблемы еще могут возникнуть и..... ... Давайте не будем обсуждать что распределенка это плохо, давайте обсуждать КАК ее сделать.. |
|
17.01.2008, 16:17 | #2 |
Moderator
|
Извини, постараюсь попозже найти время и более подробно ответить на вопросы.
Если в общем, то лучше с репликацией вообще не связываться. Сделать можно (в том или ином объеме). Мы делали с помощью журнала базы данных. Нужные таблицы журналируются, таблица 'журнал бд' экспортируется и передается по ftp, email или какому-либо другому каналу связи, а потом изменения 'проигрываются' на подписчике. Скорее всего репликацию можно сделать и средствами SQL, но риски реализации в этом случае я представляю меньше. |
|
17.01.2008, 16:51 | #3 |
Участник
|
Цитата:
Цитата:
Цитата:
Сообщение от sergeypp
Как закатывать данные в аксапту? можно хранимкой, но тут возникает проблема сгенерацией RecID. Можно написать пакет в аксапте, который будет с определенной периодикой закатывать запросы к соседней базе в SQL инструкции, обрабатывать полученные данные и вставлять их внутренними средствами.
|
|
17.01.2008, 17:15 | #4 |
Ищу людей. Дорого.
|
Цитата:
К слову, с RecId может быть связано множество нехороших побочных эффектов, например, это может проявиться в таблице адресов, текстов склада и прочих, использующих связи по RecId.
|
|
18.01.2008, 09:29 | #5 |
Участник
|
На мой взгляд репликация имеет право на существование при существенных ограничениях. У нас реализована репликация транзакций ВСЕЙ виртуальной компании - полет нормальный. Теперь детально:
1. Нет проблем, были в начале, когда в Аксапте подписчике были права на изменения и добавления в виртуальных таблицах. 2. Да, надо переинициализировать репликацию после синхронизации. 3. Не вижу проблем 4. Нет проблем при односторонней репликации 5. Да, надо переинициализировать репликацию после синхронизации. 6. ??? 7. При однонаправленной репликации, нет проблем. 8. При использовании репликации транзакций MSSQL на таблицах не создаются триггеры. |
|
18.01.2008, 09:56 | #6 |
Модератор
|
3йка или 4ка? В 4ке не будет проблем с RecId.
Можно просто перегонять данные в промежуточную таблицу и закачивать в основную (или через журналы). Тогда не будет проблем ни с RecId, ни с номерными сериями. Вопрос, насколько точная нужна репликация. Надеюсь, не с точностью до номерной серии и RecId. С Уважением, Георгий |
|
18.01.2008, 11:25 | #7 |
Ищу людей. Дорого.
|
3-ка sp3
Цитата:
Цитата:
Сообщение от Alexius
1. Нет проблем, были в начале, когда в Аксапте подписчике были права на изменения и добавления в виртуальных таблицах.
2. Да, надо переинициализировать репликацию после синхронизации. 3. Не вижу проблем 4. Нет проблем при односторонней репликации 5. Да, надо переинициализировать репликацию после синхронизации. 6. ??? 7. При однонаправленной репликации, нет проблем. 8. При использовании репликации транзакций MSSQL на таблицах не создаются триггеры. 3. Пока база в репликации, восстановить себя она не даст, нужно будет отвязывать всех подписчиков 7. Сомнительно.. возможны частные случаи 8. Еще как создаются. создаются тригеры на добавление, удаление и изменение , которые пишут данные в журнал Просто возможно существуют другие варианты , например без использования скулевой репликации как таковой вообще. Данные можно кидать и DTS? правда я не знаю насколько DTS требователен к каналу??. Интересный вариант и с журналом.. сейчас покопаю туда. Просто еще вопрос стоит под следующим углом.. Если механизм передачи данных инкапсулировать от пользователей, то последние начинают придумывать ввсякие небылицы о том что данные не пришли или пришли криво, оправдывая тем самым свои ошибки. А если что то действительно начнет работать наперекосяк, можно смело тащить раскладушку на работу. Даже в перепроверенной системе могут вылезти непредвиденные ошибки. Может дейсвительно есть резон отказаться от схем "теневой" передачи, а выкладывать данные на фтп как вариант и административно принудить пользователей самим обновлять систему. Тогда странных предположений от подльзователей будет намного меньше. Залили файл - данные обновились, Не залили - не обновились, но опять таки разовая заливка может оказаться ресурсоемкой, тогда будут возникать другие жалобы, что они не успевают и не могут работать.. Ньюансов много.. как сделать лучше, пока непонятно |
|
18.01.2008, 14:59 | #8 |
Участник
|
Слегка оговорился, имеются в виду таблицы включенные в виртуальную компанию. Это справочники.
Цитата:
|
|
18.01.2008, 11:29 | #9 |
Ищу людей. Дорого.
|
Есть методы оценки конечно, но какие критерии выбирать за основу, мне тоже пока не ясно ))
Если у кого то есть реализации репликации, не стесьняйтесь - рассказывайте.. буду благодарен. 2 Alexius. а у Вас 2 базы просто соединены обычной скулевой репликацией транзакциями?? насколько разнесены базы.. база подписчик оперативная или для отчетов, как посупили с RecID ?? Последний раз редактировалось sergeypp; 18.01.2008 в 11:31. |
|
18.01.2008, 15:08 | #10 |
Участник
|
Цитата:
|
|
21.01.2008, 09:17 | #11 |
Ищу людей. Дорого.
|
Цитата:
у меня 2000 скуль.. значит на 2005 другой механизм репликации А если тупо выкачивать данные с помощью DTS ориентируясь на поля ModifyDate и ModifyTime. А на подписчике заливать их прямо в таблицы. Насколько DTS требователен к каналу?? Кто нибудь сталкивался? |
|
21.01.2008, 10:26 | #12 |
Мрачный тип
|
sergeypp, а Вы не подумали , что произойдет с Вашими данными после (не дай бог, конечно) дефрагментации RecId в базе-источнике ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
21.01.2008, 10:52 | #13 |
Ищу людей. Дорого.
|
Цитата:
при вставке можно подменять RecID. А еще хотел расспросить про виртуальную компанию.. Т.е. создается виртуальная компания, в нее переносят ся все таблицы справочники. Для них выделяется свой диапазон RecID На базе подписчике тоже нужно создавать вирт компанию?? или можно без нее.. после этого мы реплицируем справочники из вирт компании и след не имеем проблем с генерацией и пересечением RecID/ я правильно понял? |
|
21.01.2008, 10:36 | #14 |
Участник
|
|
|
18.01.2008, 15:41 | #15 |
Member
|
Я бы попробовал в данном случае проработать такой вариант. Некоторые таблицы из ЦО средствами MS SQL реплицируются в отдельную БД в филиале. Пакетное задание... предположим, по дате обновления записи... анализирует таблицу в отдельной БД в филиале, и пытается синхронизировать справочник в БД Аксапты в филиале.
Удалять, надеюсь, не нужно? И с переименованием будет непросто. Возможно, придется допиливать и приложение ЦО.
__________________
С уважением, glibs® |
|
18.01.2008, 16:35 | #16 |
Злыдни
|
Уважаемы гуру программирования. А нельзя ли в качестве урезанного варианта репликации взять за основу механизм выгрузки данных в двоичном формате на источнике и последующей их загрузки на подписчике? Надо будет только модифицировать выгрузку так, чтобы она брала только модифицированные записи, а загрузку так, чтобы записи апдейтились при их наличии. При этом проблем ни с RecID, ни с компанией не должно возникать.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
18.01.2008, 17:40 | #17 |
Member
|
Цитата:
Сообщение от KiselevSA
...
Надо будет только модифицировать выгрузку так, чтобы она брала только модифицированные записи ... Тут вопрос формата данных? По-моему, автор хотел бы избавиться от головной боли с транспортом. Последняя задача является непростой. Желание свалить ее на репликацию MS SQL понимаю. Что касается отслеживания — есть нюансы. Например. Допустим, что номенклатуру удалять мы не будем. Но пересчет единиц измерения или какой-нибудь штрих-код, по идее, можем. Тупым импортом не отделаться. Именно такие вещи я имел в виду, когда писал "пытается синхронизировать справочник в БД Аксапты в филиале".
__________________
С уважением, glibs® |
|
18.01.2008, 18:14 | #18 |
MCTS
|
По-моему лучше сделать выгрузку и загрузку справочников через xml файлы
|
|
21.01.2008, 12:22 | #19 |
Ищу людей. Дорого.
|
А на подписчике и публикаторе при создании вирт компании RecID в одинаковых диапазонах выделяются и в каких?
|
|
21.01.2008, 14:24 | #20 |
Участник
|
|
|