Сетевая модель данных службы каталогов

УДК 519.688

А. В. Андреев

Санкт-Петербургский государственный университет аэрокосмического приборостроения

Сетевая модель данных службы каталогов

Рассматриваются стандартная иерархическая модель данных службы каталогов и сетевая модель данных службы каталогов. В статье предлагается последовательность шагов для перехода от иерархической модели данных к сетевой, а также модифицированный алгоритм поиска наименьшего пути Дейкстры.

Ключевые слова: служба каталогов, иерархическая модель данных, сетевая модель данных, алгоритм Дейкстры.

Введение

Служба каталогов (Directory Service) — средство иерархического представления различных ресурсов и хранения информации об этих ресурсах. В качестве ресурсов выступают материальные ресурсы, персонал, сетевые ресурсы и т. д.

Информация об определенном объекте (ресурсе) хранится как значения атрибутов этого объекта.

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

OpenLDAP — это служба каталогов, которая позволяет нам работать с различными сетевыми ресурсами (пользователями, компьютерами, принтерами, зонами DNS, а также всем, что необходимо вам для работы).

Вся работа осуществляется по протоколу LDAP (англ. Lightweight Directory Access Protocol). Это сетевой протокол для доступа к службе каталогов Х.500, разработанный IETF как облегчённый вариант ITU-T протокола DAP. LDAP — относительно простой протокол, использующий TCP/IP и позволяющий производить операции авторизации (bind), поиска (search) и сравнения (compare), а также операции добавления, изменения или удаления записей.

Любая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем (DN — англ. Distinguished Name). Уникальное имя состоит из одного или нескольких относительных уникальных имен, разделённых запятой. Относительное уникальное имя имеет вид «ИмяАтрибута=значение». На одном уровне каталога не может существовать двух записей с одинаковыми относительными уникальными именами. Для хранения записей OpenLDAP использует базу данных Berkeley DB, но доступны различные модули для хранения данных в других БД.

Структуры хранения данных каталога Стандартная структура хранения данных каталога

Служба каталога, как и большинство каталогов, имеет структуру организации хранения данных в виде ориентированного граф-дерева (рис. 1), где у каждого «родителя» есть один «потомок». Данная структура детально описана в стандарте протокола RFC 4512 и использует иерархическую модель данных.

Такую структуру можно описать графом G = ( V., Е), где V(G) — множество вершин графа V(G) = (vd,vp,vo,..-,Vi), E(G) — множество дуг графа , E(G) = ({vd,vp},{vp,vo},...,{vp,Vi}).

dc=domain

о

о People

uid=squser

uid=smbuser2+squid

uid=user

Рис. 1. Пример стандартного дерева каталога

Вершины обозначаются согласно принадлежности к тину записи:

Vd — вершина корневого элемента de,

vp — вершина-родитель для группы записей (ou=People),

Vi — вершина-потомок для записи в каталоге,например, uid=smbuser,

г — количество записей, г = 1... п.

Поиск записей в таком графе осуществляется по всему дереву службы каталогов, таким образом время поиска каждой записи будет прямо пропорционально зависеть от общего числа записей каталога. Чаще всего при настройке каталога и сервисов взаимодействующих с ним выбирают одну ветку для хранения и поиска записей ou People. В таком случае время ответа на запрос к каталогу будет связан с содержанием ветки ou People, а именно количеством записей в ней. Данная особенность связана со способом хранения и получения информации в Berkeley DB, которая используется по умолчанию в службе каталогов OpenLDAP.

Сетевая модель данных структуры каталога

Современная версия клиентской и серверной частей LDAP, описанная в RFC 4511, позволяет хранить, записывать, осуществлять поиск записи в разных ветках каталога, а сервисам-службам работать с ними. Группируя записи по их общим параметрам (атрибутам и объектным классам, используемым сервисам), можно построить более упорядоченную структуру хранения данных. Более того, отслеживая изменения в активности сервисов, можно организовать адаптивную службу каталогов, меняющую свою структуру в зависимости от динамики запросов к ней.

Но следует учитывать тот факт, что для начальной поддержки работоспособности всех сервисов существует необходимость хранения записей или ссылочных записей («алиасов») в ветке ou People.

Таким образом, можно сформировать новую структуру каталога, использующую уже сетевую модель данных (рис. 2).

