The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering), opennews (??), 26-Май-20, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


210. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от пох. (?), 29-Май-20, 08:46 
> для ФС не умеющих в нормальное полноценное журналирование

для всех.

> Иначе при крахе в момент записи можно получить наполовину старый, наполовину новый файл.

как журналирование от этого поможет?

В лучшем случае оно позволит избежать последствий reordering, когда мы писали-писали, решили что дописали, и поставили себе пометку transaction finished. Но головки стояли близко к журналу транзакций, и далеко от данных - поэтому система оптимизировала запись, первым записав что поближе, и тут ой, kernel panic.
journaled fs при этом не пометит запись состоявшейся уже на своем уровне - и при накате журнала запишет и данные, и метку заново, приведя все в консистентное состояние.
Но ценой потерь производительности на двойное (четверное) перезаписывание одного и того же.
Поэтому никто с journal=data и не хочет иметь дел.

Вот журналирующая CoW или log-structured (что совсем не то же самое) fs - поможет. Но опять же такой потерей производительности именно для субд - что все наизобретали костылей и подпорок, чтобы этот CoW для них выключать или хотя бы свести к минимуму.

При этом очевидный костыль вида полностью отключить внутреннее журналирование и direct io вместе с ним, и надеяться в этом на шибкопродвинутую fs - в случае как минимум mysql(innodb)+zfs не работает, данные первращаются в тыкву. Причины никому неизвестны и разбираться - героев не нашлось.

Ответить | Правка | Наверх | Cообщить модератору

218. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от Аноним (-), 29-Май-20, 10:20 
> для всех.

На CoW получить старое состояние файла в случае "не прокатило" в принципе можно и без такой порнографии. Но тут смотря что программы делали.

> как журналирование от этого поможет?

Если журналить данные - можно либо завершить ту запись, либо отбросить, смотря успело ли намерение попасть в журнал. А если только метаданные журналились - вот тут уже без шансов, потребных данных просто нет нигде. И будет файл с обломаной на середине записью, понятно насколько юзабельный.

> В лучшем случае оно позволит избежать последствий reordering, когда мы писали-писали, решили
> что дописали, и поставили себе пометку transaction finished.

Если в момент краха запись обрубилась на середине - без журналирования данных это вообще совсем невозможно сделать чем-то консистентным применительно к данным. А в cow что, просто проигнорил последние потуги - и вот вам ваш файл, хоть и старый, но по крайней мере, читаемый и понимаемый.

> Но головки стояли близко к журналу транзакций, и далеко от данных - поэтому система
> оптимизировала запись, первым записав что поближе, и тут ой, kernel panic.

Ну во первых, если мухлевать в журналировании - то какой с него потом толк?
Во вторых, случае CoW все будет несколько иначе. Там по сути достаточно отбросить то что не получилось, старое состояние не испорчено и будет просто немного более старое но корректное представление.

Ясен фиг это все с точностью до сисколов конкретными прогами, идиотничать можно всегда. Но вот видимо это самое и вынуждает СУБД делать себе логику журналирования самим, целиком, от и до. Их такой расклад явно не устроит же.

> journaled fs при этом не пометит запись состоявшейся уже на своем уровне
> - и при накате журнала запишет и данные, и метку заново, приведя все в консистентное состояние.

Есть только 1 нюанс: писать данные сперва в журнал, потом в основную область означает ДВЕ записи данных. Скорость записи получается никакой. Поэтому этим режимом в EXT4 редко пользуются. А любимый шапкин XFS так, вроде, до сих пор не умеет. Зато умеет нули к файлам дописывать, походу. И таки до сих пор кажись какие-то остатки этого есть, я такой файлик видел, он не протерт конечно, но хвост из лишних нулей веселый :D.

> Поэтому никто с journal=data и не хочет иметь дел.

Блин спасибо кэп. Собственно поэтому CoW и придумали.

> Вот журналирующая CoW или log-structured (что совсем не то же самое) fs - поможет.

Вероятно, есть бесконечное количество способов сделать одно и то же по общему смыслу.

> Но опять же такой потерей производительности именно для субд
> - что все наизобретали костылей и подпорок, чтобы этот CoW для
> них выключать или хотя бы свести к минимуму.

Потому что в результате получается нечто типа "двойного журналирования", логика тамошнего журнала на CoW неудобно кладется и фрагментами забивается все просто в хлам.

И вариантов в общем то два: либо попросить CoW отвалить и оставить файл "in place" (btrfs так умеет), либо отдать ФС журналирование (но где для этого стандартная семантика и сисколы?). Собственно оракл с самого начала и хотел in-place файлы в btrfs (nodatacow) для своих баз, чего ж еще.

