Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 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 调优参数值

  1. 检索 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
      ...
  2. 记录获取的值。在完成调配后,您要将参数重置回这些值。

调整数据库、域条目和 DN 缓存大小

对于数据库缓存大小:
  1. 确定所需的值。
    建议的值通常在 200 MB 到 500 MB 之间。适合您的用例的值取决于系统中可用的内存:
    • 超过 8 GB 内存 → 500 MB
    • 8 GB - 4 GB 内存 → 200 MB
    • 小于 4 GB 内存 → 100 MB
  2. 使用此模板设置确定的值:
    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 属性

  1. 运行 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
  2. Ctrl+D 确认并将更改发送到服务器。如果操作成功完成,则会显示以下信息:
    modifying entry "cn=config,cn=ldbm database,cn=plugins,cn=config"
对于域条目缓存大小:
  1. 确定所需的值。
    建议的值介于 100 MB 到 400 MB 之间。适当的值取决于系统中可用的内存:
    • 超过 4 GB 内存 → 400 MB
    • 2 GB - 4 GB 内存 → 200 MB
    • 小于 2 GB 内存 → 100 MB
    如果您要置备大型静态组,建议条目缓存足够大,以适应所有条目:group 和 members。
  2. 使用此模板设置确定的值:
    dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-cachememsize
    nsslapd-cachememsize: entry_cache_size_in_bytes
对于域名(DN)缓存大小:
  1. 为获得最佳性能,建议 DN 缓存适合调配条目的所有 DN。估算适合您的用例的值:
    1. 确定 文件中所有 DN 条目的数量。DN 条目位于以 dn: 开头的行中。例如,使用 192.168.1.0/24 grepsedwc
      # grep '^dn: ' ldif_file | sed 's/^dn: //' | wc -l
      92200
    2. 确定 LDIF 文件中所有 DN 条目字符串的大小。
      # grep '^dn: ' ldif_file | sed 's/^dn: //' | wc -c
      9802460
    3. 获取平均 DN 大小:将所有 DN 条目字符串的大小除以文件中所有 DN 条目的数量。
      例如:9,802,460 / 92,200 ≈ 106
    4. 获取平均内存大小:将平均 DN 大小乘以 2,然后在结果中添加 32。
      例如:(106 * 2) + 32 = 244
    5. 获取适当的 DN 缓存大小:将平均内存大小乘以 LDIF 文件中的 DN 条目总数。
      例如:244 * 92,200 = 22,496,800
  2. 使用此模板设置确定的值:
    dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config
    changetype: modify
    Replace: nsslapd-dncachememsize
    Nsslapd-dncachememsize: dn_cache_size

禁用不必要的服务和调整数据库锁定

  1. 禁用 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 属性”
  2. 如果您的拓扑中没有安装副本(如 “批量调配的建议和前提条件”一节中建议),禁用 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
    禁用这些额外的插件有助于提高调配的性能。
  3. 停止 IdM 服务器。这也会停止 DS 实例。
    # ipactl stop
    需要停止 DS 以设置下一步中的数据库锁定数量。稍后您将重新启动它。
  4. 调整数据库锁定的数量。适当的值等于调配条目数量的一半。
    • 最小值为 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 在计算成员资格时访问大量数据库页面。它访问的页面越多,调配所需的锁定越多。
  5. 启动 DS:
    # systemctl start dirsrv.target

导入条目

将新条目从 LDIF 文件导入到 IdM LDAP 实例。例如,使用 ldapadd 工具:
# ldapadd -D "binddn" -y password_file -f ldif_file
有关使用 ldapadd 的详情,请查看 ldapadd(1) man page。

重新启用禁用服务和恢复原始属性值

  1. 启用成员:
    dn: cn=MemberOf Plugin,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-pluginEnabled
    nsslapd-pluginEnabled: on
    有关使用 ldapmodify 工具修改 LDAP 属性的示例,请参阅 例 37.1 “使用 ldapmodify 更改 LDAP 属性”
  2. 重启 DS:
    # systemctl restart dirsrv.target
    此时需要重新启动 DS,因为您在上一步中启用了 MemberOf。
  3. 使用 (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。
  4. 启用 Schema Compatibility 插件:
    dn: cn=Schema Compatibility,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-pluginEnabled
    nsslapd-pluginEnabled: on
  5. 如果您在 “禁用不必要的服务和调整数据库锁定”一节 中禁用了 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
  6. 恢复您在 “备份当前 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
  7. 停止 DS:
    # systemctl stop dirsrv.target
  8. 恢复您在 “备份当前 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
  9. 启动 IdM 服务器:
    # ipactl start
    这会启动包括 DS 在内的所有 IdM 服务。