Открыть сервис

Последовательная запись

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

Принцип работы

Последовательная запись (англ. append-only или sequential write) противопоставляется произвольной записи (random write), когда данные могут быть записаны в любую область носителя. При последовательной записи все операции ввода-вывода выполняются линейно: файл или устройство расширяется только в одном направлении. Это исключает необходимость поиска свободных блоков, фрагментацию и перезапись существующих данных.

Технически последовательная запись реализуется через:

  • Аппаратный уровень — специальные устройства (ленточные накопители, магнитооптические диски, твердотельные накопители с поддержкой ZNS), где физическая структура носителя требует линейного размещения.
  • Программный уровеньфайловые системы (например, Log-structured File System, LFS), базы данных (Apache Kafka, Apache Cassandra) и протоколы (например, WAL — Write-Ahead Logging), которые эмулируют последовательную запись на обычных носителях.

История

Концепция последовательной записи восходит к первым магнитным лентам, которые использовались в компьютерах 1950-х годов. Ленточные накопители (например, IBM 726) физически не могли выполнять произвольную запись — данные наносились на ленту последовательно, и для изменения записи требовалась перезапись всей ленты. Этот принцип сохранился в современных LTO-лентах (Linear Tape-Open), где последовательная запись остаётся основным режимом.

В 1970-х годах с развитием дисковых накопителей (HDD) произвольная запись стала доминирующей, но последовательная запись сохранилась в системах журналирования и логов. В 1980-х годах появились лог-структурированные файловые системы (LFS, предложенные Джоном Остерхаутом и Менделем Розенблюмом), которые преднамеренно превращали произвольную запись в последовательную для повышения производительности.

В 2010-х годах с ростом объёмов данных и требований к аудиту последовательная запись получила второе дыхание в архитектурах потоковой обработки (Apache Kafka, Amazon Kinesis) и блокчейн-технологиях, где неизменяемость данных является критической.

Классификация

По типу носителя

  1. Аппаратная последовательная запись — реализуется на физическом уровне носителя:
  • Магнитные ленты (LTO, IBM 3592)
  • Оптические диски с однократной записью (CD-R, DVD-R, BD-R)
  • Твердотельные накопители с поддержкой ZNS (Zoned Namespaces)
  • Некоторые типы энергонезависимой памяти (SMR-диски в режиме sequential)
  1. Программная последовательная запись — эмулируется на уровне файловой системы или приложения:

По назначению

  1. Журнальные системы — запись операций для восстановления после сбоев (WAL, redo/undo logs).
  2. Аудиторские системы — неизменяемые логи для соответствия требованиям (SOC 2, GDPR, 152-ФЗ).
  3. Потоковые системы — обработка непрерывных потоков данных (Kafka, RabbitMQ).
  4. Архивные системы — долговременное хранение с гарантией неизменности (ленточные библиотеки, WORM-носители).

Применение

Базы данных и журналирование

В системах управления базами данных (СУБД) последовательная запись используется в механизме Write-Ahead Logging (WAL). Перед изменением данных в основной таблице запись о транзакции фиксируется в журнале, который растёт только в конец. Это позволяет восстанавливать базу данных после сбоя без потери данных. Например, в PostgreSQL WAL-файлы имеют строго последовательную структуру, а их размер ограничен, после чего создаётся новый файл.

Потоковая обработка

Apache Kafka, одна из самых популярных платформ потоковой обработки, построена на принципе последовательной записи. Сообщения в топиках Kafka хранятся в виде логов, которые только дописываются. Это обеспечивает высокую пропускную способность (до миллионов сообщений в секунду) и низкую задержку. Kafka использует последовательную запись на диски, что минимизирует перемещение головок HDD и уменьшает износ SSD.

Блокчейн

В блокчейн-технологиях последовательная запись является фундаментальным принципом. Каждый новый блок добавляется в конец цепочки, и изменение предыдущих блоков невозможно без нарушения консенсуса. В блокчейне Bitcoin (криптовалюта, не запрещена в РФ, но её использование регулируется) последовательная запись обеспечивает неизменность истории транзакций, что является основой доверия к системе.

Системы аудита и соответствия

Многие регуляторные требования (например, 152-ФЗ «О персональных данных» в РФ, SOX в США) предписывают неизменяемость журналов доступа. Системы класса SIEM (Security Information and Event Management) используют последовательную запись для хранения событий безопасности. Пример — система Auditd в Linux, где логи записываются в файл /var/log/audit/audit.log строго последовательно.

Файловые системы

Лог-структурированные файловые системы (LFS) преобразуют произвольные записи в последовательные. Вместо обновления метаданных на месте, LFS записывает все изменения в конец лога, а затем обновляет указатели. Это уменьшает фрагментацию и повышает производительность на HDD и SSD. Примеры: F2FS (Flash-Friendly File System) для флеш-памяти, ZFS с поддержкой ZIL (ZFS Intent Log).

