|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Какое-то открытие америки в 2020 года. AFAIK Игрушка Vga Planets еще в 1993 г. определяла изменения в файлах и передавала на сервер/с сервера только изменившиеся куски. Есть подозрение, что большинство серверов контроля версий действуют так же (как минимум хранят только изменения). Т.ч. залить бекапы в сервер контроля версий и радоваться. Не проверял ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 15:54 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
dimonz80 Еще можно посмотреть в сторону всяких реплицируемых ФС типа DRDB или DFS, что умеет снапшоты и репликацию. Понимаешь... эти все файловые системы... вещь очень стационарная. А мне нужно так. Приехал на дачу. Открыл ноутбук. (Там допустим Windows 10). Набрал Код: sql 1.
И все полетело как птица... По поводу git скажу пару слов. Git плохо работает с бинарниками. Насколько я помню финский парень так и не реализовал инкрементальное хранение изменений как в svn. А он просто хранит полные версии исходников на зипует их gzip-ом для экономии. Соотв мой первый коммит 300 Гб базы зальёт полный объем в git, и если я изменил 1 блочок - следующий коммит добавит еще 300 Гб (если речь шла об 1 файле!). Пускай знатоки Гит подтвердят или опровергнут это. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 15:58 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Dima T mayton Потом проведу след. Эксперимент. Сделаю копию мой PGsql БД. Там сейчас лежат только 2 крупных таблицы. Ошметки одной из БД. Если не путаю PGSql хранит версионные данные, т.е. выполняя update записи таблицы фактически создается новая на уровне файловой системы, а старая как-то помечается ненужной. И так он гадит при каждом update. Поэтому периодически нужно делать VACUUM , который как минимум ненужные помечает как свободное место, как максимум сдвигает данные внутри файла. При интенсивных update в первом случае придется обновлять этот мусор в копии, во втором можно словить полное изменение БД на файловом уровне. Не совсем. PG при updateах старается поместить кортеж рядом с его старой версией, чтобы индексы не деградировали, и в большинстве случаев изменения затронут только одну страницу размером 8К. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 16:01 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Не очень понятно, чем логи СУБД не нравятся. У нас каждый день данные с прода на тест летают "аки птицы" ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 16:02 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Не очень понятно, чем логи СУБД не нравятся. У нас каждый день данные с прода на тест летают "аки птицы" ))) Я хочу создать универсальное решение для блочной инкрементальной синхронизации по вебу для произвольных бинарей. Сегодня это PG, завтра будет какой-нибудь Apache Ignite, или Neo4j. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 16:09 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Возможно даже осмысленно. С другой стороны, поскольку для полноценных архивов/бекапов нужно хранить daily/weakly/monthly, то должен быть некий микс rsync + недо-svn Странно, если таких решений еще нет. Т.к. инкрементальные бекапы поддерживают все, кому не лень. Вроде тот же Acronis. И там требования должны быть примерно такие-же (файлы размером с жесткий диск) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 16:41 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
У меня нет требования daily/weekly. У меня есть на ноутбуке "блоб" неизвестного происхождения. И есть на сервере этот-же "блоб" просто чуть более новой версии. И надо догнать ноутбук до актуального состояния. Решение на базе блочных инкременталов есть у Оракла. Это RMAN. Для тех случаев когда бд в режиме NOARCHIVELOG. Но с ним - тоже хлопотно. Нужно сделать подгоотвительные действия. Подготовить полный бекап. Потом цепочку инкременталов. Вообще по RMAN написана книжка. Такая .. наподобие Библии с ветхим и новым заветом. Тоесть решение слишком уж.... ентерпрайзное. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 17:19 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Надо провести несколько экспериментов. Гипотеза. Изменения в большистве DBMS трекаются небольшими порциями информации кратными 4k,8k,...32к. Oracle и PG это декларируют в своей документации. Дефолтный размер для Oracle - 8k для PG - 4.. Возможно в других DBMS это тоже так. Пускай знающие подскажут. Для того чтобы физический инкрементальный холодный бекап был быстр и эффективен нам имеет смысл иметь настроечный параметр который показывает размер этой гранулы или блока. Код: sql 1.
Для того чтобы трекать статус всех блоков можно использовать структуры данных наподобие MerkleTree https://en.wikipedia.org/wiki/Merkle_tree Впрочем дерево не обязательно. Достаточно списка. Дерево полезно там где блоки подписываются ЭЦП (Blockchain) и где важно постоянно гарантировать целостность всей цепочки от головы до хвоста и обновление хвоста не должно затрагивать пере-подписывание всего дерева. Но я потрачу на дерево 1 день. Не на разработку. Я просто поищу в гитхабе готовые либы которые формируют дерево и предоставляют итератор к нему. Я-же просто должен передать туда блоб и хешфункцию. Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 17:59 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Поле для эксперимента. У меня есть инстанс PG версии 12.х И уже есть табличное пространство /dht и пара толстых таблиц по 1 Гигабайту (это кстати взято отсюда Четверговые опенсорцные БД для нагрузочного тестинга ) Размеры. Код: sql 1. 2. 3. 4. 5. 6. 7.
Таблички. Код: 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.
Эксперимент будет такой. Я удалю 50% строк из одной таблички (organization) и 25% строк из другой случайным образом. Посчитаю какие блоки изменились. Тоесть какой (%) этих блоков от общего объема изменился. Учитывая квантовую механику PG нужно делать vacuum для достижения гарантий физического уничтожения строк. Поэтому будет 2 эксперимента. 1) Удаление. Учет блоков 2) Вакуум всего удаленного. Еще раз учет блоков. Если-бы это был Oracle то было-бы немножко проще. Ну да ладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:09 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Хм.. тут засада. Этож не Оракл где tablespace это сет крупных файлов. Здесь получается 1 сегмент равен 1 файлу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:18 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Ага нашел. Вот так. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И туловища тут лежат. (Я копипащу фрагменты поскольку весь листинг большой). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Странно что у них совпадают размеры. Или PG экстендит файлы гранулами по экспоненте. Ну да ладно. Щас еще надо скриптик придумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:25 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Может быть это и есть 1 сегмент таблицы Person? Типа 2 файла = 1 сегмент. Код: sql 1. 2.
Постгресщики где вы? Проконсультируйте. А то бухгалтерия не сходится. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:28 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Так. Скриптик будет где-то такой. Только добавить delete осталось. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Но я щас делать это не буду. Не готова главная часть... учет измененных блоков. Котики ваш кот уходит на рекламную паузу. Надо взять часик чтоб написать учет блоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 18:41 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Так я немножко тупанул. Размер блока в PG равен 8 килобайт. Но не страшно. Поменяем. Код: sql 1. 2. 3. 4. 5.
Фиксацию хешей 8К блоков я написал. В двух вариантах с списком SHA-1 (мой плоский вариант) и второй вариант - коробочное дерево от некого Michael <mpeterson2@gmail.com> https://github.com/quux00/merkle-tree Дерево фиксирует и сериализирует данные но пока я еще не смотрел как можно делать comparison двух деревьев. Но по крайней мере интерфейс корневой ноды Node дерева мне выдан. Следовательно итератор я смогу написать. Этот Майкл Петерсен захардкодил расчет контрольной суммы как функцию Адлера Код: sql 1.
Не лучший выбор для криптографии. Но насколько я понимаю я контролирую функции хешов листовых узлов и могу туда толкать SHA-1 а уже сцепление этих хешей выполняется в более легкой и простой функции. Возможно это и верное решение нацеленное на performance. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 20:38 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
С сорцами. Код: 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.
База готова. Один снимок хешей и дерева я уже сделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 21:18 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Вот выхлоп. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 21:23 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Хм... Postgres на удалениях - медленный покемон. Уж 15 минут удаляет. Я не умею читать планы PG но ... проясните кто знающий что здесь к чему. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Индекс по 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 22:00 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Ладно. Убил сессию. Плохо что теперь статистика испорчена. Чтож возьмем другую табличку. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 22:09 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Тээкс. Как всегда на пустяке все летит к чертям. Ладно. Обманем оптимизатор. Просто упростим задачу. Пускай читает id шники из другой временной таблички. Код: sql 1. 2. 3. 4. 5. 6.
Так стоимость колеблется от 200 тыщ до мильона. Это лучше чем от 800 тыщ до полтора. Но структурно логика выглядит проще. И нет этих пугающих Nested loops. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Попробовал без индекса. Таже стоимость. ОК. Пускай хоть так. Запускаем. Код: sql 1.
Еще летит... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2020, 23:42 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Не прошло и пол-года как я дополз до лога. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 00:21 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Растянул постгресу параметры max_wal_size до с 16М до 1Г и shared_buffers со 128Мб до 1Г. Переписал запрос без подзапросов. Код: sql 1.
Он не очевидным образом фильтрует 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) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 11:14 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Мда. 100% db_blocks изменилось. Объем сегмента (файл) не изменился. Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Делать vacuum уже нет смысла. Щас попробуем изменить 1/16 часть строк таблицы. Возьму другую табличку. Организации. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2020, 12:38 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Подзабросил я этот проект пока. Думаю о протоколе. Сервер будет 100% http-совместимым. На базе jetty. Но будет поддерживать опции request для запуска индексации. В идеале отдебажить все можно будет в браузере. Вопросы. 1) Листинг файлов каталога по HTTP . Вроде протокол это не поддерживает. Apache index_mod позволяет генерировать html странички авто-индекса. Я просто могу добавить некий readme.lst который будет хранить и актуализировать список файлов в текущем URL. Код: sql 1.
2) Корректный метод запуска процесса индексации . Я предполагаю что это должен быть Код: sql 1.
и он должен быть асинхронным. Тоесть если индексируемый файл - размером несколько гигов то процесс индексирования займет какое-то время. Кроме того он итеративно пройдет по всем файлам каталога а это означает - запуск семейства процессов индексации. Нужен пул процессов которые индексируют и их статусы. PUT создает одноименный файл с новым расширением. Код: sql 1.
Здесь .lock подраумевает что уже стартован процесс индексирования. И фальстарт не будет ничего делать а только подтверждать что процесс уже запущен. В хедер .lock файла будет вносится .pid jetty процесса и таким образом все упавшие jetty процессы можно будет возобновить или проигнорировать если мы уже находимся в контексте текущего. 3) Корректный код возврата на PUT будет Код: sql 1.
Хотя тут возможно и другие варианты. Вобщем отпишите как считаете нужным. 4) Трекинг статуса. Обычный HEAD с линком на индесацию. Как только Код: sql 1.
вернет ошибку значит файл уже проиндексирован и надо искать без суффикса Код: sql 1.
5) Далее - скачивание индекса меркла и туловища файла опционально с диапазонным запросом. Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
И так далее до полной реконструкции локального файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 17:18 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
Я забыл описать формат PUT Код: sql 1.
Здесь можно было бы POST, но пост предполагает генерацию новой сущности как в БД. А PUT - upsert, поэтому смысл лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 17:23 |
|
Средовый Rsync через http
|
|||
---|---|---|---|
#18+
По просьбам читателей. Сравнение с 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2020, 18:21 |
|
|
start [/forum/topic.php?fid=16&msg=40020624&tid=1339704]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 234ms |
total: | 360ms |
0 / 0 |