Где живут ваши данные: глубокое погружение в системы хранения от ленты до SSD
Разберёмся, чем они отличаются, почему ленту до сих пор закупают здравоохранение и государство, и где у SSD прячется главная проблема, способная незаметно сократить срок жизни диска.
Зачем вообще делить память на типы
Носители делятся на энергозависимые и энергонезависимые. К энергозависимым относятся регистры CPU, оперативная память и распределённые кеши вроде Redis. Они быстрые на чтение и запись, но теряют состояние при отключении питания (да, у Redis есть append-only persistence, но это история про другое). Энергонезависимые носители работают медленнее, но хранят данные сколь угодно долго.
Внутри энергонезависимых исторически выделяют три поколения: ленточные накопители, вращающиеся диски HDD и твердотельные SSD.
Лента: динозавр, который пережил всех
Ленточные накопители появились в 1950-х и за десятилетия не сильно изменились в основах. Внутри картриджа находится длинная магнитная лента с дорожками, на которых байты записываются через смену магнитной поляризации ячеек. Точнее, единицу или ноль кодирует переход между двумя соседними ячейками. Последовательность бит складывается в страницу данных, обычно 4 или 8 килобайт.
Чтение и запись идут через головку, к которой моторы подматывают ленту с двух сторон. Когда нужная ячейка близко к головке, всё быстро. Когда далеко, лента ползёт по всей длине до нужного места. Моторы перематывают сотни дюймов в секунду, но для современных задач это всё равно медленно.
Зато с последовательным доступом лента невероятно эффективна. Биты лежат друг за другом, как элементы массива в памяти, и сплошное чтение идёт почти на полной скорости. Поэтому лента до сих пор живёт в архивах: больницы, госструктуры и тот же YouTube хранят на ней холодные данные, которые годами никто не запрашивает. Старые видео пятнадцатилетней давности с большой вероятностью лежат именно на ленте, просто потому что это копеечная стоимость гигабайта.
HDD: основа дата-центров уже несколько десятков лет
В жёстких дисках вместо ленты крутятся металлические пластины-платтеры. Данные пишутся в концентрические дорожки, и чтобы прочитать конкретный блок, головка перемещается на нужную дорожку, а пластина доворачивается так, чтобы под головкой оказался нужный сектор. Иерархия выглядит как платтер, дорожка, сектор (страница), внутри сектора лежат 4 или 8 килобайт.
Если представить ленту прямой полосой, то HDD это та же лента, свёрнутая в круг. Только теперь головка может прыгать между дорожками, что даёт случайный доступ. Платтер обычно вращается на 7200 оборотах в минуту, латентность около 1 до 3 миллисекунд.
На последовательных операциях HDD ведёт себя бодро: головка не дёргается, платтер крутится в нужном ритме. А вот случайные чтения и записи бьют по двум показателям: время позиционирования головки (seek time) и время ожидания нужного сектора (rotational latency). Контроллер пытается сгладить ситуацию через очередь команд: он переупорядочивает запросы так, чтобы за минимум перемещений головки и поворотов пластины обработать максимум секторов.
Из-за механики у HDD есть и слабые места. Удары, вибрация, перегрев, износ моторов и контроллера. Поэтому в продакшене диски почти всегда собирают в RAID-массивы, чтобы отказ одного устройства не уносил данные с собой.
Тем не менее именно HDD остаются самым массовым носителем по соотношению цены и объёма. На них держатся data lake, бэкапы и холодные тиры в облаках.
SSD: электроника вместо механики
Твердотельные накопители придумали ещё в 1980-х, но в массовый продакшен они пришли только в последние пятнадцать лет. Раньше им мешала цена и весь окружающий стек, заточенный под HDD. Сейчас SSD доминируют в современных базах данных и серверных нагрузках.
Главное отличие SSD в отсутствии движущихся частей. Чтение и запись делает электроника, в основе которой лежит NAND Flash. Иерархия такая: каждый модуль NAND это target, внутри него блоки, в блоках страницы. Контроллер управляет операциями, а в некоторых SSD есть отдельная DRAM, в которой хранится таблица маппинга и которая заметно ускоряет работу.
Контроллер общается с каждым target через отдельную линию, которая называется trace. По одной линии в один момент времени может идти операция только с одной страницей. Отсюда вылезают две вещи, ради которых разработчики БД и ФС теряют сон: параллелизм и сборка мусора.
Параллелизм работает, когда операции распределены по разным линиям и разным страницам. Тогда трассы пашут независимо, как параллельные дороги с разным трафиком. Если же запросы постоянно бьют в одну линию или одну и ту же страницу, всё выстраивается в очередь, остальные линии простаивают, и общая производительность проседает. Поэтому инженеры, проектирующие базы и файловые системы, аккуратно раскладывают данные так, чтобы максимально размазать нагрузку по target.
Сборка мусора связана с тем, что минимальная единица записи это страница, и перезаписать её поверх существующих данных нельзя. Сначала надо очистить, причём очистка возможна только целым блоком, а не отдельной страницей. Когда свободных страниц для записи не хватает, в дело вступает Garbage Collector: он помечает страницы как грязные, стирает блок целиком, а затем пишет новые данные на освободившееся место.
Эта чистка ощутимо бьёт по производительности, но даже с ней SSD остаются быстрее HDD в подавляющем большинстве сценариев.
Тёмная сторона SSD: Write Amplification
Каждая сборка мусора заставляет SSD делать лишние перезаписи внутренних данных. Это явление называют Write Amplification. Коэффициент WAF показывает, сколько физических записей приходится на одну логическую. В идеале он равен единице, но на почти заполненных дисках уходит сильно выше.
Производители борются с этим over-provisioning (часть памяти зарезервирована и пользователю не видна), оптимизацией контроллера и командами вроде TRIM, которые заранее сообщают накопителю, какие данные можно считать удалёнными. Высокий WAF, кстати, главная причина того, что случайные записи изнашивают SSD сильнее, чем последовательные.
Что выбрать
Если коротко, лента это копеечный архив холодных данных, HDD это рабочая лошадка для дешёвого массового хранения, SSD это скорость для всего, где транзакции должны проходить быстро. Оперативная память и кеши процессора в 500 раз быстрее SSD по чтению и записи, но загрузить туда всё нельзя ни по объёму, ни по бюджету.
Понимание того, как именно лежат ваши данные, экономит часы дебага, спасает от странных деградаций производительности и помогает осмысленно выбирать инфраструктуру под конкретную задачу.
Полезные ссылки:
https://planetscale.com/blog/io-devices-and-latency
http://thessdguy.com/what-is-write-amplification/
https://computer.howstuffworks.com/hard-disk.htm