powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Оффлайн-тяпничная репликация
25 сообщений из 151, страница 3 из 7
Оффлайн-тяпничная репликация
    #39924270
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
пропущено...

Дороговато будет держать по 2 копии каждой таблички.

Поищите более экономную структуру данных.

Копия локальная. И это не полная копия, а только (id, hash).

PS Что это за справочники такие что держать их копии дороговато?

(разводя руками)

Хорошо. Держи ({pk group}, hash).

В начале топика я предложил расширить шапку таблицы до "lastUpdateTime" чтоб трекать изменённые.
Но если тебе надо хеш - ОК. Пускай это будет + еще одно поле.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924276
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Dima T
пропущено...

Копия локальная. И это не полная копия, а только (id, hash).

PS Что это за справочники такие что держать их копии дороговато?

(разводя руками)

Хорошо. Держи ({pk group}, hash).

В начале топика я предложил расширить шапку таблицы до "lastUpdateTime" чтоб трекать изменённые.
Но если тебе надо хеш - ОК. Пускай это будет + еще одно поле.

Похоже мы друг-друга не понимаем (((

Хэш это не поле, а функция от всех неключевых полей hash(f1, f2, ...), от оригинала каждый раз считаем, но в копии храним только хэш чтобы не хранить все неключевые поля.
mayton
В начале топика я предложил расширить шапку таблицы до "lastUpdateTime" чтоб трекать изменённые.

а потом все запретил: триггеров нет, исходники закрыты, СУБД любая и т.д. и т.п. Каким образом lastUpdateTime должно меняться по твоему?

Ты установил нездоровые ограничения, а теперь удивляешься нездоровым решениям.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924277
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Давай твоё решение. Любое приму. Обсудим.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924278
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Хорошо. Давай твоё решение. Любое приму. Обсудим.

Я его уже дал 22075921 22076028 По мне так вполне нормально с учетом всех твоих ограничений.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924301
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Поищите более экономную структуру данных.

А золотой ключик с серебряной пулей тебе не поискать?..

Если копия реплицируемых табличек не помещается на диск и жаба душит прикупить второй, значит не очень-то и хотелось.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924302
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима Сибиряков. Мне кажется у тебя - какая-то глубокая проблема. И ты ее очень хочешь обсудить.

И я не понимаю почему ты ее хочешь обсуждать именно здесь. В пятничном топике.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924303
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
На отправителе можешь копию развернуть. Раз в сутки запускается скрипт и сверяет результат "select * from MyTable order by id" из оригинала и копии, сверка делается в один проход, по итогу получаешь изменения, накатываешь их на копию и раздаешь всем заинтересованным слэйвам.

PS Можно даже не хранить записи целиком в локальной копии, а ограничиться каким-нибудь хэшем не очень коротким.


Это по сути, реализация бухого триггера, который просыпается раз в сутки, спохватывается -- а не удалилось ли чего, и начинает шерстить БД со своей карманной копией
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924304
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, хеши.. ну как бы они были не хороши -- решение плохое.
Обычно после совпадения хеша, сравнивают значения полностью.
Посмотрите на реализацию словарей.

Сравнивать только хеши и уповать на низкую вероятность, это не просто повесить ружьё на стену, но и предварительно зарядить его и периодически смазывать.

В общем, не гуд. Не гуд. Плохо. Не делайте так.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924306
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Как быть с удалёнными строками?

в чём проблема то я не пойму? если ID в обеих БД у них совпадают, то где тут проблема?
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924308
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Мне кажется у тебя - какая-то глубокая проблема. И ты ее очень хочешь обсудить.

Нет. Она не глубокая, она давняя. Я занимаюсь репликацией БД во всех её ипостасях уже почти 20 лет и внезапные заявы "а налабайте-ка мне грааль на коленке" вызывают предсказуемую реакцию.

Если ты не веришь, что в твоём случае сравнивающий репликатор - единственное работоспособное решение, ок, как знаешь.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924329
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Кстати, хеши.. ну как бы они были не хороши -- решение плохое.
Обычно после совпадения хеша, сравнивают значения полностью.
Посмотрите на реализацию словарей.

Сравнивать только хеши и уповать на низкую вероятность, это не просто повесить ружьё на стену, но и предварительно зарядить его и периодически смазывать.

В общем, не гуд. Не гуд. Плохо. Не делайте так.

И да, и нет.

Да, для словарей оно надо, т.к. там, как правило, используется короткий хэш (32 бита для x86 и 64 для x64), и в таблицу может собираться миллионы хэшей, как следствие высокая вероятность что будут коллизии, т.е. одинаковые хэши у разных записей. Недавно обсуждали. Тут формула для расчета вероятности 22051280

Нет, не обязательно в моем алгоритме: во-первых у меня всегда сравнивается только два хэша - текущего состояния записи и предыдущего. Во-вторых я предлагаю взять хэш подлиннее, например MD5, 128 бит. Тут вероятность повтора 1/2 128 , т.е. практически ноль. Можно SHA-1 взять, 160 бит, может даже лучше его, т.к. проц умеет его считать одной командой . Это уже полноценный хэш используемый в криптографии, я бы не надеялся что он случайно совпадет.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924412
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два варианта я-бы предложил. Давайте завяжемся на SHA1 и lastUpdateTime. Я все таки имею надежду
что владелец БД разрешит добавлять дополнительные колонки в таблицы. Глупо было-бы совсем пренебрегать
этой возможносьтю.

Отслеживание изменений

Поскольку топик все еще крутится вокруг теории и алгоритмизации - я закидываю следующий
воскресный requirement по практической имплементации.

1) Назовём приложение репликатором (replicator).

В отличие от JMS-ного топика где нужна была инфраструктура брокеров и поставщиков и потребителей - у нас
будет 1 процесс. И модель взаимодействия будет простой. Репликатор соединяется с 2 БД и выполняет действия
по синхронизации сета требуемых таблиц в двух БД в одном направлении.


2) Репликатор должен запускаться как ОС-процесс с использованием cron, at e.t.c. Или вручную.

Пример:

Код: plaintext
1.
 $ replicator  {arguments} 



2.1) Репликатор предоставляет справку о спецификации своих команд.
Код: plaintext
1.
2.
 $ replicator --help
 ...




