Безудержное нарушение принципа многоуровневости?

Эндрю Мортон лихо назвал ZFS "безудержным нарушением принципа многоуровневости", поскольку она она объединяет в себе функциональность файловой системы, менеджера томов и контроллера RAID. Я полагаю, все зависит от значения слова нарушить . При разработке ZFS мы обнаружили, что стандартное разделение на уровни в стеке управления данными приводит к удивительному количеству ненужной сложности и дублированю логики. Мы обнаружили, что путем небольшого рефакторинга -- то есть, изменения того, где проходят границы между уровнями, -- можно сделать всю систему гораздо проще.

Пример из математики послужит отличным прологом.

Предположим, вам нужно подсчитать сумму 1/n(n+1) для n от единицы до бесконечности.

Раскрыв это выражение для каждого слагаемого, мы получим:

        1/(1\*2) + 1/(2\*3) + 1/(3\*4) + 1/(4\*5) + ...

то есть:

        1/2 + 1/6 + 1/12 + 1/20 + ...

К чему сходится этот бесконечный ряд? Это может показаться трудной задачей, но это только потому, что мы неверно смотрим на нее. Если вы достаточно сообразительны, вы, наверное, уже заметили, что каждое слагаемое можно представить по-другому:

        1/n(n+1) = 1/n - 1/(n+1)

Например,

        1/(1\*2) = 1/1 - 1/2
        1/(2\*3) = 1/2 - 1/3
        1/(3\*4) = 1/3 - 1/4

Таким образом, наша сумма примет вид:

        (1/1 - 1/2) + (1/2 - 1/3) + (1/3 - 1/4) + (1/4 - 1/5) + ...

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

        1/1 + (-1/2 + 1/2) + (-1/3 + 1/3) + (-1/4 + 1/4) + ...

или

        1/1 + 0 + 0 + 0 + ...

Другими словами,

        1.

Разве это не здорово?

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

Конечно, системы хранения данных гораздо сложнее этой простой аналогии, но на высоком уровне такая идея вполне применима. Любой стек управления данными можно представлять себе как последовательность преобразований из одной схемы именования в другую - в конечном счете переводящей имя файла в логический адрес блока на диске (LBA - Logical Block Address). Обычно это выглядит следующим образом:

        файловая система(сверху): имя файла   - объект (inode)
        файловая система(снизу):  объект      - LBA тома
        менеджер томов:           LBA тома    - LBA массива
        контроллер RAID:          LBA массива - LBA диска

Рефакторинг этого стека мы собираемся произвести.

Во-первых, отметим, что традиционный уровень файловой системы слишком монолитен. Лучше будет разделить часть, отвечающую за трансляцию "имя файла - объект" (верхняя половина), и часть, отвечающую за трансляцию "объект - LBA тома" (нижняя половина); так мы сможем повторно использовать нижнюю половину кода для поддержки других типов хранилищ данных, например объектов и томов iSCSI, которые не имеют имени файла. Тогда такие классы хранилищ смогут напрямую взаимодействовать с уровнем объектов. Это более эффективно, чем использовать механизм /dev/lofi, который позволяет придать файлу POSIX вид блочного устройства. Но что более важно, это дает возможность использовать новую мощную программную модель -- хранилище объектов -- без дополнительного кода.

Во-вторых, отметим, что уровень LBA тома полностью бесполезен. Добавление уровня косвенности часто увеличивает гибкость, но не в данном случае: это можно сравнить с переводом сначала с английского на французский, а потом с французского на немецкий, в то время как мы легко можем перевести сразу с английского на немецкий. Промежуточный французский не имеет особого значения. Он не виден ни приложениям, ни массиву RAID, и не выполняет никакой административной функции. Это накладные расходы в чистом виде.

Поэтому в ZFS этот уровень вложен. В ZFS есть три четких уровня: ZPL (ZFS POSIX Layer), который обеспечивает стандартную семантику файловой системы POSIX; DMU (Data Management Unit), который обеспечивает многоцелевое транзакционное хранилище объектов; и SPA (Storage Pool Allocator), обеспечивающий манипуляцию блоками виртуального хранилища и преобразование данных (репликацию, сжатие и вскоре шифрование). В целом стек преобразований в ZFS выглядит так:

        ZPL: имя файла - объект
        DMU: объект    - DVA (data virtual address)
        SPA: DVA       - LBA диска
DMU обеспечивает файловый и блочный доступ к общему пулу физических накопителей. Файловый доступ осуществляется через ZPL, блочный доступ (через блочное устройство) представляет собой прямое отображение на один объект DMU. Мы также разрабатываем новые методы доступа к данным, которые используют транзакционные возможности DMU более интересными способами -- но об этом в другой раз.

Архитектура ZFS устраняет целый уровень трансляции -- и вместе с тем целый класс метаданных (LBA тома).  Она также исключает необходимость аппаратных контроллеров RAID.  В то же время, ZFS предоставляет новый полезный интерфейс -- хранилище объектов -- который был до этого недоступен, будучи похоронен внутри монолитной файловой системы.

Я точно не вижу здесь никакого нарушения.  А вы?
Comments:

Post a Comment:
Comments are closed for this entry.
About

bonwick

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
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
   
       
Today