powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Средовый Rsync через http
53 сообщений из 53, показаны все 3 страниц
Средовый Rsync через http
    #40020087
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет друзья.

Придумал следующее. Не продуктовая задача. А так. Для себя.

Периодически думаю о том как сливать холодный backup от Oracle/PGSql через веб интерфейс.
Но надо минимизировать трафик.


Особенности данной задачи:

1. Бэкап достаточно большой (100-300 Гб файлов россыпью).
2. Файлы изменяются внутри мало. Вангую 1-5%. Размер файлов обычно не меняется.
3. Предпочтителен HTTP. Он удобнее чем NFS/Cifs потому как "пробить дырку"
в сетях по 80 порту всегда проще.

Я мог бы использовать wget -c но он детектирует размер но не содержание.
Я мог бы добавлять к каждому скачиваемому файлу контрольную сумму md5 но сделать
с клиента это невоможно т.к. подсчет md5 эквивалентен скачиванию.

Тоесть нужен умный сервер.

Задумался об утилите rsync.

Она подходит идеально когда вы синхронизируете локальные фолдеры либо фолдеры шареные по файловым
протоколам. Но rsync не работает по http.

Из базовых возможностей http есть опция range.
Код: sql
1.
2.
3.
GET /db/mydb/PG_12_201912345/16387/41553.1 HTTP/1.1
Host: www.maytonsfuckendb.org
Range: bytes=127645-4096



Но не хватает больше серверной и клиенствой логики которая делает всю работу.

Думал об тегах eTag, If-Modified-Since. Но они расчитанные на полное опциональное скачиванеи небольших файлов.
Мне не подходят.

Задача тематически связана с брейнштормом по поводу репликаций https://www.sql.ru/forum/1322059/offlayn-tyapnichnaya-replikaciya
хотя я уже от нее частично отказался. Безперспективно. Но если будете поднимать - я не против.


Линки по теме которые я начал читать.

http://www.webdav.org/
http://www.opennet.ru/man.shtml?category=1&russian=0&topic=rsync
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since

P.S. Go-go думать. Сроков у задачи нет.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020093
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
"пробить дырку" в сетях по 80 порту всегда проще.
mayton
Но rsync не работает по http.
А в ваших сетях по 80 порту обязательно работать по протоколу http?
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020100
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все - неважно. Давайте искать возможности а не причины.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020104
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Это все - неважно. Давайте искать возможности а не причины.
Ну так вот она, возможность - запускать rsync на 80 порту.

Кроме того, в википедии по rsync упоминаются zsync и rclone, которые могут работать по http.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020106
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Пойду читать.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020199
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Че ты мутишь, какой rsync? У тебя же односторонняя передача, ты на сервак с бэкапами ничего с локального компа синхронизировать не должен, должен только синхронизировать локальный комп с серваком, игра в одни ворота.

Подымаешь свой HTTP сервак, который помимо отдачи файлов умеет отдавать метаданные по ним, те же размер и дату изменения.

Роутинг примерно такой получится:
Код: plaintext
1.
2.
  GET /meta           -> JSON например такой [{fileName : '1.bak', changeTS : 1605757087476, size : 1232123232}]
  GET /file/:fileName -> binary stream

Опрашиваешь сначала эти метаданные (GET /meta), сравниваешь, с тем, что у тебя локально и заливаешь только то, что изменилось (GET /file/:fileName), опционально удаляешь файлы, по которым нет инфы м метаданных.


Если хочется упороться по MD5, то его можно попробовать прямо встремить в процедуру бэкапа, алгоритм то поточны, например указав утилите бэкапа выводить результат в STDOUT и сделать сплит пайпов
типа так

Код: plaintext
1.
backup -to-stdout | tee >(md5sum > file.md5) >file.bak


Все!
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020315
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80
mayton,

..... Подымаешь свой HTTP сервак ......

В таком случае лучше поднять SSH сервак ибо он намного плезнее для подобного рода задачь, а rsync работает через ssh.

Вот ещё майтону на почитать http://www.ijsrp.org/research-paper-1115/ijsrp-p4786.pdf
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020360
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OoCc
dimonz80
mayton,

..... Подымаешь свой HTTP сервак ......

В таком случае лучше поднять SSH сервак ибо он намного плезнее для подобного рода задачь, а rsync работает через ssh.

Вот ещё майтону на почитать http://www.ijsrp.org/research-paper-1115/ijsrp-p4786.pdf



Топикстартер кем себя считает - программистом или админом? Если последним, то тогда да, скачал готовенькое - сконфигурил - запустил - PROFIT!!!, а если считает себя тру программером, то пусть идет и программирует свой сервак!)))
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020364
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80
mayton,

Че ты мутишь, какой rsync? У тебя же односторонняя передача, ты на сервак с бэкапами ничего с локального компа синхронизировать не должен, должен только синхронизировать локальный комп с серваком, игра в одни ворота.

Почему у меня односторонняя передача? У меня есть рабочая станция дома. И есть ноубук на даче.
Поработал дома. Чего-то залил в git. Но в git нельзя залить базы. Базы надо лить либо через гуглдрайвы
либо через AWS S3. Естественно я сразу это откинул ибо

1) Лишний траф.
2) Не спортивно.

И передача не односторонняя потому что роли меняются. Сначала (1) -> (2). Потом наоборот (2) -> (1)
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020366
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80
OoCc
пропущено...

В таком случае лучше поднять SSH сервак ибо он намного плезнее для подобного рода задачь, а rsync работает через ssh.

Вот ещё майтону на почитать http://www.ijsrp.org/research-paper-1115/ijsrp-p4786.pdf



Топикстартер кем себя считает - программистом или админом? Если последним, то тогда да, скачал готовенькое - сконфигурил - запустил - PROFIT!!!, а если считает себя тру программером, то пусть идет и программирует свой сервак!)))

Скорее второе. Но я ознакомлюсь с готовыми тулзами однозначно.
Золото... как вы понимаете намывается из песка.

Да и еще не раздражайся сильно. Ты просто мои другие топики не видел. Я периодически подкидываю
задачи безо всякого бизнес смысла.

Так. Головоломка.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020392
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
dimonz80
mayton,

Че ты мутишь, какой rsync? У тебя же односторонняя передача, ты на сервак с бэкапами ничего с локального компа синхронизировать не должен, должен только синхронизировать локальный комп с серваком, игра в одни ворота.

Почему у меня односторонняя передача? У меня есть рабочая станция дома. И есть ноубук на даче.
Поработал дома. Чего-то залил в git. Но в git нельзя залить базы. Базы надо лить либо через гуглдрайвы
либо через AWS S3. Естественно я сразу это откинул ибо

1) Лишний траф.
2) Не спортивно.

И передача не односторонняя потому что роли меняются. Сначала (1) -> (2). Потом наоборот (2) -> (1)



Про гит в начале ничего не было

Тогда берем httpd/nginx, прикручиваем webdav для gita (типа как тут https://gitirc.eu/howto/setup-git-server-over-http.html ) и подбираем модуль для работы с файлами чтобы и файлы отдавал и список файлов с атрибутами, ну или сам на PHP херак-херак и готово.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020396
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
dimonz80
пропущено...



Топикстартер кем себя считает - программистом или админом? Если последним, то тогда да, скачал готовенькое - сконфигурил - запустил - PROFIT!!!, а если считает себя тру программером, то пусть идет и программирует свой сервак!)))

Скорее второе. Но я ознакомлюсь с готовыми тулзами однозначно.
Золото... как вы понимаете намывается из песка.

Да и еще не раздражайся сильно. Ты просто мои другие топики не видел. Я периодически подкидываю
задачи безо всякого бизнес смысла.

Так. Головоломка.


Да я тебя еще по топику про схлопывание графов запомнил. Ты - всяко шпион, пылесосишь идеи по форумам, а мы лопухи тут перед тобой распинаемся)))
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020411
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80
Подымаешь свой HTTP сервак, который помимо отдачи файлов умеет отдавать метаданные по ним, те же размер и дату изменения.

Вообще-то для этого в HTTP есть запрос HEAD, который поддерживается всеми и городить уже ничего не нужно. Но проблема не в этом.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80
mayton
пропущено...

Скорее второе. Но я ознакомлюсь с готовыми тулзами однозначно.
Золото... как вы понимаете намывается из песка.

Да и еще не раздражайся сильно. Ты просто мои другие топики не видел. Я периодически подкидываю
задачи безо всякого бизнес смысла.

Так. Головоломка.


Да я тебя еще по топику про схлопывание графов запомнил. Ты - всяко шпион, пылесосишь идеи по форумам, а мы лопухи тут перед тобой распинаемся)))

Вот так поворот!
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020418
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давайте искать возможности

Берёшь на одном конце новый бэкап и создаёшь для него торрент-файл. На другом конце берёшь старый бэкап и новый торрент-файл. Пинаешь торрент-клиент, он проверяет контрольные суммы каждого блока в файле и несовпадающие помечает как инвалидные, после чего лезет к пиру и скачивает эти блоки. Профит.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020419
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
mayton
Давайте искать возможности

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

Да. Идею с торрентом я обдумывал. Хлопотно. И несекюрно.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020426
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Периодически думаю о том как сливать холодный backup от Oracle/PGSql через веб интерфейс.
Но надо минимизировать трафик.

Может diff ? Хранить текущий и предыдущий бэкап, получать разницу и ее заливать, на той стороне накатывать. Трафик будет минимальный.

PS Еще передаваемое запаковать можно
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020436
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
Периодически думаю о том как сливать холодный backup от Oracle/PGSql через веб интерфейс.
Но надо минимизировать трафик.

Может diff ? Хранить текущий и предыдущий бэкап, получать разницу и ее заливать, на той стороне накатывать. Трафик будет минимальный.

PS Еще запаковать можно

Да. В топике пятничных графов мы обсуждали BSD-шную утилиту bsdiff.
Она работает с бинарями. Я проверю ее на своем PG_DATA home каталоге.

Мне просто будет интересно узнать ее complexity. Если оно квадратично - то для
300 Гигабайтной БД я никогда не получу ответа по bsdiff.

Мне нужно - линейное время.

Я сейчас думаю что для меня - хеши для фрагментов это хороший компромисс
между bsdiff которые смотрят "слишком глубоко" и анализируют
вставки новых блобов в файл. Мне это не нужно т.к. в большинстве
случаев (99%) изменения в БД трекают не вставками а update-s
кусочков файлов (обычно 4-8К) так называемых db-blocks.

