Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Dima T mayton пропущено... Дороговато будет держать по 2 копии каждой таблички. Поищите более экономную структуру данных. Копия локальная. И это не полная копия, а только (id, hash). PS Что это за справочники такие что держать их копии дороговато? (разводя руками) Хорошо. Держи ({pk group}, hash). В начале топика я предложил расширить шапку таблицы до "lastUpdateTime" чтоб трекать изменённые. Но если тебе надо хеш - ОК. Пускай это будет + еще одно поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 19:59 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Dima T пропущено... Копия локальная. И это не полная копия, а только (id, hash). PS Что это за справочники такие что держать их копии дороговато? (разводя руками) Хорошо. Держи ({pk group}, hash). В начале топика я предложил расширить шапку таблицы до "lastUpdateTime" чтоб трекать изменённые. Но если тебе надо хеш - ОК. Пускай это будет + еще одно поле. Похоже мы друг-друга не понимаем ((( Хэш это не поле, а функция от всех неключевых полей hash(f1, f2, ...), от оригинала каждый раз считаем, но в копии храним только хэш чтобы не хранить все неключевые поля. mayton В начале топика я предложил расширить шапку таблицы до "lastUpdateTime" чтоб трекать изменённые. а потом все запретил: триггеров нет, исходники закрыты, СУБД любая и т.д. и т.п. Каким образом lastUpdateTime должно меняться по твоему? Ты установил нездоровые ограничения, а теперь удивляешься нездоровым решениям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 20:27 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Хорошо. Давай твоё решение. Любое приму. Обсудим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 20:28 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Хорошо. Давай твоё решение. Любое приму. Обсудим. Я его уже дал 22075921 22076028 По мне так вполне нормально с учетом всех твоих ограничений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 20:33 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Поищите более экономную структуру данных. А золотой ключик с серебряной пулей тебе не поискать?.. Если копия реплицируемых табличек не помещается на диск и жаба душит прикупить второй, значит не очень-то и хотелось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 22:31 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Дима Сибиряков. Мне кажется у тебя - какая-то глубокая проблема. И ты ее очень хочешь обсудить. И я не понимаю почему ты ее хочешь обсуждать именно здесь. В пятничном топике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 22:34 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Dima T На отправителе можешь копию развернуть. Раз в сутки запускается скрипт и сверяет результат "select * from MyTable order by id" из оригинала и копии, сверка делается в один проход, по итогу получаешь изменения, накатываешь их на копию и раздаешь всем заинтересованным слэйвам. PS Можно даже не хранить записи целиком в локальной копии, а ограничиться каким-нибудь хэшем не очень коротким. Это по сути, реализация бухого триггера, который просыпается раз в сутки, спохватывается -- а не удалилось ли чего, и начинает шерстить БД со своей карманной копией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 22:44 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Кстати, хеши.. ну как бы они были не хороши -- решение плохое. Обычно после совпадения хеша, сравнивают значения полностью. Посмотрите на реализацию словарей. Сравнивать только хеши и уповать на низкую вероятность, это не просто повесить ружьё на стену, но и предварительно зарядить его и периодически смазывать. В общем, не гуд. Не гуд. Плохо. Не делайте так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 22:46 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Как быть с удалёнными строками? в чём проблема то я не пойму? если ID в обеих БД у них совпадают, то где тут проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 22:49 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Мне кажется у тебя - какая-то глубокая проблема. И ты ее очень хочешь обсудить. Нет. Она не глубокая, она давняя. Я занимаюсь репликацией БД во всех её ипостасях уже почти 20 лет и внезапные заявы "а налабайте-ка мне грааль на коленке" вызывают предсказуемую реакцию. Если ты не веришь, что в твоём случае сравнивающий репликатор - единственное работоспособное решение, ок, как знаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2020, 23:06 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
hVostt Кстати, хеши.. ну как бы они были не хороши -- решение плохое. Обычно после совпадения хеша, сравнивают значения полностью. Посмотрите на реализацию словарей. Сравнивать только хеши и уповать на низкую вероятность, это не просто повесить ружьё на стену, но и предварительно зарядить его и периодически смазывать. В общем, не гуд. Не гуд. Плохо. Не делайте так. И да, и нет. Да, для словарей оно надо, т.к. там, как правило, используется короткий хэш (32 бита для x86 и 64 для x64), и в таблицу может собираться миллионы хэшей, как следствие высокая вероятность что будут коллизии, т.е. одинаковые хэши у разных записей. Недавно обсуждали. Тут формула для расчета вероятности 22051280 Нет, не обязательно в моем алгоритме: во-первых у меня всегда сравнивается только два хэша - текущего состояния записи и предыдущего. Во-вторых я предлагаю взять хэш подлиннее, например MD5, 128 бит. Тут вероятность повтора 1/2 128 , т.е. практически ноль. Можно SHA-1 взять, 160 бит, может даже лучше его, т.к. проц умеет его считать одной командой . Это уже полноценный хэш используемый в криптографии, я бы не надеялся что он случайно совпадет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 09:50 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Два варианта я-бы предложил. Давайте завяжемся на SHA1 и lastUpdateTime. Я все таки имею надежду что владелец БД разрешит добавлять дополнительные колонки в таблицы. Глупо было-бы совсем пренебрегать этой возможносьтю. Отслеживание изменений Поскольку топик все еще крутится вокруг теории и алгоритмизации - я закидываю следующий воскресный requirement по практической имплементации. 1) Назовём приложение репликатором (replicator). В отличие от JMS-ного топика где нужна была инфраструктура брокеров и поставщиков и потребителей - у нас будет 1 процесс. И модель взаимодействия будет простой. Репликатор соединяется с 2 БД и выполняет действия по синхронизации сета требуемых таблиц в двух БД в одном направлении. 2) Репликатор должен запускаться как ОС-процесс с использованием cron, at e.t.c. Или вручную. Пример: Код: plaintext 1. 2.1) Репликатор предоставляет справку о спецификации своих команд. Код: plaintext 1. 2. 3) Репликатор может в делать upgrade схемы на Master или Slave как будет удобно кастомеру. Пример: Код: plaintext 1. Апгдейд будет заключаться в добавлении дополнительных колонок (alter table ... add column ...) hashcode, lastUpdateTime для отслеживания изменений. 4) Репликатор может обозревать не все таблицы а только интересующий scope. Пример. Код: plaintext 1. 2. 3. 4. 5) Репликатор имеет право использовать дополнительные дисковые ресурсы для выполнения своих задач Код: plaintext 1. 2. (по умолчанию это каталог временных файлов %TMP%, /tmp e.t.c) Нет требований по сохранности временных данных между сеансами репликации. Приложение должно сохранять работоспособность после очистки /tmp. 6) Репликатор не ограничен в ресурсах времени или процессора однако желательно чтобы процесс репликации был завершен в течение суток. 7) Репликатор должен формировать лог файл важных событий (Error, Warn) для анализа проблем. Пример. Код: plaintext 1. Код: plaintext 1. 8) Репликатор ставит своей целью минимально использовать ресурсы сети. 8.1) Репликатор может предоставлять отладночные сведения (DEBUG) для анализа причин репликации конкретных data-rows Код: plaintext 1. 8.2) Репликатор предоставляет отчет о количестве детектированных удалений и изменений в целевой БД. Код: plaintext 1. 2. 3. 4. 8.3) По завершению работы репликатор формирует коды ошибок в соотв. с соглашениями DOS/Unix на erroLevel/errorCode. Пример Код: plaintext 1. 2. 3. 4. Нулевой статус соответствует успеху. Прочие значения - несут код ошибки. 9) Репликатор может быть разработан на любом языке программирования с открытым исходным кодом. 10) Репликатор - это свободное ПО которое разрабатывается в рамках форума SQL.ru. 11) Репликатор должен поддерживать максимальное число DBMS, или предоставлять возможности легкого расширения функционала до поддержки требуемой конкретной DBMS без серъезных изменений основной версии кода. 12) Репликатор не ограничен в используемых технологиях и может включать в себя любой сет библиотек и зависимостей с выполнением пункта (9). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 19:21 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Давайте завяжемся на SHA1 и lastUpdateTime. Тогда не забудь добавить в список "на время работы репликатора база для всех остальных переводится в read-only, все активные пишущие транзакции должны быть завершены к моменту старта репликатора". Без этого будет забавный отложенный облом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 19:47 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov mayton Давайте завяжемся на SHA1 и lastUpdateTime. Тогда не забудь добавить в список "на время работы репликатора база для всех остальных переводится в read-only, все активные пишущие транзакции должны быть завершены к моменту старта репликатора". Без этого будет забавный отложенный облом. Зачем такое требование. Master БД работает в обычном режиме. Разве ты когда запускаешь отчетность - требуешь read-only? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 19:51 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Dimitry Sibiryakov пропущено... Тогда не забудь добавить в список "на время работы репликатора база для всех остальных переводится в read-only, все активные пишущие транзакции должны быть завершены к моменту старта репликатора". Без этого будет забавный отложенный облом. Зачем такое требование. Master БД работает в обычном режиме. Разве ты когда запускаешь отчетность - требуешь read-only? Он прав, есть такие грабли. Когда запускаешь отчетность получаешь read-only данных попавших в выборку до конца выборки. Чтобы БД сохранила целостность необходимо читать все в одной транзакции, иначе может оказаться что-то типа: в родительской таблице записи нет, а дочерняя на нее ссылается. Но есть СУБД с другой философией (FireBird, Postgres) там нет блокировок, ты работаешь с каким-то консистентным состоянием БД и даже если оно меняется, то это не касается твоей транзакции до тех пор пока ты только читаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 20:24 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Master-Slave достаточно примитивная система репликации, даже на ущербных СУБД. Есть у меня сервер на хостинге PHP+MySql, работает лет так ..дцать. Изначально не было у MySql ни транзакций, ни триггеров, а мне надо было иметь бэкап причем готовый стартануть за минуты. Я просто сделал у себя в коде логгирование запросов insert/update/delete, т.е. тот же журнал транзакций. Бэкап-сервер просто раз в 10 минут запрашивает что свежее появилось в логе и накатывает это у себя. Если хостинг умрет, то я потеряю только последние 10 минут. Замечательный пример был в айхор хостинге - я там был, но с бэкапами в другие места, была война собственников и они вырубили ЦОД, несколько недель следил ка он лежит, забил и забыл, а кто-то сильно пострадал т.к. даже бэкапы не могли вытащить, погуглил - сейчас опять работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 20:51 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Я понял вас. Добавлю пункт. 13) Для DBMS: Oracle, PostgresQL, MSSQL, MySQL/Maria репликатор использует режим транзакций transaction mode = { READ ONLY/SNAPSHOT, READ ONLY } для чтения данных из master в тех случаях когда необходимо реализовать повторное чтение датасета в течение одного сеанса. Ссылки: Oracle (read only) : https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10005.htm#SQLRF01705 PostgresQL (read only) : https://www.postgresql.org/docs/12/sql-set-transaction.html MSSQL (snapshot) : https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15 Прочие DBMS которые по каким-то причинам не поддерживают режимы транзакций (noSQL-системы или упрощённые DBMS) используются в гарантированном maintanance окне времени когда master БД не используется. Данный пункт - to be discussed. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 20:59 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Dima T И да, и нет. Да, для словарей оно надо, т.к. там, как правило, используется короткий хэш (32 бита для x86 и 64 для x64), и в таблицу может собираться миллионы хэшей, как следствие высокая вероятность что будут коллизии, т.е. одинаковые хэши у разных записей. Недавно обсуждали. Тут формула для расчета вероятности 22051280 Но я ловил коллизию на 128-битном криптографическом хеше для хранилища файлов. Ситуация не критическая, но неприятная. Потрачено много часов на разбирательства, в сторону хеша не смотрели, ведь "вероятность бла-бла". Но могла бы быть и критическая. У ружья на стене выстрелить тоже вероятность маленькая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 21:03 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
hVostt Но я ловил коллизию на 128-битном криптографическом хеше для хранилища файлов. Перечитай что я писал и это https://www.sql.ru/forum/1320850-1/novogodnie-paradoksy-teor-ver-i-ms-a PS Есть разница: подогнать хэш под заданный и найти два одинаковых хэша в огромном массиве ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 21:15 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Dima T Master-Slave достаточно примитивная система репликации, даже на ущербных СУБД. Есть у меня сервер на хостинге PHP+MySql, работает лет так ..дцать. Изначально не было у MySql ни транзакций, ни триггеров, а мне надо было иметь бэкап причем готовый стартануть за минуты. Я просто сделал у себя в коде логгирование запросов insert/update/delete, т.е. тот же журнал транзакций. Бэкап-сервер просто раз в 10 минут запрашивает что свежее появилось в логе и накатывает это у себя. Если хостинг умрет, то я потеряю только последние 10 минут. Замечательный пример был в айхор хостинге - я там был, но с бэкапами в другие места, была война собственников и они вырубили ЦОД, несколько недель следил ка он лежит, забил и забыл, а кто-то сильно пострадал т.к. даже бэкапы не могли вытащить, погуглил - сейчас опять работают. Лучше всех подобная схема реализована в Oracle в модели Primary/Standby. Ты просто раз в сутки копируешь ARC-logs и на стендбай делаешь Код: sql 1. И через короткое время получаешь ФИЗИЧЕСКИ точные копии датафайлов консистентные Ну как... консистентные. Разумеется на пол-транзакции БД не откроется и как только ты решил поменять местами Primary-Standby и открыть в alter database open то сработает откат всех незавершенных (которые не добежали до коммита) и ты получишь все кто успел закоммититься. Это - самое безопасное и рационально что только вообще можно сдеать в схеме репликаций. на момент последнего арк-лога. Физически - это означает побитово. А не по-DML-но как делают например в альтернативных программных продуктах где парсят парсерами WAL/REDO сегмент и пытаются по этому белому шуму понять что делалось в БД. Арк-логи в Oracle фиксировали поток LCR-s. Это достаточно тонкий уровень изменений. Скажем так... это меньше чем dbBlock. Тоесть экономно. Так было в 2000х. Сейчас схему они улучшили добавив какие-то data guards с которыми я не работал но КМК они просто автоматизировали теже действия. Позже Оракл создал Streams/Golden Gate но это уже было когда я распрощался с сектором сопровождения и пошёл в разработку. Так что в данном топике мне коробочные технологии не особо интересно обсуждать. Разве что если я сам буду их кому-то парить в техподдержку. А универсальное программное решение которое РОЖДАЕТСЯ просто как репликатор может уже черз 20-30 спринтов стать совершенно другой системой. Про JMS я в предыдущем топике написал вообще из другого интереса. Собственно плевать на JMS. Можно Акторы. Можно Apache Storm. Лишь-бы была физическая среда где есть виртуальная "труба" в сети и есть подписчики и издатели. Кстати да. Это и был основной интерес. РАЗДАТЬ уведомления на множество Slave. Но в данном топике я решил пока сделать только master-slave. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 21:19 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
hVostt Dima T И да, и нет. Да, для словарей оно надо, т.к. там, как правило, используется короткий хэш (32 бита для x86 и 64 для x64), и в таблицу может собираться миллионы хэшей, как следствие высокая вероятность что будут коллизии, т.е. одинаковые хэши у разных записей. Недавно обсуждали. Тут формула для расчета вероятности 22051280 Но я ловил коллизию на 128-битном криптографическом хеше для хранилища файлов. Ситуация не критическая, но неприятная. Потрачено много часов на разбирательства, в сторону хеша не смотрели, ведь "вероятность бла-бла". Но могла бы быть и критическая. У ружья на стене выстрелить тоже вероятность маленькая. Хвост. Я тебя прошу. Давай тему коллизий как-то вынесем из этого топика. Как инженер я вижу инженерное решение - поднять разрядность хеша до SHA512 и как-то вообще отвязаться и отбиться от обсуждения этого здесь. У нас уже был топик "дней рождений" и он хорошо коррелирует с этой высокой криптографией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 21:27 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
hVostt, если выражаться в терминах СУБД, то нельзя использовать хэш как первичный ключ, и ты это еще раз подтвердил найдя коллизию в 128 битном хэше. Но я это предвидел, мое предложение совсем в другом, перечитай мой пост 22076226 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 21:30 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
mayton Данный пункт - to be discussed. Бесполезно. Дело не в транзакции, используемой репликатором, а в конкурентах. Одна незакоммиченная параллельная транзакция - и появляется изменение, не дошедшее до слейва. Самое неприятное - оно никогда до него не дойдёт, поскольку следующие сеансы репликации уже будут его игнорировать как старое. Смирись, это врождённый недостаток репликации на временных метках и главная причина почему она практически не используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 22:09 |
|
||
|
Оффлайн-тяпничная репликация
|
|||
|---|---|---|---|
|
#18+
Dima T hVostt, если выражаться в терминах СУБД, то нельзя использовать хэш как первичный ключ, и ты это еще раз подтвердил найдя коллизию в 128 битном хэше. Но я это предвидел, мое предложение совсем в другом, перечитай мой пост 22076226 Да я с этим не спорю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2020, 22:41 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39924440&tid=1339829]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 274ms |
| total: | 541ms |

| 0 / 0 |
