powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Средовый Rsync через http
25 сообщений из 53, страница 2 из 3
Средовый 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
25 сообщений из 53, страница 2 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Средовый Rsync через http
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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