Кстати для e-Mule хеш вычислялся какраз следующим образом.
Для файлов меньше 16 мегабайт просто брался MD4 от тела файла.
Для файлов больше - файл бился на некоторое число фрагментов
которые хешировались опять-же через MD4 и потом уже их хеши
еще раз хешировались через MD4 и финальный линк был таков.
Конкатенация MD4(MD4(fraqment(1),MD4(fraqment(2),....e.t.c).
Эта схема дает почти 0 коллизий.

Ну да бох с ним. Ослик умер и умер.

Главное что такая схема подозрительно напоминает Дерево Меркла.
Только не бинарное. И с 1 уровнем вложенности.


Вот на этот блочный режим я и хочу затачивать свой http-rsync сервер.

Которого еще нет.

И который я напишу.

Или как "инфо-шпион", вытащу эти знания из димона80
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020438
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Dima T
пропущено...

Может diff ? Хранить текущий и предыдущий бэкап, получать разницу и ее заливать, на той стороне накатывать. Трафик будет минимальный.

PS Еще запаковать можно

Да. В топике пятничных графов мы обсуждали BSD-шную утилиту bsdiff.
Она работает с бинарями. Я проверю ее на своем PG_DATA home каталоге.

Мне просто будет интересно узнать ее complexity. Если оно квадратично - то для
300 Гигабайтной БД я никогда не получу ответа по bsdiff.

Мне нужно - линейное время.

Я сейчас думаю что для меня - хеши для фрагментов это хороший компромисс
между bsdiff которые смотрят "слишком глубоко" и анализируют
вставки новых блобов в файл. Мне это не нужно т.к. в большинстве
случаев (99%) изменения в БД трекают не вставками а update-s
кусочков файлов (обычно 4-8К) так называемых db-blocks.

Кстати для e-Mule хеш вычислялся какраз следующим образом.
Для файлов меньше 16 мегабайт просто брался MD4 от тела файла.
Для файлов больше - файл бился на некоторое число фрагментов
которые хешировались опять-же через MD4 и потом уже их хеши
еще раз хешировались через MD4 и финальный линк был таков.
Конкатенация MD4(MD4(fraqment(1),MD4(fraqment(2),....e.t.c).
Эта схема дает почти 0 коллизий.

Ну да бох с ним. Ослик умер и умер.

Главное что такая схема подозрительно напоминает Дерево Меркла.
Только не бинарное. И с 1 уровнем вложенности.


Вот на этот блочный режим я и хочу затачивать свой http-rsync сервер.

Которого еще нет.

И который я напишу.

Или как "инфо-шпион", вытащу эти знания из димона80


Дык эта... Для PG ваще можно заюзать архивирование WAL. Типа сначала pg_basebackup + прописать в кофиге чего с WAL делать хоть чтоб само куда надо высылалось, хоть на почту. Там прям в доке по PG все описано. Безо всяких rsynс.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020439
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно. Щас пойду по делам. Потом проведу след. Эксперимент. Сделаю копию мой PGsql БД.
Там сейчас лежат только 2 крупных таблицы. Ошметки одной из БД.

Загружу в нее что-то и посчитаю общие цифры.

Типа сколько Гигов было. Сколько Стало. И сколько 4к блочков обновилось.
Эта high-level информация даст пищу для размышлений. Особенно по тому
что делать дальше. Next steps...


Если в топик набегут Постгресщики и будут меня бить - я не буду сопротивлятся.
Я не спец в этой dbms. Я админил Оракл а не PG. Просто PG попалась под руку. А предположения о блочном
изменении - просто эвристика которая не влияет на корректность моего алгоритма
а может просто повлиять на степень сжатия инкрементального бэкапа. Даже
если я ошибся и парсил не data-файл а какой-то другой бинарник - все равно
при восстановлении он будет восстановлен корректно. Просто с избыточным количеством
инкрементальной ифны например.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020440
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80

Дык эта... Для PG ваще можно заюзать архивирование WAL. Типа сначала pg_basebackup + прописать в кофиге чего с WAL делать хоть чтоб само куда надо высылалось, хоть на почту. Там прям в доке по PG все описано. Безо всяких rsynс.

Ну вот видишь как хорошо что мы с тобой тут чай пьем и беседуем.

Спасибо. Но я выпью свою чашу до дна с твоего позволения. Про hot-backup я не забуду
и тоже его включу в свои бенчмарки.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020441
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Dima T
пропущено...

Может diff ? Хранить текущий и предыдущий бэкап, получать разницу и ее заливать, на той стороне накатывать. Трафик будет минимальный.

PS Еще запаковать можно

Да. В топике пятничных графов мы обсуждали BSD-шную утилиту bsdiff.
Она работает с бинарями. Я проверю ее на своем PG_DATA home каталоге.

Мне просто будет интересно узнать ее complexity. Если оно квадратично - то для
300 Гигабайтной БД я никогда не получу ответа по bsdiff.

Мне нужно - линейное время.

Я сейчас думаю что для меня - хеши для фрагментов это хороший компромисс
между bsdiff которые смотрят "слишком глубоко" и анализируют
вставки новых блобов в файл. Мне это не нужно т.к. в большинстве
случаев (99%) изменения в БД трекают не вставками а update-s
кусочков файлов (обычно 4-8К) так называемых db-blocks.

Кстати для e-Mule хеш вычислялся какраз следующим образом.
Для файлов меньше 16 мегабайт просто брался MD4 от тела файла.
Для файлов больше - файл бился на некоторое число фрагментов
которые хешировались опять-же через MD4 и потом уже их хеши
еще раз хешировались через MD4 и финальный линк был таков.
Конкатенация MD4(MD4(fraqment(1),MD4(fraqment(2),....e.t.c).
Эта схема дает почти 0 коллизий.

Ну да бох с ним. Ослик умер и умер.

Главное что такая схема подозрительно напоминает Дерево Меркла.
Только не бинарное. И с 1 уровнем вложенности.


Вот на этот блочный режим я и хочу затачивать свой http-rsync сервер.

Которого еще нет.

И который я напишу.

Или как "инфо-шпион", вытащу эти знания из димона80


Еще можно посмотреть в сторону всяких реплицируемых ФС типа DRDB или DFS, что умеет снапшоты и репликацию.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020442
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Да. В топике пятничных графов мы обсуждали BSD-шную утилиту bsdiff.
Она работает с бинарями. Я проверю ее на своем PG_DATA home каталоге.

Мне просто будет интересно узнать ее complexity. Если оно квадратично - то для
300 Гигабайтной БД я никогда не получу ответа по bsdiff.

Мне нужно - линейное время.

Потести, вроде относительно быстро работает.

В принципе внутри бэкапа одни и те же страницы на одних и тех же местах. В один проход можно сравнить, а разницу писать в каком-нибудь самодельном формате.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020444
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Потом проведу след. Эксперимент. Сделаю копию мой PGsql БД.
Там сейчас лежат только 2 крупных таблицы. Ошметки одной из БД.

Если не путаю PGSql хранит версионные данные, т.е. выполняя update записи таблицы фактически создается новая на уровне файловой системы, а старая как-то помечается ненужной. И так он гадит при каждом update. Поэтому периодически нужно делать VACUUM , который как минимум ненужные помечает как свободное место, как максимум сдвигает данные внутри файла.
При интенсивных update в первом случае придется обновлять этот мусор в копии, во втором можно словить полное изменение БД на файловом уровне.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020450
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
mayton
Да. В топике пятничных графов мы обсуждали BSD-шную утилиту bsdiff.
Она работает с бинарями. Я проверю ее на своем PG_DATA home каталоге.

Мне просто будет интересно узнать ее complexity. Если оно квадратично - то для
300 Гигабайтной БД я никогда не получу ответа по bsdiff.

Мне нужно - линейное время.

Потести, вроде относительно быстро работает.

В принципе внутри бэкапа одни и те же страницы на одних и тех же местах. В один проход можно сравнить, а разницу писать в каком-нибудь самодельном формате.


Идея конечно здравая, только diff в общем случае строит матрицу NxM где N и M - размеры сравниваемых файлов. Если единицей сравнения будет байт, то все будет плохо, лучше бить на более крупные блоки. Ну и не накосячить при накатывании патча.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020451
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое-то открытие америки в 2020 года.

AFAIK Игрушка Vga Planets еще в 1993 г. определяла изменения в файлах и передавала на сервер/с сервера только изменившиеся куски.

Есть подозрение, что большинство серверов контроля версий действуют так же (как минимум хранят только изменения). Т.ч. залить бекапы в сервер контроля версий и радоваться. Не проверял )))
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020453
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80

Еще можно посмотреть в сторону всяких реплицируемых ФС типа DRDB или DFS, что умеет снапшоты и репликацию.

Понимаешь... эти все файловые системы... вещь очень стационарная. А мне нужно так.
Приехал на дачу. Открыл ноутбук. (Там допустим Windows 10). Набрал

Код: sql
1.
c:\ rsync-over-http https://maytons-fucken-server/db c:\PG



И все полетело как птица...

По поводу git скажу пару слов. Git плохо работает с бинарниками. Насколько я помню финский парень
так и не реализовал инкрементальное хранение изменений как в svn. А он просто хранит полные версии
исходников на зипует их gzip-ом для экономии. Соотв мой первый коммит 300 Гб базы зальёт полный объем
в git, и если я изменил 1 блочок - следующий коммит добавит еще 300 Гб (если речь шла об 1 файле!).

Пускай знатоки Гит подтвердят или опровергнут это.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020455
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
mayton
Потом проведу след. Эксперимент. Сделаю копию мой PGsql БД.
Там сейчас лежат только 2 крупных таблицы. Ошметки одной из БД.

Если не путаю PGSql хранит версионные данные, т.е. выполняя update записи таблицы фактически создается новая на уровне файловой системы, а старая как-то помечается ненужной. И так он гадит при каждом update. Поэтому периодически нужно делать VACUUM , который как минимум ненужные помечает как свободное место, как максимум сдвигает данные внутри файла.
При интенсивных update в первом случае придется обновлять этот мусор в копии, во втором можно словить полное изменение БД на файловом уровне.


Не совсем. PG при updateах старается поместить кортеж рядом с его старой версией, чтобы индексы не деградировали, и в большинстве случаев изменения затронут только одну страницу размером 8К.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020456
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень понятно, чем логи СУБД не нравятся. У нас каждый день данные с прода на тест летают "аки птицы" )))
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020460
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Не очень понятно, чем логи СУБД не нравятся. У нас каждый день данные с прода на тест летают "аки птицы" )))

