Как накрякать пользователя?
Разделяют типы записи — sync и async — потому что это баланс между безопасностью и скоростью. Разные задачи требуют разного поведения при записи данных.
О чем я?
Рассказываю -
Это как: тормоза и газ
Sync — это «с тормозом» — безопасно, но медленно.
Async — «без тормоза» — быстро, но рискованно.
Synchronous (sync) запись — это когда данные записываются на диск сразу, и операция считается завершённой только после физической записи данных.
Безопасно: данные точно сохранены.
Медленно: ждем подтверждения от диска.
Asynchronous (async) запись — это когда система не ждёт, пока данные запишутся на диск.
Быстро: данные просто кладутся в кэш.
Опасно: при сбое (например, отключении питания) данные могут потеряться.
Зачем нужно это разделение?
1. Чтобы обеспечить надёжность там, где она критична
Sync-запись используется, когда нельзя терять даже 1 байт данных:
- Базы данных (PostgreSQL, Oracle)
- Платёжные системы
- Банки
- Почтовые серверы
Почему? Потому что если отключится питание — данные уже точно на диске. Потерь не будет.
2. Чтобы ускорить работу там, где потеря не страшна
Async-запись даёт высокую производительность, потому что система не ждёт завершения физической записи:
- Логи, временные файлы
- Файлы браузера, кэш
- Сервисы потоковой обработки
- Тестовые среды
Тут потеря пары секунд данных — не критично.
3. Гибкость
Некоторые приложения сами указывают, хотят они sync или async. А системный администратор может принудительно указать поведение ZFS (через sync=always или sync=disabled), в зависимости от задачи.
Не понял ? Давай проще!
Что такое sync и async запись:
Sync (синхронная) запись — данные записываются сразу на диск. Программа ждёт подтверждения, что данные реально записались.
Гарантия сохранности
Медленнее
Async (асинхронная) запись — данные сначала пишутся во временный кэш в памяти, а уже потом — на диск. Программа не ждёт подтверждения записи.
Быстрее
Риск потери данных при сбое (например, если вырубится свет)
Почему разделяют:
Для баланса между скоростью и надёжностью.
Например, лог-файлы можно писать async — если что, не страшно потерять пару строк.
А базу данных — лучше sync, иначе можно потерять важную информацию.
Чтобы настроить поведение под конкретную задачу.
ZFS (и другие системы) позволяют указать, какие данные писать синхронно, а какие — нет.
Когда отключается система (например, происходит сбой питания), разница между synchronous (sync) и asynchronous (async) записями становится критически важной:
Sync-запись (синхронная):
Данные записываются сразу на диск (или в журнал ZFS), и только после этого операция считается завершённой.
Что будет при отключении питания?
Данные не потеряются.
Всё, что было подтверждено как записанное, уже физически находится на диске.
Async-запись (асинхронная):
Данные сначала попадают в оперативную память (кеш) и только потом (через некоторое время или по расписанию) записываются на диск.
Что будет при отключении питания?
Потеря данных возможна.
Всё, что было в кеше и не успело записаться на диск, пропадёт.
Зачем это разделяют?
- Async-запись быстрее, но менее надёжна.
- Sync-запись медленнее, но гарантирует сохранность данных даже при сбое.
Пример:
Ты сохраняешь файл в текстовом редакторе:
- Sync: Редактор ждёт, пока файл реально запишется на диск.
- Async: Редактор считает, что всё ок, даже если файл пока только в памяти. При внезапной перезагрузке — файл может быть пустой или не до конца сохранён.
Что будет при отключении питания (или отказе системы):
Разберём на примере:
Synchronous запись (sync):
Данные записываются в кэш + на диск (или в ZFS — в ZIL / SLOG), и только после этого программа получает «ОК».
Если питание пропало — данные не теряются, потому что они уже на носителе (или в надёжной журналируемой области).
Sync важен для баз данных, логов и других систем, где потеря последних операций недопустима.
Asynchronous запись (async):
Данные сначала пишутся только в кэш (оперативную память).
Система сообщает, что «всё записано» — ещё до фактической записи на диск.
Если питание отключается до сброса кэша — эти данные теряются.
Async используется там, где важна скорость, и потеря пары последних секунд данных не критична (например, для временных данных или кэшей).
Видели в ТЗ требования - БАТАРЕЙКА? ВОТ ЗАЧЕМ!
Если в системе хранения данных (СХД) есть батарея (BBU – Battery Backup Unit) или энергозависимая кэш-память с защитой (например, с суперконденсатором), то это существенно влияет на поведение Synchronous (sync) и Asynchronous (async) записи, особенно при синхронной записи.
В чём суть?
Когда данные записываются синхронно (sync), приложение ждёт подтверждения, что данные реально записаны на диск, прежде чем продолжить.
Без батареи это означает, что данные должны физически попасть на диск, что медленно.
Но если у контроллера есть защищённый кэш с батареей, то:
Данные попадают в кэш, а не на диск напрямую.
Батарея гарантирует, что данные из кэша не потеряются при отключении питания (будут сброшены на диск при следующем запуске).
Поэтому синхронная запись становится быстрой, как асинхронная, но с безопасностью sync.
Пример:
Без батареи: sync-запись медленная, потому что ждёт диск.
С батареей: sync-запись быстрая, потому что пишет в надёжный кэш.
Вывод:
СХД с батареей нивелирует разницу по производительности между sync и async-записью, при этом сохраняется надёжность sync. Именно поэтому во многих продвинутых СХД всегда есть BBU/SCU (supercapacitor unit) — чтобы не жертвовать производительностью ради надёжности.
Ты конечно же давно знаком с этими технологиями - где? Контроллер сервера брат! А там на выбор всегда что?
Батарейка + кеш или ….. энергонезависимый флеш)
Ты угадал брат, использование энергонезависимого кэша (например, на базе NVDIMM, Intel Optane, Z-SSD, или NVMe с суперконденсатором) — это альтернатива батарее, которая обеспечивает безопасность асинхронной записи.
Что такое энергонезависимый кэш?
Это кэш, в котором данные сохраняются даже при потере питания. Он сочетает скорость ОЗУ с надёжностью энергонезависимой памяти.
Контекст: зачем он нужен
При асинхронной записи (async), данные записываются в кэш (в ОЗУ), и ОС/ФС считает их уже записанными, не дожидаясь записи на диск. Это быстрее, но если питание пропадёт, данные в ОЗУ исчезнут.
Чтобы избежать потерь:
В классических системах используют батарею (BBU — Battery Backup Unit) или суперконденсатор (SC).
В современных — энергонезависимый кэш (например, NVDIMM, где кэш в момент сбоя сливается в NAND).
Преимущества энергонезависимого кэша:
- Нет риска потери данных при async-записи, даже без батареи.
- Не нужно переключаться на sync-запись (медленную, но безопасную).
- Нет необходимости в обслуживании батарей (которые изнашиваются).
- Можно безопасно использовать zfs set sync=disabled, если кэш защищён.
Примеры решений:
- ZFS + slog на Optane — популярная связка.
- Контроллеры с nv-cache (например, у Dell, HPE).
- NVDIMM-N — RAM с резервным питанием и NAND внутри
Надеюсь тебе было не сложно!
Потому что ТОНКИХ НАСТРОЕК В СХД - еще на много статей))))