Как ускорить комбинированный запрос ldap?

Этот запрос ldap выполняется мгновенно:

"Find all groups which user1 is not member"
(&
    (objectclass=groupOfNames)
    (!(member=cn=user1))
)

Как и этот:

"Find these groups"
(&
    (objectclass=groupOfNames)
    (|(cn=group1) (cn=group2) (cn=group3) ...  )
)

Но такое объединение приводит к нескольким минутам обработки!

"From these groups, find all which the user1 is not a member"
(&
    (objectclass=groupOfNames)
    (!(member=cn=user1))
    (|(cn=group1) (cn=group2) (cn=group3) ...  )
)

Я понятия не имею, почему сервер ldap задыхается от комбинированного запроса. Есть идеи, что можно сделать?

Сервер Novell eDirectory, если это поможет.


person Martin Wickman    schedule 11.04.2013    source источник


Ответы (1)


Странно, что для получения результата требуется несколько минут. У вас есть более пары миллионов объектов?

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

Кроме того, не могли бы вы попробовать следующий вариант:

(&

  (&
    (objectclass=groupOfNames)(!(member=cn=user1))
  )

  (&
    (objectclass=groupOfNames)(|(cn=group1) (cn=group2) (cn=group3) ...  )
  )

)

Это должно дать вам ответ, который вы изначально запрашивали, но немного проще.

Если это не поможет, вы должны выполнить ndstrace на запрашиваемом сервере и посмотреть, что именно он делает с запросом.

Итак, вкратце:

  1. Очевидно: убедитесь, что ваш NDS исправен (ndsrepair, TID 3564075 и еще много чего)
  2. проверьте, находятся ли оба запроса в одном разделе
  3. проверьте, есть ли на сервере хотя бы реплика чтения раздела(ов)
  4. попробуйте изменить запрос, как было предложено
  5. сделать ndstrace при запросе, чтобы увидеть, что занимает так много времени
person Michael    schedule 14.07.2017