Я хочу создать универсальное решение для блочной инкрементальной синхронизации по вебу для произвольных бинарей.
Сегодня это PG, завтра будет какой-нибудь Apache Ignite, или Neo4j.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020476
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно даже осмысленно.

С другой стороны, поскольку для полноценных архивов/бекапов нужно хранить daily/weakly/monthly, то должен быть некий микс rsync + недо-svn

Странно, если таких решений еще нет. Т.к. инкрементальные бекапы поддерживают все, кому не лень. Вроде тот же Acronis. И там требования должны быть примерно такие-же (файлы размером с жесткий диск)
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020500
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня нет требования daily/weekly. У меня есть на ноутбуке "блоб" неизвестного происхождения.
И есть на сервере этот-же "блоб" просто чуть более новой версии. И надо догнать ноутбук до
актуального состояния.

Решение на базе блочных инкременталов есть у Оракла. Это RMAN. Для тех случаев когда
бд в режиме NOARCHIVELOG. Но с ним - тоже хлопотно. Нужно сделать подгоотвительные действия.
Подготовить полный бекап. Потом цепочку инкременталов. Вообще по RMAN написана книжка.
Такая .. наподобие Библии с ветхим и новым заветом. Тоесть решение слишком уж.... ентерпрайзное.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020519
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо провести несколько экспериментов.

Гипотеза.

Изменения в большистве DBMS трекаются небольшими порциями информации кратными 4k,8k,...32к.
Oracle и PG это декларируют в своей документации. Дефолтный размер для Oracle - 8k для PG - 4..

Возможно в других DBMS это тоже так. Пускай знающие подскажут.

Для того чтобы физический инкрементальный холодный бекап был быстр и эффективен
нам имеет смысл иметь настроечный параметр который показывает размер этой гранулы
или блока.

Код: sql
1.
granule=4k



Для того чтобы трекать статус всех блоков можно использовать структуры данных наподобие
MerkleTree https://en.wikipedia.org/wiki/Merkle_tree

Впрочем дерево не обязательно. Достаточно списка. Дерево полезно там где блоки подписываются
ЭЦП (Blockchain) и где важно постоянно гарантировать целостность всей цепочки от головы до хвоста
и обновление хвоста не должно затрагивать пере-подписывание всего дерева.

Но я потрачу на дерево 1 день. Не на разработку. Я просто поищу в гитхабе готовые либы которые
формируют дерево и предоставляют итератор к нему. Я-же просто должен передать туда блоб
и хешфункцию.

Код: sql
1.
hash=crc32
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020532
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле для эксперимента. У меня есть инстанс PG версии 12.х
И уже есть табличное пространство /dht и пара толстых таблиц по 1 Гигабайту
(это кстати взято отсюда Четверговые опенсорцные БД для нагрузочного тестинга )