Рассмотрим такую структуру хранения данных службы каталогов с корневым элементом de domain, в которой записи сгруппированы но используемым сервисам-службам. С данным каталогом работают два сервиса: файловый сервер (ветка ou Samba) и прокси-сервер (ветка ou Squid). Как видно из рисунка, записи, используемые только одним каким-то сервисом, хранятся в соответствующей ему ветке (ou Samba,de domain и ou Squid,de domain), a для записей, используемых в обоих сервисах, используется специальная запись alias.

dc- domain

alias

uid=smbu ser2 -f-sq и ¡ d

Рис. 2. Предлагаемая структура хранения данных

Предлагаемая структура хранения данных является ориентированным граф-деревом GUÍ = (V,Е"'), где V (GiU) — множество вершин графа V Uí(GUÍ)=(va ,vp ,vo,.. .,Vi ,vao,.. ,,vaj ,voo,..-,vos), E UÍ(GUÍ) — множество дуг графа, дуги которого различны для каждого отдельного каталога, и имеет несколько родительских вершин (ou Samba,ои Squid,alia«) для вершины-потомков (uid smbuser,uid smbuser2+squid,uid squid), где Vd — вершина корневого элемента de, vp — вершина-родитель для группы записей (ou=People), Vi — вершина-потомок для записи в каталоге, например, uid=smbuser, vaj — вершины-ссылки, они же alias, vos — вершины-службы, i — количество записей, i = 1... п, j — количество записей-ссылок, s — количество сервисов, работающих с каталогом.

Методика поиска принадлежности вершин

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

Процесс определения вершин, требующих перестроения в дереве каталога, можно разделить на несколько этапов:

1. определение используемых сервисов;

2. определение важности того или иного сервиса;

3. определение используемых атрибутов и объектных классов;

4. группирование записей но важности сервиса и используемым атрибутам.

Для определения используемых сервисов прежде всего следует определиться с набором ролей сервера. Например, для роли файлового сервера используется сервис samba. Чаще всего используют такое соответствие:

- файловый сервер сервис samba;

- прокси-сервер сервис squid;

- почтовый сервер сервисы postfix и dovecot;

- сервер аутентификации РАМ.

Данное соответствие позволит четко определить вид записей в каталоге. Например:

dn: uid user,ou People,dc example,de com mail: user ©example. com given Name: user

sn: user cn: user user sambaAcctFlags: [UD ] mgrp Deliver To: user objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetorgperson objectClass: posixAccount objectClass: mailgroup objectClass: sambaSamAccount uidNumber: 10022 gidNumber: 10022 homeDirectorv: /home/user loginShell: /bin/bash

sambaSID: S-1-5-21-2098741869-3465982337-3637863451-10022 sambaNTPassword: EE42945FD699570D2DA4C2A0BE29D3B5 sambaLMPassword: 8131BC5135B26C62C81667E9D738C5D9

sambaPasswordHistorv: 00000000000000000000000000000000000000000000000000000000 00000000

sambaPwdLastSet: 1362051479 userPassword::

elNTSEF9R0tPSmclaFd5Z09JWVJBYVY3MGx3QURjTnhNZUxpSmxTVHFtRkE9PQ= uid: user

Каждый сервис имеет свои специфические свойства:

- количество необходимых атрибутов,

- вид работы (чтение/запись на жесткий диск или иной носитель данных, запросы поиска к СУБД).

Раннее проведенный анализ работы службы каталогов OpenLDAP с набором таких сервисов, как почтовый сервер, прокси-сервер, файловый сервер и сервер аутентификации показал, что больше всего времени для ответа на запрос необходимо файловому серверу, так как требуется наибольшее количество атрибутов и объектных классов, чтение данных и запись на диск, затем идут почтовый и прокси-серверы, и сервер аутентификации требует меньше всего времени ответа на запрос.

Касательно загруженности системы данный порядок сохраняется.

Имея эти данные, можно определить «числовые критерии сервисов» из условия, что наименьшее число — это наиболее критичный сервис. Таким образом, имеем:

- файловый сервер — критерий равен 1;

- почтовый сервер — 2;

- прокси-сервер — 3;

- сервер аутентификации — 4.

Данные загруженности по сервисам представлены в табл. 1.

Так как каждый атрибут связан с определенным классом или группой классов, несложно определить частоту использования того или иного сервиса для различных операций с каталогом (чтение, изменение, удаление). Для определения точного множества необходимых атрибутов и классов удобно воспользоваться табл. 2 «Атрибуты для различных сервисов» и формулой 1, полученными в более ранних исследованиях.

Для точного определения необходимых атрибутов удобно воспользоваться формулой (3):

С =

Таблица 1

Нагруженность системы при различный сервисах

Сервис Аутентифика- Добавление Удаление Отправка Прием

ция пользова- пользова- J^QTJ'PkJ

ЬсПз теля ЬёЬ теля ЬсПз bdb bdb

squid СРИ- 70%,ФС-70% - - - -

samba СРИ- СРи- СРи- - -

(smbldap- 84%,ФС-92% 86%,ФС- 79%,ФС-

tools) 100% 100%

postfix СРИ- - - CPU- CPU-

+ 73%,ФС-69% 73%,ФС- 73%,ФС-

dovecot 72% 75%

pam СРИ- 71%,ФС-71% - - - -

postfix СРИ- - - CPU- CPU-

+ 75%,ФС-70% 77%,ФС- 74%,ФС-

courier- 75% 78%

imap

Таблица2

Атрибуты для различных сервисов

Файловый сер- Кри- Почтовый Кри- Прокси- Кри- Сервер Кри-

вер (атрибуты) те- сервер (ат- те- сервер те- аутенти- те-

рий рибуты) рий (атрибуты) рий фикации (атрибуты) рий

uid 1 uid 2 uid 3 uid 4

uidNumber uidNumber шегРавб-даоМ userPassword

gidNumber gidNumber uidNumber

homeDirectorv homeDirectorv gidNumber

СП userPassword homeDirectorv

sn mail СП

description loginShell

displavName gecos

objectClass description

modifyTimestamp objectClass

Samba*

userPassword

loginShell

gecos

shadowMax

memberUid

где г = 1... п, п — количество сервисов,

В г — множество атрибутов для определенного сервиса, С — уникальное множество атрибутов.

Таким образом, выделяются множества атрибутов и классов, необходимых для работы сервисов.

По полученным данным заполняются табл. 3 «Записи сервисов» и табл. 4 «Записи каталога с учетом критерия сервиса», из которых принимается решение о переносе вершины записи в одну или другую ветку каталога.

Т а б л и ц а 3

Записи сервисов

запись атрибут класс атрибута частота появления атрибута сервис, который запрашивал атрибут

Т а б л и ц а 4

Записи каталога с учетом критерия сервиса

запись сервис частота использования сервиса критерий сервиса

Построение сетевой модели данных структуры каталога

Определив раннее множество вершин V' требующих перестроения, можно для каждой записи ы построить граф новых связей С'%=(V'%,Е'¿).

Рис. 3. Дополнительные подграфы вершин

Выделив вершины V' строится граф с исходной в ершиной V' вершинами «али асов» vaj и вершиной-родителем групп уоо, вершинами-родителями для «алиасов» ьр, по\,..

Следует отметить, что «алиаеов» у записи может быть несколько, соответственно у каждого «алиаса» будет своя вершина-родитель но у каждой записи будет «алиас»

для вершины ьр.

Выделяются подграфы С¿=(V\,Е'¿), где вершины V\=,ур,уа0,••а^,шо,••и дуги Е'г=({V'г,-тоо},...,{у'г{у'г,уоо},{уао,ур},{уа1,у0г},...,{уа^,УОз-г}), где

г = 0... И,

N — количество вершин-записей в каталоге,

2 = 1... т,

т — количество «алиаеов» для записи или количество веток, в которых хранится запись.

Добавление дуг сервисов к исходному графу

Для того чтобы связать полученные графы вершин и основное дерево каталога, добавим к исходному графу С дуги Е^(С")" = (ус!,уоо,...,уо^-\) и вершины Уг(Си)и={{у(1,уо0}, ..., {vd,voj-l}), задающие новые ветки.

Объединив множества вершин и дуг, получим новый граф С"(Е", V"):

V " = V и V "%

Е" = Е и Е "г С" =

Рис. 4. Дополнительные дуги

Удаление дублирующихся записей-вершин

Перед объединением графа С'^ и основного графа С необходимо удалить дублирующиеся записи-вершины ы для V'г и дуги {ьг,ьр} в ветке ои=Реор1е.

Удаление вершины. Пусть С = (Е, V) — граф и V € V. Удалить вершину V из графа С — это значит построить новый граф С" = (Е", V"), в котором V" = V\{-и} и Е" получается из Е удалением всех ребер, инцидентных вершине V.

Рис. 5. Удаление дублирующихся вершин

Объединение графов

Графы вершин С\ для каждых вер шин объединяются с графами О'":

V"' = V" и У\,

Е"' = Е" и Е\, С"' = (Е "' ,У "').

В результате чего получим новую структуру каталога, использующую сетевую модель данных, изображенную на рис. 2.

Модифицированный алгоритм поиска наименьшего пути Дейкстры

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

Для поиска кратчайших) пути в дереве каталога необходимо ввести определение веса перехода а, которое будет использоваться далее.

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

Положим для начальной вершины а(в) = 0. Вес первой дуги из ве ршины въх а(в, х1) = 1. Тогда для любой другой вершины с учетом механизма поиска в службах каталогов

а

где 1 вес первой дуги,

1) — вес дуги для вершины Хг-\. Алгоритм поиска наименьших) пути:

Шаг 1. Перед началом выполнения алгоритма все вершины и дуги не окрашены. Каждой вершине х присваивается некое число й(х), равное длине кратчайшего пути из вершины-источника пж, включая все вершины, ранее записанные в службу каталогов.

Следует отметить тот факт, что поиск в каталоге происходит перебором всех записей, последовательно записанных в определенную ветку.

Соответственно d(s) = 0, a d(x) = œ для всех вершин, отличных от вершины-источника s. Вершину s окрашиваем и временной переменной у присваиваем s (у = s), у — последняя окрашенная вершина.

Вершина-источник — это вершина, заданная при поиске, чаще всего ou=People.

Шаг 2. Для каждой неокрашенной вершины х следующим образом пересчитать величину d(x):

d

Если d(x) = œ для всех вер шин х, такого пути нет. В противном случае окрасить ту вершину ж, для которой величина d(x) является наименьшей. Также окрасить дугу, ведущую в выбранную на данном шаге вершину ж. Меняем значение у = х.

Для современных служб каталогов величина d(xi) будет равна величине веса дуги вершины Xi, так как во время перехода по графу будут закрашены все дуги и вершины, записанные раннее в текущей ветке каталога:

d

где N — количество вершин в поиске.

Шаг 3. Если у = t (конечная вершина поиска), закончить процедуру. Кратчайший путь из вершины s в t найден. Иначе перейти к шагу 2.

Рассмотрим стандартную структуру каталога, изображенную на рис. 1.

В данной случае s — это вершина ou=people, t — вершина uid=squser.

Определим веса дуг, согласно формуле 2:

a(people, smbuser) = 1 a(people, smbuser + squid) = 1 + a(people, smbuser) = 2 a(people, user) = 1 + a(people, smbuser + squid) = 3

a(people,squser)=l+a(people,user)=4a(people, squser) = 1 + a(people,user) = 4

Согласно формуле (4) d(squser) = 4

Таким образом, кратчайший путь для вершины uid=squser будет самым длинным по сравнению с другими вершинами графа.

Рассмотрим предлагаемую структуру каталога, изображенную на рис. 2.

В предлагаемой структуре каталога — графе — поиск уже ведется от специально созданной вершины ou=Squid.

Для неё определим веса дуг:

a(squid, squser) = 1

Величина d(squser) = 1.

В данном случае путь до вершины uid=squser будет короче, чем при стандартном графе. При таком построение графа поиск записи будет осуществляться быстрее.

Заключение

Предлагаемая структура хранения данных требует в дальнейшем более детального изучения. В данном представлении сетевая модель является избыточной из-за дублирования записей в ветке ou=People, что приведет к большим затратам для хранения данных на жестком диске. Но для основной задачи — минимизации времени ответов на запросы — является предпочтительней стандартной, иерархической.

В дальнейшем следует также рассмотреть возможность изменения структуры каталога в зависимости от периодической загрузки каталога, т.е. такой случай, когда определенные ветки каталога хранить на разных носителях данных в зависимости от важности ресурса.

Литература

1. Tamm У. Теория графов. — М. : Мир, 1988.

2. Майника, Э. Алгоритмы оптимизации на сетях и графах. — М. : Мир, 1981.

3. Кристофидес Н. Теория графов. Алгоритмический подход. — М. : Мир, 1975.

4. Robinson I., Webber J., Eifrem E. Graph Databases. — O'Reilly, 2013.

Поступим в редакцию 11.09.2013.