4.4. 虚拟目录信息树视图

目录服务器支持分层导航和组织(称为 虚拟目录信息树视图 或虚拟 DIT 视图)的概念。
注意
虚拟视图与多个后端不兼容,因为视图返回的条目必须位于相同的后端中;搜索范围仅限于一个后端。

4.4.1. 关于虚拟 DIT 视图

配置目录命名空间的方法有两种:
  • 分层目录信息树。
  • 扁平目录信息树。
分层 DIT 可用于浏览目录,但过于繁琐且易更改。对分层 DIT 的主要变化可能比较昂贵且耗时的操作,因为它通常涉及显著的服务中断。这通常只能通过在小时和低流量期间执行更改来最小化。
在不需要更改的情况下,扁平 DIT 不会提供便捷的方法来浏览或管理目录服务中的条目。扁平化 DIT 还带来了许多管理挑战,因为管理变得更为复杂,无需任何自然的分级分组。

图 4.14. Flat 和组织的 DIT 示例

Flat 和组织的 DIT 示例
使用分级 DIT 时,部署必须确定层次结构的主体域。只能做出一个选择;自然倾向于选择组织层次结构。
在很多情况下,组织的这种视图适合良好,但只有一个视图可能非常限制用于目录导航和管理。例如,组织层次结构非常适用于查找属于 Accounts 部门的人员的条目。但是,对于查找属于地理位置的用户(如 Mountain View, California)的条目,这个视图非常有用。第二个查询在第一个查询一样有效,但需要了解条目中包含的属性和其他搜索工具。在这种情况下,使用 DIT 进行导航不是选项。
同样,当 DIT 符合管理功能的要求时,管理该目录将更加容易。DIT 的机构也可能受到其他因素的影响,如复制和迁移注意事项,这会导致 DIT 能够对这些应用程序具有功能,但其他情况下的实际实用程序很少。
显然,层次结构是导航和管理的一个非常有用的机制。不过,为了避免对现有 DIT 进行更改的负担,部署可能会完全默认使用扁平 DIT。
如果某个目录提供了创建任意数量的层次结构,则部署具有优势,不必将目标条目移到条目上,而无需移动问题的目标条目。Directory 服务器的 虚拟 DIT 视图 功能解决了决定用于目录部署的 DIT 类型的定性。
虚拟 DIT 视图 提供了一种对条目进行分层导航的方法,而无需在任何特定位置存在这些条目。虚拟 DIT 视图使用有关条目的信息将其放在视图层次结构中。对于客户端应用,虚拟 DIT 视图显示为普通容器层次结构。在某种意义上,虚拟 DIT 视图对一组条目具有超级 DIT 层次结构,与这些条目无关,无论这些条目是否处于扁平命名空间中,还是在其自己的另一个层级结构中。
创建虚拟 DIT 视图层次结构的方式与普通的 DIT 层次结构相同。创建相同的条目(例如,组织单元条目),但使用额外的对象类(nsview)和描述视图的过滤器属性(nsviewfilter)。在添加了附加属性后,与 view 过滤器匹配的条目会立即填充视图。目标条目只 出现在 视图中,它们真正的位置不会改变。虚拟 DIT 视图的行为与子树或一级搜索的普通 DIT 的行为可以通过返回预期的结果来执行。
有关添加和修改条目的详情,请参考 红帽目录服务器管理指南中的"创建目录条目"

图 4.15. 使用视图组合 DIT

使用视图组合 DIT
DIT 图 4.15 “使用视图组合 DIT” 演示了当 图 4.14 “Flat 和组织的 DIT 示例” 中显示的两个 DIT 使用视图合并时会发生什么。因为视图本质上允许条目出现在视图层次结构中的多个位置上,因此这个功能已被扩展来根据位置或产品查看销售条目。
假定一组虚拟 DIT 视图层次结构,一个目录用户可以使用视图来导航到所需的条目。例如,如果目标条目是位于 Mountain View 的人员,则首先浏览基于位置的信息最合适。如果是组织性问题,组织视图将是更好的选择。这两个视图同时存在于目录服务器中,并在同一个条目上运行;不同的视图仅在显示其目录结构版本时具有不同的目标。
图 4.15 “使用视图组合 DIT” 中启用了视图的目录中的条目包含在层次结构中最顶层视图的扁平命名空间中。这不是必须的。条目可以保存在其自身的层次结构中。视图相对于某个条目放置的唯一问题是,它必须是视图层次结构的父项的后代。

