2.1 База данных FLAIM

В качестве базы данных в eDirectory используется FLAIM. FLAIM (Flexible Adaptable Information Manager, гибкий адаптивный менеджер информации) используется для работы с обычной, меняющейся и сложной информацией. Это масштабируемое в широком диапазоне ядро базы данных поддерживает модель параллелизма нескольких модулей чтения и одного модуля записи. Модели чтения не блокируют модули записи и наоборот.

Данные во FLAIM физически организованы в блоки. Некоторые блоки, как правило, хранятся в памяти. Они представляют кэш блоков. Кэш элементов (который иногда называется кэш записей) принимает логические записи из базы данных. Записи составляются из элементов в кэше блоков. FLAIM поддерживает хэш-таблицы для обоих кэшей. Размер кэшированного хранилища периодически меняется в зависимости от количества элементов.

По умолчанию в eDirectory используются блоки размером 4 КБ. Размер кэша блоков для кэширования всей базы данных каталога (DIB) эквивалентен размеру DIB; размер, необходимый для кэша элементов, превышает размер DIB в два-четыре раза.

При извлечении элемента FLAIM сначала проверяет его наличие в кэше элементов. Если запись существует, выполнять чтение из кэша блоков необязательно. При извлечении блока с диска FLAIM сначала проверяет его наличие в кэше. Если блок существует, выполнять операцию чтения с диска не обязательно.

При добавлении или изменении записи соответствующие блоки этой записи не передаются непосредственно на диск, поэтому диск и память могут быть не синхронизированы. Однако обновления, внесенные в элемент, записываются в журнал прокрутки вперед (RFL, roll-forward log). RFL используется для восстановления транзакций после сбоя системы.

Наиболее давно использовавшийся (LRU, Least Recently Used) — это алгоритм замены, который используется для замены элементов в кэше.

2.1.1 Контрольная точка

Контрольная точка переносит дисковую версию базы данных в то же самое когерентное состояние, в котором находится база данных в памяти (кэшированная). FLAIM может выполнять контрольную точку при минимальных операциях обновления базы данных. Оно выполняется каждую секунду и записывает «грязные» блоки («грязный» кэш) на диск. «Грязными» называются те блоки, которые изменены в кэш-памяти, но еще не записаны на диск. FLAIM блокирует базу данных и выполняет максимально возможный объем работы до завершения контрольной точки или того момента, когда другой поток будет ожидать возможности обновить базу данных. Чтобы не допустить слишком существенный отход базы данных от синхронизированного состояния, есть ряд указанных ниже условий, при выполнении которых принудительно выполняется контрольная точка, даже если потоки ожидают обновления базы данных:

  • Если потоку контрольной точки не удается выполнить контрольную точку в пределах указанного временного интервала (по умолчанию задано 3 минуты), она выполняется принудительно. При этом «грязный» кэш очищается.

  • Если размер «грязного» кэша больше указанного в параметре maxdirtycache (если задан), контрольная точка принудительно сокращает размер «грязного» кэша до указанного в параметре mindirtycache (если задан) или до нуля.

2.1.2 Индексы

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

В eDirectory определен набор индексов по умолчанию для атрибутов системы (полей). Системные атрибуты, такие как parentID и ancestorID, используются для одноуровневого поиска и поиска на уровне поддерева. Эти индексы не подлежат отмене или удалению. Они внутренне используются каталогом. Индексы по умолчанию определены для таких атрибутов, как CN, Surname, Given Name и т. д. По своим типам индексы подразделяются на индексы наличия, значения и подстроки. Действие этих индексов можно прекратить. При удалении они заново автоматически создаются.

Для создания индексов можно воспользоваться iManager или утилитой ndsindex для работы по протоколу LDAP (Lightweight Directory Access Protocol). Особенности того или иного индекса зависят от конкретного сервера.

Включив тег Storage Manager (StrMan) в DSTrace (ndstrace), можно просматривать индекс, выбранный для поисковых запросов.

Ниже приведен пример поиска на уровне поддерева для журнала DSTrace с использованием "cn=admin", CN.

3019918240 StrMan: Iter #b239c18 query ((Flags&1)==1) && ((CN$217A$.Flags&8=="admin") && (AncestorID==32821))
3019918240 StrMan: Iter #b239c18 index = CN$IX$220

Ниже приведен пример поиска на уровне поддерева для журнала DSTrace с использованием "Description= This is for testing", AncestorID.

2902035360 StrMan: Iter #83075b0 query ((Flags&1)==1) && ((Description$225A$.Flags&8=="This is for testing") && (AncestorID==32821))
2902035360 StrMan: Iter #83075b0 index = AncestorID_IX

2.1.3 Журнал прокрутки вперед

FLAIM записывают операции для каждой транзакции обновления в файле журнала прокрутки вперед (RFL). RFL используется для восстановления транзакций после сбоя системы или при восстановлении из резервной копии. Файл RFL усекается по завершении выполнения каждой контрольной точки, если он не включен в параметре (rflkeepfiles) путем использования «горячего» непрерывного резервного копирования.