Optimisation OpenLDAP pour la suppression d'un membre d'un groupe

La suppression d'un membre dans un groupe (uniqueMember) est très longue par défaut, sur un groupe qui contient plus de 66 000 entrées :

time ldapmodify -x D bindn -w password-f delMember.ldif 
delete uniqueMember:
	uid=USER1,ou=employees,ou=users,ou=example,o=com
modifying entry "cn=InternalUsers,ou=groups,ou=example,o=com"
modify complete


real	6m17.845s
user	0m0.088s
sys	0m0.112s

Le fichier LDIF utilisé étant le suivant :

dn: cn=InternalUsers,ou=groups,ou=example,o=com
changetype: modify
delete: uniqueMember
uniqueMember: uid=USER1,ou=employees,ou=users,ou=example,o=com

6 minutes pour supprimer une seule entrée de groupe, autant dire que cela devient vite inacceptable lorsque l'on utilise un produit de gestion d'identité qui réalise des suppressions en masse...

Ceci peut être amélioré en ajoutant le paramètre olcSortVals dans la configuration de l'annuaire OpenLDAP.

Comme l'indique le manpage du fichier slapd.conf :

sortvals  [...]
    Specify a list of multi-valued attributes whose values will always be maintained in sorted order. Using this option will allow Modify, Compare, and filter evaluations on these attributes to be performed more efficiently. The resulting sort order depends on the attributes' syntax and matching rules and may not correspond to lexical order or any other recognizable order. 


La modification peut se faire soit en dynamique, via un fichier LDIF :

dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcSortVals
olcSortVals: uniqueMember

On peut aussi arrêter le service slapd, modifier le fichier /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif, et ajouter la ligne :

olcSortVals: uniqueMember

On teste ensuite sur un autre membre :

time ldapmodify -x D bindn -w password-f delMember.ldif 
delete uniqueMember:
	uid=USER2,ou=employees,ou=users,ou=example,o=com
modifying entry "cn=InternalUsers,ou=groups,ou=example,o=com"
modify complete

real	0m0.855s
user	0m0.004s
sys	0m0.004s

Le gain est impressionnant (/400), et on limite également les messages de type bdb_idl_delete_key: c_get failed: DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock (-30994) que l'on avait auparavant, du fait des longues transactions.

On peut ajouter plusieurs valeurs d'attributs, de la manière suivante :

olcSortVals: uniqueMember member

 

Clément Oudot en parle sur son blog Linagora :
Astuce OpenLDAP-groupes-dynamiques

Catégorie