Kategória: Linux a sieť

Zmenené: 6. jún 2012

OpenLDAP a indexovanie

Podobne ako v databázach, možno i v adresári LDAP udržiavať indexy atribútov. Na internete sa povaľuje niekoľko návodov, ktoré popisujú nastavte indexy tak alebo onak, ale väčšina nepíše prečo, či načo…

Možnosti indexovania

Na indexovanie je v OLC (cn=config) použitý atribút olcDbIndex, ktorý sa môže vyskytovať len v položke olcDatabase={Z}xxx,cn=config. Všetky zmeny v nastavení indexu majú za následok automatické reindexovanie (nie je potrebný slapindex). Treba však dať pozor na to, že v OpenLDAP neexistuje žiadny spôsob, ktorým by informoval o ukončení reindexácie, preto môže byť použitie OLC (cn=config) počas reindexácie v nedefinovanom stave.

Formát:

# OLC (cn=config) form
olcDbIndex: { <attrlist> | default } [ indices ]

Atribút olcDbIndex definuje, ktoré indexy má OpenLDAP udržiavať. Indexovať možno ľubovoľný počet atribútov a použitie indexovania nie je podmienkou pre vyhľadávanie daného parametra, môže mať však výrazný vplyv na výkon! Možnosť parametra default uchováva zadané indexy a používa ich, keď na ďalšie parametr indexu, ktoré nemajú položku indexu. Hodnota default musí byť definovaná ešte pred použitím atribútu olcDbIndex, ktorý nemá definované hodnoty indexu.

Možnosť attrlist v sebe zahŕňa meno atribútu alebo ich zoznam oddelený čiarkami. Indices je zoznam typov indexov (tiež oddelených čiarkami), ktoré majú byť pre dané atribúty spracovávané. Možno nastaviť viacero typov indexov:

  • pres má byť použité na hľadania vo forme objectclass=person alebo attribute=mail
  • approx musí byť použitý na hľadania vo forme sn~=person (obdoba like)
  • eq má byť použité na hľadania vo forme sn=smith, teda bez zástupných znakov (používa len pravidlo EQUALITY)
  • sub má byť použité na hľadania vo forme ‚ sn=sm*‘, teda s použitím zástupných znakov (používa pravidlo SUBSTR), toto pravidlo môže byť rozšírené pomocou (jedného alebo viacerých) podtypov:
    • subinitial optimalizované pre hľadania sn=s*
    • subany optimalizované pre hľadania sn=*n*
    • subfinal optimalizované pre hľadania sn=*th
  • special môže byť buď nolang**alebo **nosubtypes, čo má vzťah k jednotlivým druhom sub.

Pozorné nastavenie indexov na základe potrieb aplikácií bude mať významný vplyv na výkon adresára - naopak, neexistuje dôvod na indexovanie atribútu, ktorý nikdy nie je súčasťou hľadania. Ak všetky hľadania používajú len pravidlá EQUALITY, neexistuje dôvod na indexovanie pomocou sub. Pamätajte, že index zvyšujú využitie pamäte (viac indexov = viac potrebnej pamäte) a operácie zápisu alebo úprav zaberú viac času, kvôli aktualizácii indexov.

Upozornenie

V prípade EQUALITY ide o rovnosť hodnôt, v prípade SUBSTR sa jedná o vyhľadanie zhody časti reťazca…

Identifikácia indexovania

Ako som spomínal vyššie, správnej voľbe indexov je potrebné venovať istú pozornosť. Ako však identifikovať, čo indexovať treba a čo nie? Začnem od konca. Zbytočné indexovanie je ťažké identifikovať, pretože OpenLDAP jednoducho nemá možnosť zistiť, že je niektorý index naviac. Preto sa mi ako efektívnejší spôsob javí nepridávať do indexov nič a sledovať systémový záznam, kde sa môžu (a budú) objavovať riadky, napr:

bdb_equality_candidates: (title) not indexed
bdb_equality_candidates: (host) not indexed
bdb_substring_candidates: (host) not indexed

Z týchto riadkov jednoducho identifikujem, že OpenLDAP vykonáva hľadania atribútov title, host**a **uniqueMember, ktoré však nie sú indexované (pravidlo EQUALITY), preto práve tieto atribúty sú kandidátmi na vytvorenie indexu eq. Posledný riadok zase indikuje, že je realizované vyhľadávanie podreťazca atribútu host, takže treba pridať index sub.

Upozornenie

Samozrejme, o potrebe indexovania niektorých atribútov sa môžete dočítať aj v dokumentácii daného programu…

Konfigurácia indexovania

Väčšina návodov, ktoré som našiel, popisuje nastavenie pomocou starého spôsobu konfigurácie, teda pomocou konfiguračného súboru slapd.conf a v týchto návodoch nájdete definíciu indexu takto:

index cn,uid,uidNumber eq

Tento konfiguračný riadok je naozaj zrozumiteľný a definuje vytvorenie indexu typu eq pre atribúty cn, uid a uidNumber. Ako preložiť túto definíciu do štýlu dynamického nastavovania pomocou cn=config? Začnem prieskumom aké indexovanie je aktuálne nastavené:

ldapsearch -LLL -H ldapi:/// -Y EXTERNAL -b cn=config olcDatabase={1}hdb olcDbIndex
dn: olcDatabase={1}hdb,cn=config
olcDbIndex: objectClass          pres,eq
olcDbIndex: cn,sn,uid           eq
olcDbIndex: uidNumber,gidNumber,memberUid eq

V tomto výpise vidíte, že definícia indexov náleží do vetvy olcDatabase={1}hdb,cn=config. Táto vetva (ako aj indexovanie) je teda definované pre databázu, v mojom prípade databázu typu hdb. Vy môžete mať nastavený iný typ databázy. Ako ďalej vo výpise vidieť, všetky položky majú predponu olc (Open Ldap Configuration) a vidno tiež, že mám definovaných viacero indexov. Na pridanie nového indexu stačí použiť ldapmodify:

ldapmodify -H ldapi:/// -Y EXTERNAL
predn: olcDatabase={1}hdb,cn=config
add: olcDbIndex
olcDbIndex: host,title eq

modifying entry "olcDatabase={1}hdb,cn=config"

Týmto príkazom som pridal definíciu indexu typu eq pre atribúty host a title.

Tip

Len podotýkam, že v príkazoch používam externú metódu autentifikácie a spúšťam ich s právami roota, takže si prihlasovanie upravte podľa vlastného nastavenia.