图 4.16. 带有虚拟 DIT 视图层次结构的 DIT

带有虚拟 DIT 视图层次结构的 DIT
  • sub-tree ou=People 包含实际 条目 AEntry B 条目。
  • sub-tree ou=Location Views 是一个视图层次结构。
  • leaf nodes ou=Sunnyvaleou=Mountain View 各自包含一个属性 nsviewfilter,它描述了视图。
    这些是叶节点,因为它们不包含实际条目。但是,当客户端应用程序搜索这些视图时,它会在 ou=Sunnyvale 下找到 Entry A,并在 ou=Mountain View 下找到条目 B。这个虚拟搜索空间由所有上级视图的 nsviewfilter 属性描述。从视图中进行的搜索会返回虚拟搜索空间和实际搜索空间中的条目。这可让视图层次结构作为传统 DIT 工作,或者将传统的 DIT 更改为 view 层次结构。

4.4.2. 使用虚拟 DIT 视图的好处

部署决策通过虚拟 DIT 视图变得更加容易,因为:
  • 视图有助于将扁平命名空间用于条目,因为虚拟 DIT 视图提供了类似于传统层次结构提供的导航和管理器性支持。
    另外,每当对 DIT 进行更改时,条目从不需要移动;只有虚拟 DIT 视图层次结构变化。由于这些层次结构不包含实际条目,因此简单且快速修改。
  • 在部署计划期间超额,使用虚拟 DIT 视图的灾难性较低。如果在第一个实例中没有正确开发层次结构,可以在不中断服务的情况下轻松、快速地更改。
  • 查看层次结构可在几分钟内完全修订,结果会立即实现,从而显著降低目录维护成本。
    对虚拟 DIT 层次结构的更改会立即实现。发生组织更改时,可以快速创建一个新的虚拟 DIT 视图。新的虚拟 DIT 视图可以与旧视图同时存在,从而促进了更逐步更改自身以及使用这些条目的应用程序。因为目录中的一个机构更改不是全权操作,所以可以在一段时间内完成,无需服务中断。
  • 通过使用多个虚拟 DIT 视图进行导航和管理,可以更灵活地使用目录服务。
    通过虚拟 DIT 视图提供的功能,组织可以使用旧方法和新方法组织目录数据,而无需在 DIT 的特定点上放置条目。
  • 虚拟 DIT 视图层次结构可以作为某种可用的查询来创建,以方便检索常见必要信息。
  • 视图在工作实践中提升灵活性并降低目录用户创建复杂搜索过滤器的要求,使用它们原本不需要知道的属性名称和值。
    能够灵活地查看和查询目录信息,让最终用户和应用程序能够更直观地找到他们通过分层导航功能所需的内容。

4.4.3. 虚拟 DIT 视图示例

下面的 LDIF 条目显示基于位置的虚拟 DIT 视图层次结构。驻留在 dc=example,dc=com 之下的任何条目都显示在此视图中,按位置组织。
dn: ou=Location Views,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
objectclass: nsView
ou: Location Views
description: views categorized by location


dn: ou=Sunnyvale,ou=Location Views,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
objectclass: nsView
ou: Sunnyvale
nsViewFilter: (l=Sunnyvale)
description: views categorized by location


dn: ou=Santa Clara,ou=Location Views,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
objectclass: nsView
ou: Santa Clara
nsViewFilter: (l=Santa Clara)
description: views categorized by location