Размеры.

Код: sql
1.
2.
3.
4.
5.
6.
7.
mayton@ryzen-ssd:/bigdata$ 
mayton@ryzen-ssd:/bigdata/pg$ du -h
7.2G	./dht/PG_12_201909212/16387
0	./dht/PG_12_201909212/pgsql_tmp
7.2G	./dht/PG_12_201909212
7.2G	./dht
7.2G	.



Таблички.

Код: 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.
dht=> \d+
                                    List of relations
 Schema |          Name           |       Type        | Owner  |    Size    | Description 
--------+-------------------------+-------------------+--------+------------+-------------
 public | X                       | table             | mayton | 8192 bytes | 
 public | assetclass              | table             | mayton | 304 kB     | 
 public | association_value_entry | table             | mayton | 8192 bytes | 
 public | currency                | table             | mayton | 0 bytes    | 
 public | hibernate_sequence      | sequence          | mayton | 8192 bytes | 
 public | instrument              | table             | mayton | 0 bytes    | 
 public | journal                 | table             | mayton | 16 kB      | 
 public | journal_id_seq          | sequence          | mayton | 8192 bytes | 
 public | measurement             | partitioned table | mayton | 0 bytes    | 
 public | measurement_y2006m02    | table             | mayton | 0 bytes    | 
 public | organization            | table             | mayton | 1288 MB    | 
 public | person                  | table             | mayton | 2598 MB    | 
 public | person_p                | partitioned table | mayton | 0 bytes    | 
 public | person_p0               | table             | mayton | 1300 MB    | 
 public | person_p1               | table             | mayton | 1299 MB    | 
 public | saga_entry              | table             | mayton | 8192 bytes | 
 public | test                    | table             | mayton | 0 bytes    | 
 public | test10                  | table             | mayton | 0 bytes    | 
 public | test2                   | table             | mayton | 0 bytes    | 
 public | test3                   | table             | mayton | 0 bytes    | 
 public | test5                   | table             | mayton | 0 bytes    | 
 public | test5_bs_seq            | sequence          | mayton | 8192 bytes | 
 public | test5_se_seq            | sequence          | mayton | 8192 bytes | 
 public | test5_ss_seq            | sequence          | mayton | 8192 bytes | 
 public | token_entry             | table             | mayton | 16 kB      | 
 public | x                       | table             | mayton | 8192 bytes | 
(26 rows)



Эксперимент будет такой. Я удалю 50% строк из одной таблички (organization) и 25% строк
из другой случайным образом.

Посчитаю какие блоки изменились. Тоесть какой (%) этих блоков от общего объема изменился.

Учитывая квантовую механику PG нужно делать vacuum для достижения гарантий физического
уничтожения строк.

Поэтому будет 2 эксперимента.

1) Удаление. Учет блоков
2) Вакуум всего удаленного. Еще раз учет блоков.

Если-бы это был Oracle то было-бы немножко проще. Ну да ладно.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020539
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. тут засада. Этож не Оракл где tablespace это сет крупных файлов. Здесь получается 1 сегмент равен 1 файлу.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020540
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага нашел. Вот так.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dht=> select pg_relation_filepath('person');
            pg_relation_filepath             
---------------------------------------------
 pg_tblspc/16386/PG_12_201909212/16387/33252
(1 row)

dht=> select pg_relation_filepath('organization');
            pg_relation_filepath             
---------------------------------------------
 pg_tblspc/16386/PG_12_201909212/16387/33288
(1 row)



И туловища тут лежат. (Я копипащу фрагменты поскольку весь листинг большой).

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
total 7500612
-rw-r-x--- 1 postgres postgres 1073741824 Aug 23 23:16 33252*
-rw-r-x--- 1 postgres postgres 1073741824 Aug 23 23:16 33252.1*
-rw-r-x--- 1 postgres postgres 1073741824 Oct  8 00:28 33288*
-rw-r-x--- 1 postgres postgres 1073741824 Oct 30 21:20 41547*
-rw-r-x--- 1 postgres postgres 1073741824 Oct 30 21:20 41553*
-rw-r-x--- 1 postgres postgres  671965184 Aug 23 23:18 33265*
-rw-r-x--- 1 postgres postgres  576299008 Oct  8 00:26 33252.2*
-rw-r-x--- 1 postgres postgres  288563200 Oct 30 22:12 41547.1*
-rw-r-x--- 1 postgres postgres  287744000 Oct 30 22:12 41553.1*
-rw-r-x--- 1 postgres postgres  276938752 Oct  8 00:29 33288.1*
...


Странно что у них совпадают размеры. Или PG экстендит файлы гранулами по экспоненте. Ну да ладно.

Щас еще надо скриптик придумать.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020546
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть это и есть 1 сегмент таблицы Person? Типа 2 файла = 1 сегмент.

Код: sql
1.
2.
-rw-r-x--- 1 postgres postgres 1073741824 Aug 23 23:16 33252*
-rw-r-x--- 1 postgres postgres 1073741824 Aug 23 23:16 33252.1*



Постгресщики где вы? Проконсультируйте. А то бухгалтерия не сходится.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так. Скриптик будет где-то такой. Только добавить delete осталось.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
dht=> select count(*) from person;
  count
----------
 14383340
(1 row)