> - в случае как минимум mysql(innodb)+zfs не работает, данные первращаются в
> тыкву. Причины никому неизвестны и разбираться - героев не нашлось.

Думаю что они не полностью корректно смогли изобразить файлухой журнал. Это не просто и подразумевает кучу допущений, при том что удобного и стандартного способа пока вроде бы и нету. Хоть я и не понимаю чему противоречит next-gen семантика под CoW, позволяющая явно запрашивать у ФС услуги журналирования в желаемом виде (впрочем, ниоткуда не следует что ФС это хорошо сделает для БД, СУБД может позволить себе больше специализации).

Ответить | Правка | Наверх | Cообщить модератору

225. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от all_glory_to_the_hypnotoad (ok), 29-Май-20, 13:47 
> На CoW получить старое состояние файла в случае "не прокатило" в принципе можно и без такой порнографии. Но тут смотря что программы делали.

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

>  И будет файл с обломаной на середине записью, понятно насколько юзабельный.

Это может быть в любом случае, нельзя изменить любой файл за один write(...) с логом в ФС.

Ответить | Правка | Наверх | Cообщить модератору

237. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от Аноним (-), 30-Май-20, 09:20 
> CoW это метод оптимизации использования носителя, он не избавляет от необходимости делать
> новый файл с последующей подменой.

А вообще мог бы. В том плане что либо программа завершает запись и получает файл в новом состоянии, либо файл остается в его предыдущем виде. И это как раз эквивалент полного журналирования. Только без тормозов от двукратной записи.

> Тем более для общего случая CoW вреден т.к. новый файл может измениться радикально для CoW.

Это неверное утверждение. CoW - "другой по свойствам". При "радикальном изменении" это не такая уж проблема: в лучшем случае файл быренько 1 куском выжмется в новый extent, желательно непрерывный. На него "переназначат указатели" со старого, грубо говоря, и дело в шляпе. Это само по себе и быстро, и не имеет причин плохо работать, и совсем не портит предыдущий вариант файла на случай если что-то все же пошло не так. Так что это полный журнал со скоростью записи как без журнала вообще. Всегда есть и прошлый вид на который можно отмотать и новый. А когда-нибудь потом GC, конечно, освободит неиспользуемые блоки старого вида файла, чтобы место не кончилось.

Реальные проблемы для CoW являет именно случай типа СУБД, с мелким inplace патчингом кусочков. В долговременном плане при активной записи это ведет к куче мелких фрагментиков делаемых "сбоку" по всему диску и огромному объему метаданных для описания этого. Поэтому оракл и хотел отключку CoW - для своих баз, они получат in-place представление, cow не будет фрагменты фигачить, а журнал оно себе само и делало по жизни.

> Это может быть в любом случае, нельзя изменить любой файл за один
> write(...) с логом в ФС.

В случае CoW все иначе. Старое состояние уже есть, его не надо делать и на него можно вернуться, просто игноря вон те изменения. Write() записывает блоки куда-то в сторону - и не портит старое состояние. Если все это получилось, метаданные апдейтятся чтобы указывать уже на новые блоки (это быстро). Конкретно btrfs делает этот номер еще и с самими метаданными, поэтому в нем то же самое касается и метаданных. В случае краха достаточно забить на свежезаписанные куски - и ВНЕЗАПНО получается предыдущее состояние и данных и метаданных. Логически корректное. А то что это журналинг с совсем другого бока - ух ты, а так можно было.

Ответить | Правка | Наверх | Cообщить модератору

246. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от all_glory_to_the_hypnotoad (ok), 30-Май-20, 16:14 
Не мог бы. Даже для такого варианта в ФС нужно заводить какой-нибудь теневой inode для удержания нового состояния, но в отличие от файла для работы с 'тенью' нужны отельные сущности внутри ФС и API. Хватит графоманить.

Ответить | Правка | Наверх | Cообщить модератору

226. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от пох. (?), 29-Май-20, 16:11 
> На CoW получить старое состояние файла в случае "не прокатило"

вопрос что такое старое состояние в случае
begin; set sum=sum-b where id='c'; set sum=sum+b where id='d'; commit; выполнившегося примерно на 2/3. И не останешься ли ты при этом без денег, при том что d их так и не получил.

fs при этом консистентна, предположим. Файл читается (то есть внутри не появилась пачка нулей просто так, потому что блок распределили а записать его не успели - это вот то от чего гарантирует CoW и не помогает журнал только метаданных). Просто вторая операция недовыполнилась и CoW остановилась на полдороге.