3) Репликатор может в делать upgrade схемы на Master или Slave как будет удобно кастомеру.

Пример:
Код: plaintext
1.
 $ replicator --command upgrade --dbMasterUrl "localhost:5432/postgres?user=username&pwd=pwd1234"



Апгдейд будет заключаться в добавлении дополнительных колонок (alter table ... add column ...) hashcode, lastUpdateTime
для отслеживания изменений.

4) Репликатор может обозревать не все таблицы а только интересующий scope. Пример.
Код: plaintext
1.
2.
3.
4.
 $ replicator --command replicate \
      --dbMasterUrl "localhost:5432/postgres?user=username&pwd=pwd1234"
     --dbSlaveUrl "remoteHost:5432/postgres?user=username&pwd=pwd1234"
    --tables "Currencies,Countries,Organizations,ISIN,CUSIP,SEDOL....."



5) Репликатор имеет право использовать дополнительные дисковые ресурсы для выполнения своих задач
Код: plaintext
1.
2.
 
$ replicator {arguments} --tmpDir=/home/mayton/mnt/fuckenGarbageFolderWithHugeSpace


(по умолчанию это каталог временных файлов %TMP%, /tmp e.t.c)

Нет требований по сохранности временных данных между сеансами репликации.
Приложение должно сохранять работоспособность после очистки /tmp.

6) Репликатор не ограничен в ресурсах времени или процессора однако желательно чтобы процесс
репликации был завершен в течение суток.

7) Репликатор должен формировать лог файл важных событий (Error, Warn) для анализа проблем.

Пример.
Код: plaintext
1.
$ replicator {arguments} --logFile=/home/mayton/replicator/log



Код: plaintext
1.
2020-02-01 16:00:45.0012 [ERROR] Socket connection error. Unable to create socket remoteHost:5432 .....



8) Репликатор ставит своей целью минимально использовать ресурсы сети.