Преимущества и недостатки

Преимущества

  • Высокая производительность — последовательная запись на HDD и SSD значительно быстрее произвольной (до 10-100 раз), так как не требует поиска секторов или страниц.
  • Неизменяемость данных — исключает случайное или злонамеренное изменение истории, что критично для аудита и блокчейна.
  • Устойчивость к сбоям — при внезапном отключении питания данные в конце лога могут быть потеряны, но ранее записанные остаются неповреждёнными.
  • Простота реализации — не требуется сложных алгоритмов управления свободным пространством и фрагментацией.

Недостатки

  • Рост объёма — данные никогда не удаляются, что требует механизмов сжатия (compaction) или ротации логов.
  • Задержка чтения — для доступа к произвольной записи может потребоваться сканирование всего лога (хотя индексация частично решает эту проблему).
  • Ограниченная применимость — не подходит для систем, где требуется частое обновление небольших объёмов данных (например, OLTP-базы данных).
  • Износ SSD — постоянная запись в одну область может привести к преждевременному износу ячеек, если не использовать выравнивание износа (wear leveling).

Технические особенности

На HDD

На жёстких дисках последовательная запись использует преимущество вращения шпинделя. Головка чтения/записи остаётся на одной дорожке, и данные записываются непрерывно. Скорость последовательной записи на современных HDD достигает 200-250 МБ/с, тогда как произвольная запись (4K блоки) — 1-2 МБ/с.

На SSD

На твердотельных накопителях последовательная запись также эффективнее произвольной, но разница менее выражена (до 5-10 раз). Однако SSD имеют ограниченное количество циклов записи (P/E cycles). Последовательная запись может ускорить износ, если не использовать TRIM и выравнивание износа. Технология Zoned Namespaces (ZNS) позволяет SSD работать в режиме строгой последовательной записи, что улучшает производительность и долговечность.

На ленточных накопителях

Магнитные ленты (LTO-9, 18 ТБ сжатых данных) поддерживают только последовательную запись. Для изменения данных требуется перезапись всей ленты. Это делает ленты идеальными для архивного хранения, но непригодными для оперативных систем.

Примеры реализации

Apache Kafka

Kafka хранит сообщения в топиках, которые разделены на партиции. Каждая партиция — это последовательный лог, где новые сообщения добавляются в конец. Kafka использует сегментирование: когда текущий сегмент достигает заданного размера (например, 1 ГБ), создаётся новый. Старые сегменты могут быть удалены или сжаты по времени или размеру.

PostgreSQL WAL

PostgreSQL записывает все изменения в WAL-файлы, которые располагаются в каталоге pg_wal. Каждый файл имеет фиксированный размер (16 МБ по умолчанию). После заполнения файла создаётся следующий. WAL-файлы могут быть архивированы для восстановления на момент времени (PITR).

Блокчейн Ethereum

В блокчейне Ethereum (криптовалюта, не запрещена в РФ, но её использование регулируется) каждый новый блок добавляется в конец цепочки. Данные блоков хранятся в виде последовательных записей в базе данных LevelDB или RocksDB, которые также используют принцип append-only.

Критика и ограничения

Последовательная запись критикуется за неэффективное использование пространства в системах с частыми обновлениями. Например, в базах данных OLTP (Online Transaction Processing) постоянное дописывание журналов может привести к быстрому росту объёма данных, требующему частого сжатия (compaction). В Apache Kafka compaction может быть ресурсоёмким и влиять на производительность.

Кроме того, последовательная запись не решает проблему «мусора» — удалённые данные остаются на носителе до тех пор, пока не будут перезаписаны. В системах с жёсткими требованиями к конфиденциальности (например, при удалении персональных данных по 152-ФЗ) это может быть проблемой, так как физическое удаление данных невозможно без полной перезаписи носителя.

Источники

  1. Остерхаут Дж., Розенблюм М. «The Design and Implementation of a Log-Structured File System» (1991).
  2. Документация Apache Kafka: «Log Compaction» (Confluent, 2023).
  3. Документация PostgreSQL: «Write-Ahead Logging (WAL)» (The PostgreSQL Global Development Group, 2024).
  4. Техническая спецификация LTO-9 (Linear Tape-Open Consortium, 2021).
  5. Стандарт Zoned Namespaces (ZNS) — NVMe 2.0 (NVM Express, Inc., 2022).
  6. Федеральный закон № 152-ФЗ «О персональных данных» (2006, с изменениями).
  7. «Bitcoin: A Peer-to-Peer Electronic Cash System» (Сатоши Накамото, 2008).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →