Автор Тема: Настройка нескольких mdb бакендов  (Прочитано 11029 раз)

Dorringtorr

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Добрый день.
Помогите пожалуйста.

Я запускаю slapd на операционный системе OpenWRT. Версия openldap-server - 2.4.43-2 . Мне необходимо запустить 2 бакэнда mdb, в разных директориях. Но при этом мне необходимо увеличить размер одной из них до 4гБ, а вторую оставить как есть на 10мб. Если я выставляю maxsize у одного бакэнда - slapd не запускается. Но запускается если у обеих бакэндов выставляю одинаковый размер (любой).
Так же если хочу выставить такие параметры как dbnosync и checkpoint, так же не запускается.
И вот еще, если все таки без опции maxsize и запускаю - slapd"живtт" около 5-10 минут, после чего сам вылетает :-( . При этом например ldif бакэнды - работают нормально в этой же конфигурации.
Файл настройки взял тут. Прилагаю свою копию.

#
include   /etc/openldap/schema/core.schema
include   /etc/openldap/schema/cosine.schema
include   /etc/openldap/schema/my.schema

pidfile       /var/run/slapd.pid
argsfile    /var/run/slapd.args

#loglevel    -1
backend mdb
#######################################################################
# Определение базы данных bdb
#
# Замените ниже example и com на подходящее имя домена
#
# Если у Вас нет домена, то, поскольку example.com зарезервирован для
# экспериментов, можете оставить его, либо поменять на my.inc
#
#######################################################################

database mdb
suffix "dc=linkit, dc=local"

# root или администратор
rootdn "cn=Manager, dc=linkit, dc=local"
rootpw secret
# Директория базы данных ДОЛЖНА существовать до того, как Вы запустите slapd
# Не забудьте поменять путь на подходящий Вам
#directory   /var/db/openldap/linkit
directory   /var/openldap-data/ramdb

database mdb
suffix "dc=statlink, dc=local"

# root или администратор
rootdn "cn=Manager, dc=statlink, dc=local"
rootpw secret

# Директория базы данных ДОЛЖНА существовать до того, как Вы запустите slapd
#directory   /var/openldap-data/stat
directory /Media/SD-P1/stat

# Устанавливаемые для каталога индексы
# Оптимизируем поиск по подразделениям
#index ou eq,sub
# Если при поиске будет встречаться objectClass, раскомментируйте следующую строку
#index objectClass eq
# Продемонстрировано использование параметра индексирования default
#index default eq,sub

# Другие параметры базы данных
# Дополнительная информация в разделе справочника по slapd.conf
# maxsize 4294967296
# dbnosync
# checkpoint 32 1
# mode 0666


С Уважением Михаил

« Последнее редактирование: 17 Май 2017, 02:53:30 от Dorringtorr »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Настройка нескольких mdb бакендов
« Ответ #1 : 18 Май 2017, 03:22:29 »
Здравствуйте, Михаил!

Я запустил slapd с Вашей конфигурацией на 64-битной gentoo-linux, openldap-2.4.43, он проработал уже 2 часа без проблем, правда нагрузки я никакой на него не давал. slapd.conf:
include   /etc/openldap/schema/core.schema
include   /etc/openldap/schema/cosine.schema
#include   /etc/openldap/schema/my.schema

moduleload      back_mdb.so

# First MDB
database mdb
suffix "dc=linkit,dc=local"
rootdn "cn=Manager,dc=linkit,dc=local"
rootpw secret
directory   /opt/openldap-experiments/2017-05-18_2_mdb/mdb1/

# Second MDB
database mdb
suffix "dc=statlink,dc=local"
rootdn "cn=Manager,dc=statlink,dc=local"
rootpw secret
directory   /opt/openldap-experiments/2017-05-18_2_mdb/mdb2/

maxsize 4294967296
dbnosync
checkpoint 32 1
mode 0666

Теоретически, никаких проблем нет. Трудно что-то предположить. Возможно, у Вас кривая сборка OpenLDAP, либо какая-то специфическая нагрузка, которая вешает back_mdb. У Вас каталог лежит в /Media/SD-P1/stat -- это какой-то монтируемый диск? Не может ли он повлиять?

В лог при крахе что-то попадает? Можно попробовать запустить slapd в debug-режиме и посмотреть, что происходит:
slapd -h ldap://127.0.0.1:389 -f ./slapd.conf -d 256В параметре -d можно задавать те же уровни логирования, что и в директиве loglevel.

Егор

P.S.: slapd проработал 7 часов без проблем, затем я его остановил.
« Последнее редактирование: 18 Май 2017, 08:54:41 от egor »

Dorringtorr

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Настройка нескольких mdb бакендов
« Ответ #2 : 21 Май 2017, 18:24:57 »
Добрый день Егор!

Большое спасибо что уделили мне время.
Немного о системе. Это MIPS 24KEc  Mediatek MT7688AN . 1 ядро 32 бита 580мгц 128 рам.

Лдап сервер я беру с репозитория OpenWRT где он собирается автоматически. И к сожалению без функции дебага.

В дебрях конференции родного сайта opеnldap.org я раскопал похожий случай 10 летней давности. Там товарищ вообще на 32мб рама в OpenWRT  запускал. Но для этого он выставлял threads 1 . Что я и сделал. Но не помогло :-(.

Тогда я первую базу, перевел на ldif а вторую оставил mdb - так как именно вторая массивная будет. И все заработало. Но при этом maxsize не более 1,9гб смог выставить, если ставлю больше, не загружается. Хотя с опцией -Tt -n1 -  показывает что все ок.  Думал еще maxreaders  порезать до 10 - так как запросы в базу делает всего 1 программа. Но это никак не влияет. Хуже того, если направляю в базу обновления значения переменной, после 60 обновлений - база вылетает, причем молча. При повторном запуске, все работает, пока не запишу 60 раз.

По поводу накопителя где располагается mdb. Вы правы - это флешка 4гб.  Я тоже думал в ней дело, я перевел ее на f2fs - это специальная файловая система для флешек, очень быстрая. Не помогло. Тогда я вообще в памяти смонтировал диск, и туда направил mdb. Без результативно :-(

В итоге, если первую базу сделать ldif а вторую mdb, то работает. Но при этом maxsize не больше 1,9Гб (а надо хотя бы 4), и после 60 записей  mdb вылетает.  Про первую я молчу, так как эта база вообще смонтирована в памяти, и ее размер не более 500кб в принципе.

Как Вы думаете, может это потому что база криво собирается в репозитории? Или может какой урезанный вариант? Все запросы в базу направляет специальная программа, написана он на C. Есть такая вероятность что именно она вешает базу?

На всякий случай прилагаю schema - может там не так что то?
# Схема для LinkIt

objectIdentifier litOID  1.1
objectIdentifier litLDAP litOID:2
objectIdentifier litAttrType    litLDAP:1
objectIdentifier litObjClass litLDAP:2

# Time format - ггммддччммсс 
attributetype ( litAttrType:1
  NAME 'modifyTime'
  DESC 'Contains the time of the last modification of the directory entry.'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 
  EQUALITY generalizedTimeMatch
  ORDERING generalizedTimeOrderingMatch
  SINGLE-VALUE )

attributetype ( litAttrType:2
  NAME 'wr'
  DESC 'Признак доступа на запись'
  EQUALITY booleanMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
  SINGLE-VALUE )

attributetype ( litAttrType:3
  NAME 'stat'
  DESC 'Признак статистического параметра - сохранить некоторые'
  EQUALITY booleanMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
  SINGLE-VALUE )

attributetype ( litAttrType:4
  NAME 'parameterName'
  DESC 'Значение переменной'
  SUP name )

attributetype ( litAttrType:5
  NAME 'value'
  DESC 'Значение переменной'
  EQUALITY integerMatch
  ORDERING integerOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
  SINGLE-VALUE )

attributetype ( litAttrType:6
  NAME 'prevValue'
  DESC 'Предыдущее значение переменной'
  EQUALITY integerMatch
  ORDERING integerOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
  SINGLE-VALUE )

attributetype ( litAttrType:7
  NAME 'power'
  DESC 'Порядок числа значения'
  EQUALITY integerMatch
  ORDERING integerOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
  SINGLE-VALUE )

attributetype ( litAttrType:8
  NAME 'recverAdd'
  DESC 'Допустимо ли добавлять получателя параметра'
  EQUALITY booleanMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
  SINGLE-VALUE )

attributetype ( litAttrType:9
  NAME 'recverName'
  DESC 'Имя получателя значения параметра'
  SUP name )

attributetype ( litAttrType:10
  NAME 'iface'
  DESC 'Имя интерфейса Аппаратного Модуля'
  SUP name
  SINGLE-VALUE )

attributetype ( litAttrType:11
  NAME 'dest'
  DESC 'Destination of communication message'
  SUP name
  SINGLE-VALUE )

attributetype ( litAttrType:12
  NAME 'source'
  DESC 'Source of communication message'
  SUP name )

attributetype ( litAttrType:13
  NAME 'commMsg'
  DESC 'Communication message'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  ORDERING caseIgnoreOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE )

attributetype ( litAttrType:14
  NAME 'errorMsg'
  DESC 'Error Message'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  ORDERING caseIgnoreOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE )

attributetype ( litAttrType:15
  NAME 'errNumMsg'
  DESC 'The Error Number Message'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  ORDERING caseIgnoreOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE )

attributetype ( litAttrType:21
  NAME 'attr1'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:22
  NAME 'attr2'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:23
  NAME 'attr3'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:24
  NAME 'attr4'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:25
  NAME 'attr5'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:26
  NAME 'attr6'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:27
  NAME 'attr7'
  DESC 'Атрибут на будущее'
  SUP value )

attributetype ( litAttrType:28
  NAME 'attr8'
  DESC 'Атрибут на будущее'
  SUP value )

objectclass ( litObjClass:1
  NAME 'pmam'
  DESC 'SoftModule or HardModule'
  SUP organizationalUnit STRUCTURAL
  MUST ( ou $ wr $ stat $ iface)
  MAY ( description $ attr1 $ attr2 $ attr3 $ attr4 $ attr5 $ attr6 $ attr7 $ attr8 )
  )
 
objectClass ( litObjClass:3
  NAME 'statDeviceModule'
  DESC 'статистика Аппаратный Модуль'
  SUP organizationalUnit STRUCTURAL
  MUST ( ou )
  )

objectClass ( litObjClass:4
  NAME 'parameter'
  DESC 'Класс Параметры'
  SUP top STRUCTURAL
  MUST ( parameterName $ value $ prevValue $ power $ wr $ stat $ recverAdd )
  MAY ( description $ recverName $ modifyTime )
  )

objectClass ( litObjClass:5
  NAME 'statParameter'
  DESC 'статистика Параметры'
  SUP top STRUCTURAL
  MUST ( parameterName )
  MAY ( description )
  )

objectClass ( litObjClass:6
  NAME 'statRecord'
  DESC 'статистическая запись'
  SUP top
  MUST ( value $ modifyTime )
  MAY ( description )
  )


objectClass ( litObjClass:8
  NAME 'statComm'
  DESC 'статистика Коммуникация'
  SUP top STRUCTURAL 
  MUST ( modifyTime $ commMsg )
  MAY ( description )
  )

objectClass ( litObjClass:9
  NAME 'statError'
  DESC 'статистика Ошибок'
  SUP top
  MUST ( modifyTime $ ou $ errNumMsg)
  MAY ( description $ errorMsg )
  )





С Уважением Михаил
« Последнее редактирование: 21 Май 2017, 18:29:39 от Dorringtorr »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Настройка нескольких mdb бакендов
« Ответ #3 : 22 Май 2017, 09:13:21 »
Здравствуйте, Михаил.

У Вас действительно очень мало оперативки, скорее всего, проблема в этом. 10 лет назад back_mdb ещё не было, в том примере должен использоваться другой backend.

mdb очень интенсивно использует оперативную память, видимо, когда её перестаёт хватать, у slapd происходит крах. Если есть возможность, оттестируйте работу Вашей конфигурации на более мощном железе.

Почему Вы хотите поднять каталог именно на этом устройстве? Нельзя ли с помощью конфигурации программы, наполняющей каталог, перенаправить её запросы на сторонний сервер?

Егор

Dorringtorr

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Настройка нескольких mdb бакендов
« Ответ #4 : 23 Май 2017, 00:28:09 »
Добрый день Егор,

Я возможно ошибся со сроком, но точно помню что речь на форуме шла именно о MDB, вот посмотрите   http://www.openldap.org/its/index.cgi/Software%20Bugs?id=6361;page=4

Мне надо поднять именно на этом устройстве, так как это как бы мини сервер для хранения статистики, и это интегрированное устройство с CAN и разными аппаратными приблудами. По поводу памяти сомневаюсь, так как при запуске еще около 75мб свободные.
 К стати на LDIF работает без проблем. А вот такой вопрос, как ограничить размер LDIF ? Что будет когда закончится место на флешке?

С Уважением
Михаил

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Настройка нескольких mdb бакендов
« Ответ #5 : 23 Май 2017, 09:28:57 »
Здравствуйте, Михаил. В приведённой Вами статье речь об MDB не идёт (этот механизм появился в 2011 году, насколько я помню).

При старте slapd память вполне может оставаться. Сколько остаётся после, к примеру, 10 операций записи в каталог?

LDIF слишком простой механизм, он не поддерживает никаких ограничений. Именно поэтому он и не требователен к памяти, всё сразу скидывает на диск. Что будет, когда закончится место, не знаю, видимо, ничего хорошего. Скорее всего при очередной попытке перезаписи файла Вы просто потеряете всё содержимое, как это обычно бывает в файловых системах на linux. Контролируйте либо средствами файловой системы, если она позволяет (типа квот), либо какой-нибудь задачей по крону, которая в случае критического объёма свободного места остановит slapd (во избежания потери данных) и просигнализирует об этом.

Егор

Леонид Юрьев

  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Re: Настройка нескольких mdb бакендов
« Ответ #6 : 09 Июнь 2018, 15:16:24 »
На всякий отвечу раз заметил.

Для 32-битной системы у вас слишком большой размер базы.
MDB-бакенд отображает все данные в память (не обязательно загрузит, но отобразит).
Поэтому адекватной можно считать конфигурацию, в которой суммарный размер всех mdb-баз не превышает 1-1.5 Gb.
Тем не менее, в зависимости от конфигурации ядра (сплит 2/2 или 1/3), может как-то заработать с общим размером всех mdb-баз вплоть до 2.5 Gb.