dht=> select count(*) from (
dht(>         select person.*, row_number() over () as seqnum from person) t
dht-> where seqnum % 2 = 0;
  count  
---------
 7191670
(1 row)



Но я щас делать это не буду. Не готова главная часть... учет измененных блоков.

Котики ваш кот уходит на рекламную паузу. Надо взять часик чтоб написать учет блоков.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020591
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я немножко тупанул. Размер блока в PG равен 8 килобайт. Но не страшно. Поменяем.

Код: sql
1.
2.
3.
4.
5.
dht=> show block_size;
 block_size 
------------
 8192
(1 row)



Фиксацию хешей 8К блоков я написал. В двух вариантах с списком SHA-1 (мой плоский вариант)
и второй вариант - коробочное дерево от некого Michael <mpeterson2@gmail.com>;
https://github.com/quux00/merkle-tree

Дерево фиксирует и сериализирует данные но пока я еще не смотрел как можно делать comparison
двух деревьев. Но по крайней мере интерфейс корневой ноды Node дерева мне выдан. Следовательно
итератор я смогу написать.

Этот Майкл Петерсен захардкодил расчет контрольной суммы как функцию Адлера

Код: sql
1.
private final Adler32 crc = new Adler32();



Не лучший выбор для криптографии. Но насколько я понимаю я контролирую функции хешов листовых
узлов и могу туда толкать SHA-1 а уже сцепление этих хешей выполняется в более легкой и простой
функции. Возможно это и верное решение нацеленное на performance.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020607
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С сорцами.


Код: java
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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
package mayton.httprsync;

import com.fasterxml.jackson.core.JsonFactory;
import net.quux00.MerkleTree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Date;
import java.util.List;


public class MerkleGen {

    static Logger logger = LoggerFactory.getLogger(MerkleGen.class);

    public static void hashListGen(String srcPath, String hashListPath) throws NoSuchAlgorithmException {
        logger.info("hashListGen :: srcPath = {}", srcPath);
        try (PrintWriter pw = new PrintWriter(new FileOutputStream(hashListPath));
             InputStream inputStream = new FileInputStream(srcPath)) {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] block = new byte[8192];
            int length;
            long offset = 0;
            while ((length = inputStream.read(block)) > 0) {
                md.reset();
                md.update(block, 0, length);
                byte[] digest = md.digest();
                String stringDigest = Base64.getEncoder().encodeToString(digest);
                pw.printf("%s\n", stringDigest);
                offset += length;
            }
        } catch (IOException ex) {
            logger.error("", ex);
        }
    }

    public static void merkleGen(String srcPath, String merklePath) throws NoSuchAlgorithmException {
        logger.info("merkleGen :: srcPath = {}", srcPath);
        try (InputStream inputStream = new FileInputStream(srcPath);
             OutputStream os = new FileOutputStream(merklePath)) {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] block = new byte[8192];
            int length;
            long offset = 0;
            List<String> list = new ArrayList<>();
            while ((length = inputStream.read(block)) > 0) {
                md.reset();
                md.update(block, 0, length);
                byte[] digest = md.digest();
                String stringDigest = Base64.getEncoder().encodeToString(digest);
                offset += length;
                list.add(stringDigest);
            }
            MerkleTree merkleTree = new MerkleTree(list);
            os.write(merkleTree.serialize());
        } catch (IOException ex) {
            logger.error("", ex);
        }
    }

    public static void main(String[] args) throws NoSuchAlgorithmException {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        String sessionId = simpleDateFormat.format(new Date());

        String destPath = "/storage/rsync-http/";

        String hashListPath = destPath + "hash-list/" + sessionId;

        new File(hashListPath).mkdirs();
        hashListGen("/bigdata/pg/dht/PG_12_201909212/16387/33252", hashListPath + "/33252.hashlist");
        hashListGen("/bigdata/pg/dht/PG_12_201909212/16387/33252.1", hashListPath + "/33252.1.hashlist");

        String destPathMerkle = destPath + "merkle-tree/" + sessionId;

        new File(destPathMerkle).mkdirs();
        merkleGen("/bigdata/pg/dht/PG_12_201909212/16387/33252", destPathMerkle + "/33252.merkle");
        merkleGen("/bigdata/pg/dht/PG_12_201909212/16387/33252.1", destPathMerkle + "/33252.1.merkle");

    }


}