> Если журналить данные - можно либо завершить ту запись,

fs ничего не знает о "той" или "не той".
Вот сколько в том примере выше записей? Без знания структуры файла и насколько далеко в нем лежат нужные куски? Правильный ответ - а хз! fs можно что-то подсказать только сделав fsync - но это медленно.

> Есть только 1 нюанс: писать данные сперва в журнал, потом в основную область означает ДВЕ
> записи данных.

да. Причем первая запись еще и синхронная, с ожиданием подтверждения. И любая обеспечивающая транзакционную целостность субд - так и делает. double write, fsync. CoW в ней при этом может и не быть, данные могут заменяться in-place, индексы могут при крэше портиться и требовать хитрых процедур восстановления, но вот лог транзакции сохраняется целиком и она не подтвердится пока не будет сохранена.

А для fs это просто lseek/write/lseek/write - и она не знает, это одна транзакция или две разные.
Или половина одной, и сейчас еще два таких приедут. Вообще в другой файл, потому что у нас sharding ;-)

> Думаю что они не полностью корректно смогли изобразить файлухой журнал.

там идея что оно при нормальной эксплуатации глючит. Без крэшей - просто данные портятся. А хз почему. Вероятнее всего проблема где-то в mysql, этот режим работы просто никто не тестирует.

Поэтому идея sqlite с rename (который почти всегда атомарный) на самом деле не так уж ужасно плоха, пока записей не слишком много. Гарантированно работает в любой системе вплоть до msdos.


Ответить | Правка | К родителю #218 | Наверх | Cообщить модератору

238. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от Аноним (215), 30-Май-20, 10:08 
> begin; set sum=sum-b where id='c'; set sum=sum+b where id='d'; commit; выполнившегося примерно

По логике вещей: старое состояние - то что было до begin. Новое - то что должно стать после commit. Если удалось закрыть commit - все получают что прописано. Если не удалось, все возвращается в вид как было до этого - и должно быть переделано еще раз на других уровнях. В этом вроде бы весь пойнт транзакционной модели - и само по себе это может быть уложено в логику CoW. Другое дело что не факт что general purpose CoW будет сильно оптимален для конкретного кейса в вон той СУБД, но вообще, вывесить семантику CoW юзермоду более явно таки напрашивается, а дальше пусть они сами смотрят, ОК им оно или все-же свой самопал лучше.

> fs при этом консистентна, предположим. Файл читается (то есть внутри не появилась
> пачка нулей просто так, потому что блок распределили а записать его
> не успели - это вот то от чего гарантирует CoW

CoW сам по себе может гарантировать, что либо тот write завершен полностью как задумано, либо откачен целиком как будто его никогда не было. А так что он на середине встрял и в этот момент все фигакнулось - в CoW по логике при нормальной реализации исключено. А в ext4 без полного журнала есть файл где write дошел до середины, все упало - и после краха у ФС нет данных ни чтобы обломаную запись откатить, ни чтобы ее доделать. На то и журнал только метаданных. Оно при этом логически консистентно по описанию файла в метаданных, но содержимое файла некорректное и программы совершенно не обязаны его понять. Удачи декодировать жыпег состоящий из старой и новой половинки. Скорее всего получишь характерный вид: полфоты + инопланетный пейзаж на второй половине, или даже "decode error".

> и не помогает журнал только метаданных).

А при чем тут CoW? Это описание для обычного in-place патчинга.

> Просто вторая операция недовыполнилась и CoW остановилась на полдороге.

Если операций несколько - это уже другой вопрос. А если одна - атомарный подход все же возможен. И вот тут оно не может на полдороги встрять - незавершенная запись будет просто отброшена. И наверное лучше получить либо старый, либо новый жыпег, а не похабное нечто с половиной нового и трэшом от decode error в второй половине.

> fs ничего не знает о "той" или "не той".

Почему, для 1 сискола - знает. А если программа делала 20 сисколов ... эм... чего я там говорил про API для вывешивания CoW семантики? Ну, в общем, логично было бы вывесить им условные "transaction_begin()" и "transaction_commit()" чтобы они не изобретали подобные велики через задний проход с дикими костылями. На CoW это можно нормально сделать.

> fs можно что-то подсказать только сделав fsync - но это медленно.

Это сравнительно медленно, НО гарантирует целостность. А все это + записать 2 раза, в журнал и основную область крупные объемы еще медленнее.

> да. Причем первая запись еще и синхронная, с ожиданием подтверждения.