dn: ou=Cupertino,ou=Location Views,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
objectclass: nsView
ou: Cupertino
nsViewFilter: (l=Cupertino)
description: views categorized by location
基于 ou=Location Views,dc=example,dc=com 的子树搜索将返回 dc=example,dc=com 下的所有条目,它与过滤器 (l=Sunnyvale), (l=Santa Clara), 或 (l=Cupertino) 匹配。相反,一级搜索不会返回除子视图条目之外的条目,因为所有限定条目都位于三个下级视图。
ou=Location Views,dc=example,dc=com 视图条目本身不包含过滤器。此功能有助于组织分层,无需进一步限制视图中包含的条目。任何视图都可能省略该过滤器。虽然示例过滤器非常简单,但所使用的过滤器可能很复杂。
可能需要限制视图应包含的输入类型。例如,要将此层次结构限制为仅包含人员条目,请将 nsfilter 属性添加到 ou=Location Views,dc=example,dc=com,其过滤器值 (objectclass=organizationalperson)
每个视图具有过滤器限制所有下级视图的内容,而带有过滤器的下级视图也会限制其上级的内容。例如,首先创建顶部视图 ou=Location Views 和上述新过滤器,会创建一个带有 organization 对象类的所有条目的视图。当添加了进一步限制条目的 descendant 视图时,现在在 descendant 视图中出现的条目会从ancestor 视图中删除。这演示了虚拟 DIT 视图如何模拟传统 DIT 的行为。
虽然虚拟 DIT 视图模拟了传统的 DIT 的行为,但 view 可以执行传统 DIT 不能的操作:条目可能会出现在多个位置上。例如,要将 Entry BMountain ViewSunnyvale (请参阅 图 4.16 “带有虚拟 DIT 视图层次结构的 DIT”)关联,将 Sunnyvale 值添加到 location 属性中,该条目会出现在这两个视图中。

4.4.4. 查看和其他目录功能

目录服务器中的 class of serviceroles 支持视图;请参阅 第 4.3 节 “分组目录条目”。当在视图层次结构中添加类服务或角色时,逻辑上和实际包含在视图中的条目都将被视为在范围内。这意味着,可以使用虚拟 DIT 视图来应用角色和服务类,但应用程序的影响在查询扁平命名空间时也可以看到。
有关使用这些功能的详情,请参考 红帽目录服务器管理指南中的 "高级条目管理"。
使用视图时,可能需要使用稍有不同的方式来访问控制。因为目前对 ACL 的显式支持,在视图父项中创建基于角色的 ACL,并将角色添加到视图层次结构中的相应部分。这样,利用层次结构的 organizational 属性。
如果搜索的基本是视图,并且搜索范围不是基础,则搜索是一个基于视图的搜索。否则,这是传统的搜索。
例如,执行一个基础为 dc=example,dc=com 的搜索不会返回虚拟搜索空间中的任何条目;实际上,不会执行 virtual-search-space 搜索。只有在搜索基础为 ou=Location Views 时才会进行视图处理。这样,视图可确保搜索不会产生这两个位置的条目。(如果它是传统的 DIT,来自两个位置的条目都会被返回。)

4.4.5. 虚拟视图对性能的影响

基于视图的层次结构性能取决于层次结构本身的结构和 DIT 中的条目数量。通常,如果目录服务中启用了虚拟 DIT 视图,则可能会对性能进行边缘更改(在传统 DIT 上有几分百分比的搜索)。如果搜索没有调用视图,则不会影响性能。根据预期的搜索模式和在部署前加载的虚拟 DIT 视图。
如果视图用作机构中通用的导航工具,我们还建议将视图过滤器中使用的属性索引。此外,当视图使用的子过滤器与配置的虚拟列表视图索引匹配时,该索引用于查看评估。
不需要专门调优目录的任何其他部分,以供视图使用。

4.4.6. 与现有应用程序兼容

虚拟 DIT 视图旨在模拟传统 DIT 高度。存在对于大多数应用程序而言,视图的存在应是透明的;它们不应表示它们正在使用视图。除了一些特殊情况外,用户无需了解在目录服务器实例中使用视图的目录;视图看起来和行为像传统的 DIT 一样。
某些类型的应用程序可能会遇到与启用了视图的目录服务相关的问题。例如:
  • 使用目标条目的 DN 来导航 DIT 的应用程序。
    这种类型的应用程序会发现,它正在导航出条目物理存在的层次结构,而不是找到该条目的视图层次结构。这样做的原因是,通过更改条目的 DN 以符合视图的层次结构,不会尝试忽略条目的真正位置。这由设计 - 如果条目的真正位置进行解包,例如依赖 DN 来识别唯一条目的应用程序时,许多应用程序都无法正常工作。这种对 DN 的超额导航是客户端应用程序的一个不常见的技术,但却没有人为无法按预期工作的那些客户端。
  • 使用 numSubordinates 操作属性的应用程序来确定节点下存在多少个条目。
    对于视图中的节点,这目前只有那些存在于实际搜索空间中的条目数,忽略虚拟搜索空间。因此,应用程序可能无法使用搜索来评估视图。