База готова. Один снимок хешей и дерева я уже сделал.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020609
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот выхлоп.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
mayton@ryzen-ssd:/storage/rsync-http$ tree --charset windows1251 -s
.
|-- [         38]  hash-list
|   `-- [         60]  2020-11-19-20-16-10
|       |-- [    3801088]  33252.1.hashlist
|       `-- [    3801088]  33252.hashlist
`-- [         38]  merkle-tree
    `-- [         52]  2020-11-19-20-16-10
        |-- [    6029307]  33252.1.merkle
        `-- [    6029307]  33252.merkle
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Postgres на удалениях - медленный покемон. Уж 15 минут удаляет. Я не умею читать планы PG
но ... проясните кто знающий что здесь к чему.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
dht=> explain delete from person where id in (select id from (
dht(>                                      select person.*, row_number() over () as seqnum from person) t
dht(>                                where seqnum % 2 = 0);
                                                   QUERY PLAN                                                    
-----------------------------------------------------------------------------------------------------------------
 Delete on person  (cost=893393.62..1392046.64 rows=71821 width=489)
   ->  Nested Loop  (cost=893393.62..1392046.64 rows=71821 width=489)
         ->  Unique  (cost=893393.06..893752.17 rows=71821 width=509)
               ->  Sort  (cost=893393.06..893572.61 rows=71821 width=509)
                     Sort Key: ((t.id)::text)
                     ->  Subquery Scan on t  (cost=0.00..871149.94 rows=71821 width=509)
                           Filter: ((t.seqnum % '2'::bigint) = 0)
                           ->  WindowAgg  (cost=0.00..655687.16 rows=14364185 width=467)
                                 ->  Seq Scan on person person_1  (cost=0.00..476134.85 rows=14364185 width=459)
         ->  Index Scan using person_pk on person  (cost=0.56..6.97 rows=1 width=32)
               Index Cond: ((id)::text = (t.id)::text)
 JIT:
   Functions: 11
   Options: Inlining true, Optimization true, Expressions true, Deforming true
(14 rows)



Индекс по id есть.

Код: 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.
dht=> \d person
                                Table "public.person"
           Column           |          Type          | Collation | Nullable | Default 
----------------------------+------------------------+-----------+----------+---------
 id                         | character varying(255) |           |          | 
 TYPE                       | character varying(23)  |           |          | 
 has_perm_id                | character varying(68)  |           |          | 
 RANK                       | character varying(4)   |           |          | 
 pref_label                 | character varying(86)  |           |          | 
 has_publication_status     | character varying(29)  |           |          | 
 from_institution_name      | character varying(213) |           |          | 
 in_subject                 | character varying(12)  |           |          | 
 with_degree                | character varying(12)  |           |          | 
 TO                         | character varying(22)  |           |          | 
 FROM                       | character varying(22)  |           |          | 
 has_holder                 | character varying(15)  |           |          | 
 is_tenure_in               | character varying(15)  |           |          | 
 has_position_type          | character varying(14)  |           |          | 
 has_reported_title         | character varying(219) |           |          | 
 is_position_in             | character varying(15)  |           |          | 
 has_tenure_in_organization | character varying(15)  |           |          | 
 holds_position             | character varying(68)  |           |          | 
 family_name                | character varying(62)  |           |          | 
 given_name                 | character varying(61)  |           |          | 
 has_gender                 | character varying(8)   |           |          | 
 honorific_prefix           | character varying(27)  |           |          | 
 additional_name            | character varying(37)  |           |          | 
 has_qualification          | character varying(88)  |           |          | 
 honorific_suffix           | character varying(54)  |           |          | 
 preferred_name             | character varying(25)  |           |          | 
 date_of_death              | character varying(12)  |           |          | 
 has_year_of_birth          | character varying(6)   |           |          | 
Indexes:
    "person_pk" UNIQUE, btree (id)
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020624
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно. Убил сессию. Плохо что теперь статистика испорчена.

Чтож возьмем другую табличку.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020642
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тээкс. Как всегда на пустяке все летит к чертям. Ладно. Обманем оптимизатор. Просто упростим задачу.
Пускай читает id шники из другой временной таблички.

Код: sql
1.
2.
3.
4.
5.
6.
create temporary table person_tmp on commit preserve rows as (select id from (select person.*, row_number() over () as seqnum from 
person) t where seqnum % 2 = 0);

create index person_tmp_idx on person_tmp(id);

analyze verbose person_tmp;



Так стоимость колеблется от 200 тыщ до мильона. Это лучше чем от 800 тыщ до полтора.
Но структурно логика выглядит проще. И нет этих
пугающих Nested loops.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
dht=> explain  delete from person where id in (select id from person_tmp);
                                       QUERY PLAN
----------------------------------------------------------------------------------------
 Delete on person  (cost=261621.21..1155451.46 rows=7191387 width=12)
   ->  Hash Semi Join  (cost=261621.21..1155451.46 rows=7191387 width=12)
         Hash Cond: ((person.id)::text = (person_tmp.id)::text)
         ->  Seq Scan on person  (cost=0.00..476326.40 rows=14383340 width=32)
         ->  Hash  (cost=122568.87..122568.87 rows=7191387 width=32)
               ->  Seq Scan on person_tmp  (cost=0.00..122568.87 rows=7191387 width=32)
 JIT:
   Functions: 10
   Options: Inlining true, Optimization true, Expressions true, Deforming true
(9 rows)



Попробовал без индекса. Таже стоимость. ОК. Пускай хоть так. Запускаем.

Код: sql
1.
dht=> delete from person where id in (select id from person_tmp);



Еще летит...
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020645
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не прошло и пол-года как я дополз до лога.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
2020-11-19 22:29:29.766 EET [60395] mayton@dht ERROR:  syntax error at or near "for" at character 9
2020-11-19 22:29:29.766 EET [60395] mayton@dht STATEMENT:  explain for delete from person where id in (select id from person_tmp);
2020-11-19 22:35:02.119 EET [1474] LOG:  checkpoints are occurring too frequently (8 seconds apart)
2020-11-19 22:35:02.119 EET [1474] HINT:  Consider increasing the configuration parameter "max_wal_size".
2020-11-19 22:46:45.027 EET [1474] LOG:  checkpoints are occurring too frequently (10 seconds apart)
2020-11-19 22:46:45.027 EET [1474] HINT:  Consider increasing the configuration parameter "max_wal_size".
2020-11-19 23:08:41.339 EET [1474] LOG:  checkpoints are occurring too frequently (2 seconds apart)
2020-11-19 23:08:41.339 EET [1474] HINT:  Consider increasing the configuration parameter "max_wal_size".
2020-11-19 23:16:36.718 EET [1474] LOG:  checkpoints are occurring too frequently (16 seconds apart)
2020-11-19 23:16:36.718 EET [1474] HINT:  Consider increasing the configuration parameter "max_wal_size".
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020708
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Растянул постгресу параметры max_wal_size до с 16М до 1Г и shared_buffers со 128Мб до 1Г.

Переписал запрос без подзапросов.
Код: sql
1.
delete from person where substr(md5(id),1,1) in ('0','2','4','6','8','a','c','e');


Он не очевидным образом фильтрует 50% строк. Тоесть не такой красивый как в варианте с оконной функцией.

Удалил за 11 сек.

Что стало реальной причиной ускорения - не разбирался. И некогда. Это я задам отдельным топиком в Сравнение СУБД

dht=> explain (analyze, costs, buffers, timing) delete from person where substr(md5(id),1,1) in ('0','2','4','6','8','a','c','e');
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Delete on person (cost=0.00..692076.50 rows=575334 width=6) (actual time=20834.922..20834.923 rows=0 loops=1)
Buffers: shared hit=7192885 read=332493 dirtied=332493 written=195263
I/O Timings: read=931.112 write=831.027
-> Seq Scan on person (cost=0.00..692076.50 rows=575334 width=6) (actual time=48.533..12026.472 rows=7192885 loops=1)
Filter: (substr(md5((id)::text), 1, 1) = ANY ('{0,2,4,6,8,a,c,e}'::text[]))
Rows Removed by Filter: 7190455
Buffers: shared read=332493 written=195263
I/O Timings: read=931.112 write=831.027
Planning Time: 0.119 ms
JIT:
Functions: 3
Options: Inlining true, Optimization true, Expressions true, Deforming true
Timing: Generation 0.958 ms, Inlining 24.922 ms, Optimization 16.995 ms, Emission 6.479 ms, Total 49.354 ms
Execution Time: 21197.597 ms
(14 rows)
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40020746
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. 100% db_blocks изменилось. Объем сегмента (файл) не изменился.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
.....
[INFO ]  : Block # 131067 : hash1 = 'O2vMDnsJlj113qGwYn/qFgK/fRA=', hash2 = 'd82GSvApaNM2frWqLqaRDBecxh0='!
[INFO ]  : Block # 131068 : hash1 = 'r5AO0yB0phKagV9/xVeQ6y0herI=', hash2 = 'qaNmaUjww7HCgDGorL70fWeC428='!
[INFO ]  : Block # 131069 : hash1 = 'V2qnBSO20+LqP8l3W4nswXZI+5Y=', hash2 = 'BPYpJMG+oRvVtOEcAZ2UZcXnBAs='!
[INFO ]  : Block # 131070 : hash1 = 'rJ2+kbVLnp5ZSCIMt4RyfwzY4I8=', hash2 = 'dvoP7c7fnuB9oeRItmljnRsNCbA='!
[INFO ]  : Block # 131071 : hash1 = 'FCX7k52ij977Lj5tVTXFM2MYsQU=', hash2 = 'dNRfxgzPcypbBVUuzlGIovGLlDk='!
[INFO ]  : Equals : 0
[INFO ]  : All    : 131072



Делать vacuum уже нет смысла.

Щас попробуем изменить 1/16 часть строк таблицы. Возьму другую табличку. Организации.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40021109
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подзабросил я этот проект пока. Думаю о протоколе.

Сервер будет 100% http-совместимым. На базе jetty. Но будет поддерживать опции request
для запуска индексации.

В идеале отдебажить все можно будет в браузере.

Вопросы.

1) Листинг файлов каталога по HTTP . Вроде протокол это не поддерживает.
Apache index_mod позволяет генерировать html странички авто-индекса.
Я просто могу добавить некий readme.lst который будет хранить и актуализировать
список файлов в текущем URL.

Код: sql
1.
GET /db/mydb/PG_12_201912345/16387/readme.lst HTTP/1.1



2) Корректный метод запуска процесса индексации . Я предполагаю
что это должен быть

Код: sql
1.
PUT ....



и он должен быть асинхронным. Тоесть если индексируемый файл - размером несколько гигов
то процесс индексирования займет какое-то время. Кроме того он итеративно пройдет
по всем файлам каталога а это означает - запуск семейства процессов индексации.
Нужен пул процессов которые индексируют и их статусы.

PUT создает одноименный файл с новым расширением.

Код: sql
1.
GET /db/mydb/PG_12_201912345/16387/41553.1.merkle-index.lock



Здесь .lock подраумевает что уже стартован процесс индексирования. И фальстарт не будет
ничего делать а только подтверждать что процесс уже запущен.

В хедер .lock файла будет вносится .pid jetty процесса и таким образом все упавшие
jetty процессы можно будет возобновить или проигнорировать если мы уже находимся в контексте
текущего.

3) Корректный код возврата на PUT будет

Код: sql
1.
202 Accepted.


Хотя тут возможно и другие варианты. Вобщем отпишите как считаете нужным.

4) Трекинг статуса.

Обычный HEAD с линком на индесацию.
Как только
Код: sql
1.
HEAD /db/mydb/PG_12_201912345/16387/41553.1.merkle-index.lock


вернет ошибку значит файл уже проиндексирован и надо искать без суффикса

Код: sql
1.
HEAD /db/mydb/PG_12_201912345/16387/41553.1.merkle-index




5) Далее - скачивание индекса меркла и туловища файла опционально с диапазонным запросом.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
GET /db/mydb/PG_12_201912345/16387/41553.1.merkle-index
200 OK

GET /db/mydb/PG_12_201912345/16387/41553.1
Range: bytes=0..8192

GET /db/mydb/PG_12_201912345/16387/41553.1
Range: bytes=8192..16384



И так далее до полной реконструкции локального файла.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40021111
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я забыл описать формат PUT

Код: sql
1.
PUT /db/mydb/PG_12_201912345/16387/41553.1?index=start



Здесь можно было бы POST, но пост предполагает генерацию новой сущности
как в БД. А PUT - upsert, поэтому смысл лучше.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40027737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По просьбам читателей. Сравнение с DbForge Studio

dbForge Studio for **** Rsync-HttpUI Mode UI consoleOS ? (windows?) Any JVM support OSLicense ? free-for-allImplementation ? java-11 (JVM)Components UI application client + serverGoals ? (many goals ?) quick synchronize master-slave databaseMethod transactions? file blocks copy + merkle tree indexSpeed ? (depends on) Fast. Very fast...Network ports ? (depends on dbms?) Any port number (HTTP protocol)Security ? (unknown) No security goals declared. Depends on network/VPNDBMS support Oracle/MySQL/MSSQL Any file-organized DBMS Typical user Any Developer/Devops
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40028116
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно важное свойство
dbForge Studio for **** Rsync-HttpBackup mode hot backup only cold backup
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40029341
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По данной задаче.

Я не отказываюсь от нее и она будет разработана.
Но в настоящий момент я заблокирован архитектурой безопасности DBMS Postgres.

Тема здесь Пошарить datafiles для другого пользователя на чтение.

Мне нужно решить этот вопрос с доступами и тогда я продолжу разработку. Если кто знает как это фиксить - welcome.
...
Рейтинг: 0 / 0
Средовый Rsync через http
    #40030844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чтож. Постгрес отвалился. Не хочу я его бэкапить "такой ценой". Ценой перекомпилляции
сорцов просто чтобы он не создавал атрибуты -rwx----- а давал права на группу.

Если система безопасности так изначально проектировалась то хачить ее я считаю как минимум
архитектурно неправильно. Я буду консервативен именно в этом вопросе.

Остался Оракл и MySQL.
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Средовый Rsync через http
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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