第 37 章 用于批量调配条目的性能调优
使用常规工作流添加大量条目可能会非常慢,如用于添加用户的 第 11 章 管理用户帐户。本章论述了如何调整流程以确保尽快完成调配。
作为流程的一部分:
- 身份管理(IdM)读取要从 LDIF 文件置备的条目,然后将其导入到目标 IdM LDAP 实例。
- 管理员为某些属性设置自定义值,如缓存大小,并禁用 MemberOf 和 Schema 兼容性插件。该流程包括在置备的条目上运行
fixup-memberof.pl
插件,以补补禁用 MemberOf。
此流程经过设计和测试,以调配下列条目类型:用户、用户组、主机、主机组、sudo 规则和基于主机的访问控制(HBAC)规则。
批量调配的建议和前提条件
建议:
- 当置备大量条目( 10,000 或以上)时,不允许任何 LDAP 客户端访问调配条目或依赖服务器中信息的服务器。例如,您可以禁用服务器上的端口 389 和 636,并使用 LDAPI 在 Unix 套接字上工作。原因:MemberOf 插件在服务器上禁用,这意味着服务器上的成员资格信息无效。
- 停止调配期间不需要运行的应用。原因:这有助于在机器上释放尽可能多的内存。可用内存将由文件系统缓存使用,从而提高调配的性能。请注意,以下步骤已包含停止 IdM 服务的步骤,只重启 Directory Server(DS)实例。IdM 服务(特别是
tomcat
)消耗大量内存,但在调配过程中不使用。 - 在只有一个服务器的新 IdM 部署中运行这个步骤。仅在置备完成后创建副本。原因:调配吞吐量比复制快得多。在具有多个服务器的部署中,副本的信息将变得显著过时。
先决条件:
- 生成包含您要置备的条目的 LDIF 文件。例如,如果您要迁移现有的 IdM 部署,请使用
ldapsearch
工具导出所有条目来创建 LDIF 文件。有关 LDIF 格式的详情,请参阅 红帽目录服务器 10 管理指南中的 关于 LDIF 文件格式。
备份当前 DS 调优参数值
- 检索 DS 调优参数的当前值:
- 数据库缓存大小和数据库锁定:
# ldapsearch -D "cn=directory manager" -w secret -b "cn=config,cn=ldbm database,cn=plugins,cn=config" nsslapd-dbcachesize nsslapd-db-locks ... nsslapd-dbcachesize: 10000000 nsslapd-db-locks: 50000 ...
- 条目缓存大小和 DN 缓存大小:
# ldapsearch -D "cn=directory manager" -w secret -b "cn=userRoot,cn=ldbm database,cn=plugins,cn=config" nsslapd-cachememsize nsslapd-dncachememsize ... nsslapd-cachememsize: 10485760 nsslapd-dncachememsize: 10485760 ...
- 记录获取的值。在完成调配后,您要将参数重置回这些值。
调整数据库、域条目和 DN 缓存大小
对于数据库缓存大小:
- 确定所需的值。建议的值通常在 200 MB 到 500 MB 之间。适合您的用例的值取决于系统中可用的内存:
- 超过 8 GB 内存
500 MB - 8 GB - 4 GB 内存
200 MB - 小于 4 GB 内存
100 MB
- 使用此模板设置确定的值:
dn: cn=config,cn=ldbm database,cn=plugins,cn=config changetype: modify replace: nsslapd-dbcachesize nsslapd-dbcachesize: db_cache_size_in_bytes
有关使用ldapmodify
工具修改 LDAP 属性的示例,请参阅 例 37.1 “使用ldapmodify
更改 LDAP 属性”。
例 37.1. 使用 ldapmodify
更改 LDAP 属性
- 运行
ldapmodify
命令,然后添加语句来修改属性值。例如:# ldapmodify -D "cn=directory manager" -w secret -x dn: cn=config,cn=ldbm database,cn=plugins,cn=config changetype: modify replace: nsslapd-dbcachesize nsslapd-dbcachesize: 200000000
- 按 Ctrl+D 确认并将更改发送到服务器。如果操作成功完成,则会显示以下信息:
modifying entry "cn=config,cn=ldbm database,cn=plugins,cn=config"
对于域条目缓存大小:
- 确定所需的值。建议的值介于 100 MB 到 400 MB 之间。适当的值取决于系统中可用的内存:
- 超过 4 GB 内存
400 MB - 2 GB - 4 GB 内存
200 MB - 小于 2 GB 内存
100 MB
如果您要置备大型静态组,建议条目缓存足够大,以适应所有条目:group 和 members。 - 使用此模板设置确定的值:
dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config changetype: modify replace: nsslapd-cachememsize nsslapd-cachememsize: entry_cache_size_in_bytes
对于域名(DN)缓存大小:
- 为获得最佳性能,建议 DN 缓存适合调配条目的所有 DN。估算适合您的用例的值:
- 确定 文件中所有 DN 条目的数量。DN 条目位于以
dn:
开头的行中。例如,使用 192.168.1.0/24grep
、sed
和wc
:# grep '^dn: ' ldif_file | sed 's/^dn: //' | wc -l 92200
- 确定 LDIF 文件中所有 DN 条目字符串的大小。
# grep '^dn: ' ldif_file | sed 's/^dn: //' | wc -c 9802460
- 获取平均 DN 大小:将所有 DN 条目字符串的大小除以文件中所有 DN 条目的数量。例如:9,802,460 / 92,200 ≈ 106
- 获取平均内存大小:将平均 DN 大小乘以 2,然后在结果中添加 32。例如:(106 * 2) + 32 = 244
- 获取适当的 DN 缓存大小:将平均内存大小乘以 LDIF 文件中的 DN 条目总数。例如:244 * 92,200 = 22,496,800
- 使用此模板设置确定的值:
dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config changetype: modify Replace: nsslapd-dncachememsize Nsslapd-dncachememsize: dn_cache_size
禁用不必要的服务和调整数据库锁定
- 禁用 MemberOf 和 Schema 兼容性插件:
dn: cn=MemberOf Plugin,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: off
dn: cn=Schema Compatibility,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: off
禁用 MemberOf 可显著加快调配速度。禁用 Schema 兼容性还有助于缩短操作的持续时间。有关使用ldapmodify
工具修改 LDAP 属性的示例,请参阅 例 37.1 “使用ldapmodify
更改 LDAP 属性”。 - 如果您的拓扑中没有安装副本(如 “批量调配的建议和前提条件”一节中建议),禁用 Content Synchronization 和 Retro Changelog 插件:
dn: cn=Content Synchronization,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: off
dn: cn=Retro Changelog Plugin,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: off
禁用这些额外的插件有助于提高调配的性能。 - 停止 IdM 服务器。这也会停止 DS 实例。
# ipactl stop
需要停止 DS 以设置下一步中的数据库锁定数量。稍后您将重新启动它。 - 调整数据库锁定的数量。适当的值等于调配条目数量的一半。
- 最小值为 10,000
- 最大值为 200,000
因为 DS 已停止,所以您必须修改/etc/dirsrv/slapd-EXAMPLE-COM/dse.ldif
文件来设置值:dn: cn=config,cn=ldbm database,cn=plugins,cn=config ... nsslapd-db-locks: db_lock_number
IdM 在计算成员资格时访问大量数据库页面。它访问的页面越多,调配所需的锁定越多。 - 启动 DS:
# systemctl start dirsrv.target
导入条目
将新条目从 LDIF 文件导入到 IdM LDAP 实例。例如,使用
ldapadd
工具:
# ldapadd -D "binddn" -y password_file -f ldif_file
有关使用
ldapadd
的详情,请查看 ldapadd(1) man page。
重新启用禁用服务和恢复原始属性值
- 启用成员:
dn: cn=MemberOf Plugin,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: on
有关使用ldapmodify
工具修改 LDAP 属性的示例,请参阅 例 37.1 “使用ldapmodify
更改 LDAP 属性”。 - 重启 DS:
# systemctl restart dirsrv.target
此时需要重新启动 DS,因为您在上一步中启用了 MemberOf。 - 使用
(objectClass
=114)过滤器运行fixup-memberof.pl
脚本,在所有置备的条目上重新生成和更新memberOf
属性。例如:# fixup-memberof.pl -D "cn=directory manager" -j password_file -Z server_id -b "suffix" -f "(objectClass=*)" -P LDAP
需要运行fixup-memberof.pl
,因为在导入条目时 MemberOf 插件被禁用。要能够继续调配,脚本必须成功完成。有关fixup-memberof.pl
的详情请参考 fixup-memberof.pl(8) man page。 - 启用 Schema Compatibility 插件:
dn: cn=Schema Compatibility,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: on
- 如果您在 “禁用不必要的服务和调整数据库锁定”一节 中禁用了 Content Synchronization 和 Retro Changelog 插件,请重新启用它们:
dn: cn=Content Synchronization,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: on
dn: cn=Retro Changelog Plugin,cn=plugins,cn=config changetype: modify replace: nsslapd-pluginEnabled nsslapd-pluginEnabled: on
- 恢复您在 “备份当前 DS 调优参数值”一节 中备份的数据库缓存、条目缓存和 DN 缓存大小的原始值:
dn: cn=config,cn=ldbm database,cn=plugins,cn=config changetype: modify replace: nsslapd-dbcachesize nsslapd-dbcachesize: backup_db_cache_size dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config changetype: modify Replace: nsslapd-dncachememsize Nsslapd-dncachememsize: backup_dn_cache_size - replace: nsslapd-cachememsize nsslapd-cachememsize: backup_entry_cache_size
- 停止 DS:
# systemctl stop dirsrv.target
- 恢复您在 “备份当前 DS 调优参数值”一节 中备份的数据库锁定的原始值。因为 DS 已停止,所以您必须修改
/etc/dirsrv/slapd-EXAMPLE-COM/dse.ldif
文件来设置值:dn: cn=config,cn=ldbm database,cn=plugins,cn=config ... nsslapd-db-locks: backup_db_lock_number
- 启动 IdM 服务器:
# ipactl start
这会启动包括 DS 在内的所有 IdM 服务。