8.1) Репликатор может предоставлять отладночные сведения (DEBUG) для анализа причин репликации конкретных
data-rows
Код: plaintext
1.
2020-02-01 16:00:45.0012 [DEBUG] Detected newLine in "Currency" table with primary keySet = { USD } ...



8.2) Репликатор предоставляет отчет о количестве детектированных удалений и изменений в целевой БД.

Код: plaintext
1.
2.
3.
4.
2020-02-01 16:00:45.0012 [INFO] Statistics: 
2020-02-01 16:00:45.0012   Insertions : 293545
2020-02-01 16:00:45.0012   Deletes: 0
2020-02-01 16:00:45.0012   Updates: 0



8.3) По завершению работы репликатор формирует коды ошибок в соотв. с соглашениями DOS/Unix на erroLevel/errorCode.

Пример
Код: plaintext
1.
2.
3.
4.
 
$ replicator {arguments} 
$ echo $?
0


Нулевой статус соответствует успеху. Прочие значения - несут код ошибки.

9) Репликатор может быть разработан на любом языке программирования с открытым исходным кодом.

10) Репликатор - это свободное ПО которое разрабатывается в рамках форума SQL.ru.

11) Репликатор должен поддерживать максимальное число DBMS, или предоставлять возможности
легкого расширения функционала до поддержки требуемой конкретной DBMS без серъезных
изменений основной версии кода.

12) Репликатор не ограничен в используемых технологиях и может включать в себя любой сет
библиотек и зависимостей с выполнением пункта (9).
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924414
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давайте завяжемся на SHA1 и lastUpdateTime.

Тогда не забудь добавить в список "на время работы репликатора база для всех остальных переводится в read-only, все активные пишущие транзакции должны быть завершены к моменту старта репликатора". Без этого будет забавный отложенный облом.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
mayton
Давайте завяжемся на SHA1 и lastUpdateTime.

Тогда не забудь добавить в список "на время работы репликатора база для всех остальных переводится в read-only, все активные пишущие транзакции должны быть завершены к моменту старта репликатора". Без этого будет забавный отложенный облом.

Зачем такое требование. Master БД работает в обычном режиме.

Разве ты когда запускаешь отчетность - требуешь read-only?
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924418
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Dimitry Sibiryakov
пропущено...

Тогда не забудь добавить в список "на время работы репликатора база для всех остальных переводится в read-only, все активные пишущие транзакции должны быть завершены к моменту старта репликатора". Без этого будет забавный отложенный облом.

Зачем такое требование. Master БД работает в обычном режиме.

Разве ты когда запускаешь отчетность - требуешь read-only?

Он прав, есть такие грабли. Когда запускаешь отчетность получаешь read-only данных попавших в выборку до конца выборки.

Чтобы БД сохранила целостность необходимо читать все в одной транзакции, иначе может оказаться что-то типа: в родительской таблице записи нет, а дочерняя на нее ссылается.

Но есть СУБД с другой философией (FireBird, Postgres) там нет блокировок, ты работаешь с каким-то консистентным состоянием БД и даже если оно меняется, то это не касается твоей транзакции до тех пор пока ты только читаешь.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924425
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master-Slave достаточно примитивная система репликации, даже на ущербных СУБД. Есть у меня сервер на хостинге PHP+MySql, работает лет так ..дцать. Изначально не было у MySql ни транзакций, ни триггеров, а мне надо было иметь бэкап причем готовый стартануть за минуты. Я просто сделал у себя в коде логгирование запросов insert/update/delete, т.е. тот же журнал транзакций. Бэкап-сервер просто раз в 10 минут запрашивает что свежее появилось в логе и накатывает это у себя. Если хостинг умрет, то я потеряю только последние 10 минут.

Замечательный пример был в айхор хостинге - я там был, но с бэкапами в другие места, была война собственников и они вырубили ЦОД, несколько недель следил ка он лежит, забил и забыл, а кто-то сильно пострадал т.к. даже бэкапы не могли вытащить, погуглил - сейчас опять работают.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924426
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял вас. Добавлю пункт.

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.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924428
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
И да, и нет.