Абстракция такая.

> И любая обеспечивающая транзакционную целостность субд - так и делает.

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

> восстановления, но вот лог транзакции сохраняется целиком и она не подтвердится
> пока не будет сохранена.

Смотря кто и что понимает под "логом транзакции". Формальное намерение чего хотели сделать - одно. Все перетряхиваемые "блоки" (rows, columns, ...) - совсем другое. У CoW техник их плюс в том что не надо париться насчет старого состояния, оно остается "нахаляву" и на него можно вернуться. А вот если это in place, там уже про халяву речь не пойдет, придется явно писать undo для всего что вообще затронуто. Ну или как это откатывать, just in case?

> А для fs это просто lseek/write/lseek/write - и она не знает, это
> одна транзакция или две разные.

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

Ну то-есть, пакетный манагер мог бы как-то так:
transaction_begin();
write(file1);
write(file2);
write(file3);
transaction_commit();

...и при этом у нас либо система с старым пакетом, либо система с новым пакетом, но никогда не система с полураспакованным пакетом. В принципе, снапшотами + хуками пакетника даже можно изобразить такую семантику. Но нативный апи в ос был бы определенно надежнее, быстрее и лучше чем самопальные костыли.

> этот режим работы просто никто не тестирует.

Вполне вероятно. Потому что по состоянию на сейчас это как-то довольно экзотично звучит.

> Поэтому идея sqlite с rename (который почти всегда атомарный) на самом деле
> не так уж ужасно плоха,

Да это не только их идея. Так вроде даже transmission файло пишет. Потому что юзеры заколебали "вай-вай, статус торента профакался при крахе!!!111". Однако сие приводит к куче журнальной логики и костылей в каждой уважающей себя апликухе и странным результатам у тех кому было впадлу столько чудес самим кодить или они просто не парились.

> Гарантированно работает в любой системе вплоть до msdos.

А также гарантирует дофейхоа побочного кода не относящегося в общем то к делу. Это сойдет для СУБД, но когда этим начинает заниматься даже качалка торентов или офисный пакет - это, наверное, уже перебор и по хорошему надо выкинуть скелеты из шкафов пересмотреть семантику операций.

Ответить | Правка | Наверх | Cообщить модератору

243. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от пох. (?), 30-Май-20, 12:21 
> По логике вещей: старое состояние - то что было до begin. Новое - то что должно стать после
> commit. Если удалось закрыть commit

проблема в том, что файловая система про это ничего не знает. Для нее (если бд просто косплеит sed, не добавляя собственные костыли и подпорки) это два последовательных write в разные места файла. (или двух разных, это тоже неизвестно)
Она не знает - будет за ними еще третий или четвертый, отдельны они от тех или их надо выполнять все сразу. Может только подождать их, на всякий случай, задержав операцию - если только специально не мешать.
Она может их переупорядочить, записав сначала второй потому что уже работала с соседним сектором по другой задаче.

Ни cow, ни журнал тут не помогут - они работают на уровне блоков.

Для "обычной" работы с файлами на это можно наплевать, просто гарантировать консистентность fs (не файла) при любых условиях, и файла - после подтвержденного закрытия или при работе в append-only mode. (если мы потеряли или повредили редактируемый файл - это то чего и следовало ожидать, ничего страшного в этом нет) Но для БД это фатально.

Единственный вариант - выносить транзакции на уровень fs. Но в posix такого не предусмотрено.

Ответить | Правка | Наверх | Cообщить модератору

250. "В Reiser5 анонсирована поддержка Burst Buffers (Data Tiering..."  +/
Сообщение от Аноним (250), 30-Май-20, 22:58 
> проблема в том, что файловая система про это ничего не знает.

Ну вот я не вижу причин по которым нельзя было бы информировать ее немного больше - сделав апи за пределами классического, под семантику CoW. Ну и я не понимаю переклин на БД. У них в конечном итоге свой журнал есть. Однако требовать от каждой программы того же самого все же бред.

> Ни cow, ни журнал тут не помогут - они работают на уровне блоков.

В конечном итоге все работает на уровне блоков. По другому блочные устройства просто не понимают.

> повредили редактируемый файл - это то чего и следовало ожидать, ничего
> страшного в этом нет)

Ага, только он читаться чего доброго перестанет если программа не вкостылила явно "safe rewrite" с переименованием.

> Единственный вариант - выносить транзакции на уровень fs. Но в posix такого
> не предусмотрено.

Ну да. Однако на cow семантика позволяющая его юзать для чего-то такого - напрашивается.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру