1.2. 目录服务器如何在复制环境中管理模式更新
当您更新 cn=schema
树中的目录模式时,Directory 服务器会将更改存储在 /etc/dirsrv/slapd-instance_name/schema/99user.ldif
文件中,包括更改状态号(CSN)。
目录服务器不会直接将模式更改复制到其他副本。当复制树中更新目录内容时,架构复制将开始。例如,如果您在修改 schema 后更新用户,则供应商会将存储在 nsSchemaCSN
属性中的 CSN 与消费者上的 CSN 进行比较。如果消费者上的 nsSchemaCSN
属性的值低于供应商上的 nsSchemaCSN 属性的值,则目录服务器会将模式复制到消费者。对于成功复制,供应商上的所有对象类和属性类型都必须是消费者定义的超集。
例 1.1. 模式子集和超集
-
在
server1
上,示例
对象类允许a1、
a2
和a3
属性。 -
在
server2
上,示例
对象类允许a1
和a3
属性。
在上例中,server1
上 示例
对象类的 schema 定义是 server2
上对象类的超集。在验证阶段,当目录服务器复制或接受 schema 时,服务器会检索 superset 定义。例如,如果消费者检测到本地 schema 中的对象类允许的属性小于供应商模式中的对象类,Directory 服务器会更新本地 schema。
如果架构定义被成功复制,则 nsSchemaCSN
属性在服务器和架构定义(如对象类和属性类型)上相同,也不会在复制会话开始时进行比较。
在以下场景中,目录服务器不会复制模式:
一个主机上的 schema 是另一主机的模式的子集。
例如,
server2
上示例
对象类的架构定义是server1
上对象类的子集。子集也可以为属性(单值属性是多值属性的子集)和属性语法发生。- 当供应商模式和消费者模式中的定义需要合并时。
-
目录服务器不支持合并模式。例如,如果一个服务器上的对象类允许
a1、
和a
2a3
属性以及a1、
a3
和a4
在另一个服务器上,则架构不是子集且不能合并。 您可以使用
/etc/dirsrv/slapd-instance_name/schema/99user.ldif
以外的模式文件。目录服务器允许您在
/etc/dirsrv/slapd-instance_name/schema/
目录中添加额外的模式文件。但是,只更新/etc/dirsrv/slapd-instance_name/schema/99user.ldif
文件中的 CSN。因此,其他架构文件仅在本地使用,不会自动传送到复制合作伙伴。重要要使目录服务器自动复制模式并避免重复的模式定义,请将自定义模式存储在
/etc/dirsrv/slapd-instance_name/schema/99user.ldif
文件中。