Да, для словарей оно надо, т.к. там, как правило, используется короткий хэш (32 бита для x86 и 64 для x64), и в таблицу может собираться миллионы хэшей, как следствие высокая вероятность что будут коллизии, т.е. одинаковые хэши у разных записей. Недавно обсуждали. Тут формула для расчета вероятности 22051280


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

У ружья на стене выстрелить тоже вероятность маленькая.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924429
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Но я ловил коллизию на 128-битном криптографическом хеше для хранилища файлов.

Перечитай что я писал и это https://www.sql.ru/forum/1320850-1/novogodnie-paradoksy-teor-ver-i-ms-a

PS Есть разница: подогнать хэш под заданный и найти два одинаковых хэша в огромном массиве
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924433
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Master-Slave достаточно примитивная система репликации, даже на ущербных СУБД. Есть у меня сервер на хостинге PHP+MySql, работает лет так ..дцать. Изначально не было у MySql ни транзакций, ни триггеров, а мне надо было иметь бэкап причем готовый стартануть за минуты. Я просто сделал у себя в коде логгирование запросов insert/update/delete, т.е. тот же журнал транзакций. Бэкап-сервер просто раз в 10 минут запрашивает что свежее появилось в логе и накатывает это у себя. Если хостинг умрет, то я потеряю только последние 10 минут.

Замечательный пример был в айхор хостинге - я там был, но с бэкапами в другие места, была война собственников и они вырубили ЦОД, несколько недель следил ка он лежит, забил и забыл, а кто-то сильно пострадал т.к. даже бэкапы не могли вытащить, погуглил - сейчас опять работают.

Лучше всех подобная схема реализована в Oracle в модели Primary/Standby.
Ты просто раз в сутки копируешь ARC-logs и на стендбай делаешь

Код: sql
1.
SQL> recover standby database...



И через короткое время получаешь ФИЗИЧЕСКИ точные копии датафайлов
консистентные

Ну как... консистентные. Разумеется на пол-транзакции БД не откроется
и как только ты решил поменять местами 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.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924435
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Dima T
И да, и нет.

Да, для словарей оно надо, т.к. там, как правило, используется короткий хэш (32 бита для x86 и 64 для x64), и в таблицу может собираться миллионы хэшей, как следствие высокая вероятность что будут коллизии, т.е. одинаковые хэши у разных записей. Недавно обсуждали. Тут формула для расчета вероятности 22051280


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

У ружья на стене выстрелить тоже вероятность маленькая.

Хвост. Я тебя прошу.

Давай тему коллизий как-то вынесем из этого топика. Как инженер я вижу инженерное решение - поднять
разрядность хеша до SHA512 и как-то вообще отвязаться и отбиться от обсуждения этого здесь.

У нас уже был топик "дней рождений" и он хорошо коррелирует с этой высокой криптографией.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924436
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

если выражаться в терминах СУБД, то нельзя использовать хэш как первичный ключ, и ты это еще раз подтвердил найдя коллизию в 128 битном хэше. Но я это предвидел, мое предложение совсем в другом, перечитай мой пост 22076226
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924440
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Данный пункт - to be discussed.

Бесполезно. Дело не в транзакции, используемой репликатором, а в конкурентах. Одна незакоммиченная параллельная транзакция - и появляется изменение, не дошедшее до слейва. Самое неприятное - оно никогда до него не дойдёт, поскольку следующие сеансы репликации уже будут его игнорировать как старое. Смирись, это врождённый недостаток репликации на временных метках и главная причина почему она практически не используется.
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924445
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
hVostt,

если выражаться в терминах СУБД, то нельзя использовать хэш как первичный ключ, и ты это еще раз подтвердил найдя коллизию в 128 битном хэше. Но я это предвидел, мое предложение совсем в другом, перечитай мой пост 22076226


Да я с этим не спорю :)
...
Рейтинг: 0 / 0
Оффлайн-тяпничная репликация
    #39924448
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитав требования выше, считаю, что задача сводится к переизобретению колеса бинарного Git.
...
Рейтинг: 0 / 0
25 сообщений из 151, страница 3 из 7
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Оффлайн-тяпничная репликация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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