15.11. 管理带有过期复制的属性
作为 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集” 描述,部分复制允许管理员设置从复制更新 中排除 的属性。管理员可以出于各种性能的原因进行此操作 - 限制通过网络发送的大属性数量,或者减少运行任务(如
memberOf
计算)的次数。
从复制中排除的属性列表在
nsDS5ReplicatedAttributeList
属性中定义。此属性是复制协议的一部分,可以在 web 控制台的复制协议向导中配置,也可以在创建复制协议时通过命令行进行配置。
nsDS5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE memberof authorityRevocationList accountUnlockTime
重要
目录服务器要求
nsDS5ReplicatedAttributeList
属性的值中的 EXCLUDE 部分。如果直接编辑属性,例如使用 ldapmodify
工具,您必须将此部分与属性列表一起指定,如上例中所示。但是,dsconf
和 Web 控制台会自动添加 (objectclass= the)$ EXCLUDE 部分,您必须只指定属性。
15.11.1. 为总和增量更新设置不同的复制属性
首次配置部分复制时,排除的属性列表会应用到每个更新操作。这意味着,这个属性列表会排除整个更新以及常规增量更新。但是,在有些情况下,属性应该不包括在增量更新中,但应包含在整个更新中,以确保目录数据集已完成。在这种情况下,可以添加一个第二个属性,它定义了单独的属性,以排除总更新
nsDS5ReplicatedAttributeListTotal
。
注意
nsDS5ReplicatedAttributeList
是主要部分复制属性。如果只设置了 nsDS5ReplicatedAttributeList
,则它将适用于增量更新和总更新。如果设置了 nsDS5ReplicatedAttributeList
和 nsDS5ReplicatedAttributeListTotal
,则 nsDS5ReplicatedAttributeList
仅适用于增量更新。
例如,每次将
memberOf
属性添加到条目时,都会运行 memberOf 修复任务来解决组成员资格。如果每次进行复制时都运行该任务,这可能会导致服务器开销。由于数据库的总更新仅针对被新添加到复制或长时间离线的数据库发生,因此在整个更新是一个可接受的选项后运行 memberOf 修复任务。在这种情况下,nsDS5ReplicatedAttributeList
属性列出了 memberOf
,因此它不包括在增量更新中,但 nsDS5ReplicatedAttributeListTotal
不会列出 memberOf
,使其包含在总更新中。
增量更新的排除列表在复制协议的
nsDS5ReplicatedAttributeList
属性中设置。例如:
nsds5replicatedattributelist: (objectclass=*) $ EXCLUDE authorityRevocationList accountUnlockTime memberof
要设置
nsDS5ReplicatedAttributeList
属性,请使用 dsconf repl-agmt set 命令。例如:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \ --suffix="suffix" --frac-list="authorityRevocationList accountUnlockTime memberof" \ agreement_name
如果
nsDS5ReplicatedAttributeList
是唯一属性集,则该列表适用于增量和总更新。要为总更新设置单独的列表,请将 nsDS5ReplicatedAttributeListTotal
属性添加到复制协议中:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \ --suffix="suffix" --frac-list-total="accountUnlockTime" \ agreement_name
注意
必须为增量更新设置
nsDS5ReplicatedAttributeList
属性,然后才能为总更新设置 nsDS5ReplicatedAttributeListTotal
。
15.11.2. Replication Keep-alive Entry
当您更新供应商上的属性时,供应商会增加更改序列号(CSN)。在复制拓扑中,这个服务器现在连接到第一个消费者,并将本地 CSN 与消费者上的 CSN 进行比较。如果它较低,则从本地更改日志中检索更新,并复制到消费者。在启用了部分复制的复制拓扑中,这可能会导致问题:例如,如果在从复制中排除的供应商中只更新属性,则不会找到任何更新来复制,因此 CSN 不会在消费者上更新。在某些情况下,比如只在复制中排除的供应商中只更新属性时,对供应商上的更新不必要的搜索可能会导致其他服务器接收数据。要临时解决这个问题,Directory 服务器使用 keep-alive 条目。
如果供应商中的所有更新属性都不包括在复制中,且跳过的更新数量超过 100,则
keepalivetimestamp
属性会在供应商上更新并复制到消费者。因为 keepalivetimestamp
属性没有包括在复制中,所以会复制 keep-alive 条目的更新,所以消费者上的 CSN 会被更新,然后等于供应商上的 CSN。下次供应商连接到消费者时,只会搜索比消费者上的 CSN 更新。这可减少供应商搜索要发送的新更新所需的时间。
目录服务器会根据供应商的需求自动创建复制保留条目。它在可分辨名称(DN)中包含供应商的副本 ID。每个 keep-alive 条目都特定于一个给定的提供者。例如,显示隐藏的 keep-alive 条目:
# ldapsearch -D "cn=Directory Manager" -b "dc=example,dc=com" -W -p 389 -h server.example.com -x 'objectClass=ldapsubentry' dn: cn=repl keep alive 1,dc=example,dc=com objectclass: top objectclass: ldapsubentry objectclass: extensibleObject cn: repl keep alive 1 keepalivetimestamp: 20181112150654Z
在以下情况下更新 keep-alive 条目(如果在更新前不存在,则首先创建它):
- 当部分复制协议跳过超过 100 个更新时,在结束复制会话前不会发送任何更新。
- 当供应商初始化消费者时,最初它会创建自己的 keep-alive 条目。也是供应商的消费者不会创建自己的 keep-alive 条目,除非它也初始化另一个消费者。
15.11.3. 防止 "Empty" 更新进行复制
部分复制允许从复制更新中删除的属性列表(
nsDS5ReplicatedAttributeList
)。但是,对 exclude 属性的更改仍然会触发修改事件并生成空的复制更新。
nsds5ReplicaStripAttrs
属性添加一个无法在空复制事件中发送的属性列表,并从更新序列中分离。这个逻辑上包括操作特定点,如 修饰符名称
。
例如,假设
accountUnlockTime
属性被排除。John Smith 的用户帐户被锁定,然后过期时间,并自动解锁。只有 accountUnlockTime
属性已更改,且该属性不包括在复制中。但是,操作属性 internalmodifytimestamp
也 改变。触发复制事件,因为 John Smith 的用户帐户被修改 - 但是唯一要发送的数据是新的修改时间戳,否则更新是 emtpy。如果有大量与登录时间或密码过期时间相关的属性(例如,这可能会造成大量空复制更新,这会影响服务器性能或对关联的应用程序有影响。
要防止这种情况,请在复制协议中添加
nsds5ReplicaStripAttrs
属性,以帮助调整部分复制行为:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \ --suffix="suffix" \ --strip-list="modifiersname modifytimestamp internalmodifiersname" \ agreement_name
如果复制事件 不为空,则 剥离的属性仍然与其他更改一起复制。只有在事件是 emtpy 时,这些属性才会从更新中删除。