Sun Java System Directory Server Enterprise Edition 6.3 管理指南

第 22 章 目录代理服务器分配

目录代理服务器通过定义数据视图来启用分配。数据视图是用视图基定义的,视图基决定该数据视图中条目的基 DN。根据目录代理服务器中提供的分配算法,可以指定在不同的数据视图之间分配条目的方式。

有关目录代理服务器分配的概述和示例使用案例的描述,请参见《Sun Java System Directory Server Enterprise Edition 6.3 Reference》中的第 17  章 “Directory Proxy Server Distribution”

本章包含以下主题:

配置目录代理服务器分配算法

目录代理服务器提供了以下分配算法:

配置模式匹配分配算法

目录代理服务器会根据请求的参数与一个或多个模式的匹配情况,将请求分配给数据视图。设置以下参数可配置模式匹配分配算法:

filter 结尾的配置属性是 LDAP 过滤器,而不是正则表达式。这些 LDAP 过滤器的值是基于传入的搜索请求中所包含的 LDAP 过滤器来计算的。

例如,使用以下设置配置模式匹配分配算法,将 uid 为偶数的用户的请求发送给偶数数据视图,将 uid 为奇数的用户的请求发送给奇数数据视图。


$ dpconf set-ldap-data-view-prop even
pattern-matching-base-object-search-filter:'|(uid=\2a)(uid=*0)(uid=*2)\
(uid=*4)(uid=*6)(uid=*8))'\
pattern-matching-one-level-search-filter:'|(uid=\2a)(uid=*0)(uid=*2)\
(uid=*4)(uid=*6)(uid=*8))'\
pattern-matching-subtree-search-filter:'|(uid=\2a)(uid=*0)(uid=*2)\
(uid=*4)(uid=*6)(uid=*8))'\
pattern-matching-dn-regular-expression:'uid=[0-9]+[02468]'
distribution-algorithm: pattern-matching 

$ dpconf set-ldap-data-view-prop odd
pattern-matching-base-object-search-filter:'|(uid=\2a)(uid=*1)(uid=*3)\
(uid=*5)(uid=*7)(uid=*9))'\
pattern-matching-one-level-search-filter:'|(uid=\2a)(uid=*1)(uid=*3)\
(uid=*5)(uid=*7)(uid=*9))'\
pattern-matching-subtree-search-filter:'|(uid=\2a)(uid=*1)(uid=*3)\
(uid=*5)(uid=*7)(uid=*9))'\
pattern-matching-dn-regular-expression:'uid=[0-9]+[13579]'
distribution-algorithm: pattern-matching 

(uid=\2a) 表达式中,\2a* 的 ASCII 表示形式,其中 2a 是两个十六进制数字。(uid=\2a) 表达式可确保数据视图接受所有 uid 的请求。

模式匹配算法支持的语法由 Java 模式类(请参见 http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html 上提供的文档)来指定。此语法不同于常规的 regex 语法。

配置数字分配算法

目录代理服务器会根据请求中的 RDN 数值,将请求分配给数据视图。将从数据视图的基 DN 下的第一个 RDN 值中获取该数值。设置以下参数来定义数字范围:

例如,配置数字分配算法,将介于 0 和 99 之间的 uid 的请求发送给特定数据视图。对于其余用户,使用相同的语法,但用不同的数据视图。


$ dpconf set-ldap-data-view-prop dataview distribution-algorithm:numeric \
 numeric-attrs:uid numeric-lower-bound:0 numeric-upper-bound:99

配置字典顺序分配算法

目录代理服务器会根据请求中 RDN 的字典顺序值,将请求分配给数据视图。将从数据视图的基 DN 下的第一个 RDN 值中获取字典顺序范围。设置以下参数来定义字典顺序范围:

例如,配置字典顺序分配算法,将名称以 AM 开头的用户的请求发送给一个数据视图,而将其余用户的请求发送给另一个数据视图。


$ dpconf set-ldap-data-view-prop dataview distribution-algorithm:lexicographic \
 lexicographic-attrs:cn lexicographic-lower-bound:A lexicographic-upper-bound:M

配置复制分配算法

目录代理服务器会根据数据视图在复制中的角色,将请求分配给数据视图。该算法将写入操作分配给数据源池中的所有数据源,将读取操作分配给单个数据源。复制角色由 replication-role 参数来定义。数据视图可以具有提供者角色或使用者角色。


$ dpconf set-ldap-data-view-prop dataview distribution-algorithm:replication

配置自定义分配算法

可以为所有类型的数据视图配置自定义分配算法,即 ldap-data-viewjdbc-data-viewldif-data-viewjoin-data-view。在以下步骤中,将仅为 ldap-data-view 设置该算法。

Procedure配置自定义分配算法

  1. 设置 extension-jar-file-url 属性以包含 Java 归档 (Java Archive, JAR) 文件(包含分配算法类)的路径。


    $ dpconf set-server-prop -h host -p port extension-jar-file-url:jar file path
    

    可以将 jar file path 替换为有效 JAR 文件路径,如 file:/expt/dps/custom_plugin/myjar.jar

  2. 在配置 custom-distribution-algorithm 之前,请将 distribution-algorithm 设置为 none


    $ dpconf set-ldap-data-view-prop view name distribution-algorithm:none
  3. custom-distribution-algorithm 属性设置为自定义分配算法类。


    $ dpconf set-ldap-data-view-prop view name custom-distribution-algorithm:PackageName.AlgoClassName
    

配置目录代理服务器以分配后缀数据

一个简单的数据分配案例就是在一组目录中存储 UID 以 A 到 M 开头的条目,而在另一组目录中存储 UID 以 N 到 Z 开头的条目。目录代理服务器接收所有客户端操作。服务器必须确定哪组目录处理 A 到 M,哪组目录处理 N 到 Z。

    配置目录代理服务器以处理此数据分配方案的重要阶段如下所示。

  1. 将目录添加为目录代理服务器的数据源。

  2. 在数据源池中添加数据源以处理不同的数据分配。

  3. 创建数据视图,以便将客户端请求分配到相应的数据池。

  4. 拆分要装入相应数据源中的 LDIF。

  5. 将拆分的 LDIF 导入到相应的数据源中。

  6. 为连接到相应数据池的数据源调整基于操作的权重。

下面的示例使用侦听端口 9389 的目录代理服务器。为了简化示例,此处按上述方式将代理配置为仅在三个目录服务器实例中分配数据。要提高可用性和读取可伸缩性,请使用复制的目录拓扑来存储 LDAP 数据。一个目录服务器实例 dsA-M:1389 处理 UID 以 A 到 M 开头的用户条目。另一个目录服务器实例 dsN-Z:2389 处理 UID 以 N 到 Z 开头的用户条目。最后一个目录实例 dsBase:3389 处理后缀的基本条目。

第一步是创建并启用数据源。基本数据源将没有 UID 的条目保存在后缀根目录附近。在典型部署中,这些条目的数量比分配的条目少得多。


$ dpconf create-ldap-data-source -p 9389 dsA-M localhost:1389
$ dpconf set-ldap-data-source-prop -p 9389 dsA-M is-enabled:true

$ dpconf create-ldap-data-source -p 9389 dsN-Z localhost:2389
$ dpconf set-ldap-data-source-prop -p 9389 dsN-Z is-enabled:true

$ dpconf create-ldap-data-source -p 9389 dsBase localhost:3389
$ dpconf set-ldap-data-source-prop -p 9389 dsBase is-enabled:true

第二步是将数据源添加到数据源池中。


$ dpconf create-ldap-data-source-pool -p 9389 "Base Pool"
$ dpconf attach-ldap-data-source -p 9389 "Base Pool" dsBase

$ dpconf create-ldap-data-source-pool -p 9389 "A-M Pool"
$ dpconf attach-ldap-data-source -p 9389 "A-M Pool" dsA-M

$ dpconf create-ldap-data-source-pool -p 9389 "N-Z Pool"
$ dpconf attach-ldap-data-source -p 9389 "N-Z Pool" dsN-Z

第三步是创建一些数据视图,以便将客户端请求分配到相应的数据池。请注意基本池是如何处理 dc=example,dc=com 的,而保存根据 UID 值分配的数据的池是如何处理 ou=people,dc=example,dc=com 的。此步骤需要重新启动服务器。


$ dpconf create-ldap-data-view -p 9389 "Base View" "Base Pool" \
dc=example,dc=com

$ dpconf create-ldap-data-view -p 9389 "A-M View" "A-M Pool" \
ou=people,dc=example,dc=com
$ dpconf set-ldap-data-view-prop -p 9389 "A-M View" \
distribution-algorithm:lexicographic lexicographic-attrs:uid \
lexicographic-lower-bound:a lexicographic-upper-bound:m
The proxy server will need to be restarted in order for the changes to take effect

$ dpconf create-ldap-data-view -p 9389 "N-Z View" "N-Z Pool" \
ou=people,dc=example,dc=com
$ dpconf set-ldap-data-view-prop -p 9389 "N-Z View" \
distribution-algorithm:lexicographic lexicographic-attrs:uid \
lexicographic-lower-bound:n lexicographic-upper-bound:z
The proxy server will need to be restarted in order for the changes to take effect
$ dpadm restart /local/dps

第四步是拆分要加载到相应数据源中的 LDIF。此示例使用 dsadm split-ldif 命令执行初始拆分,并进行部分文件编辑以保留所有数据源中的顶级条目。这既可以保留指定访问控制指令的顶级条目,又可以对每个数据源执行单个导入命令。


$ dpadm split-ldif /local/dps /local/ds6/ldif/Example.ldif /tmp/
[14/May/2007:21:14:13 +0200] - STARTUP    - INFO  - Java Version: 1.5.0_09
 (Java Home: /local/jre)
[14/May/2007:21:14:13 +0200] - STARTUP    - INFO  - Java Heap Space: Total Memory
 (-Xms) = 3MB,
 Max Memory (-Xmx) = 63MB
[14/May/2007:21:14:13 +0200] - STARTUP    - INFO  - Operating System: SunOS/sparc 5.10
[14/May/2007:21:14:15 +0200] - INTERNAL   - ERROR - Entry starting at line 0 does not
 start with a DN
[14/May/2007:21:14:15 +0200] - INTERNAL   - ERROR - Unable to parse line "# Kirsten is
 a Directory Administrator and therefore should not" of entry "uid=kvaughan, ou=People,
 dc=example,dc=com" starting at line 112 as an attribute/value pair -- no colon found.
[14/May/2007:21:14:15 +0200] - INTERNAL   - ERROR - Unable to parse line "# Robert is
 a Directory Administrator and therefore should not" of entry "uid=rdaugherty,
 ou=People, dc=example,dc=com" starting at line 298 as an attribute/value pair --
 no colon found.
[14/May/2007:21:14:16 +0200] - INTERNAL   - ERROR - Unable to parse line "# Harry is
 a Directory Administrator and therefore should not" of entry "uid=hmiller, ou=People,
 dc=example,dc=com" starting at line 556 as an attribute/value pair -- no colon found.
[14/May/2007:21:14:16 +0200] - INTERNAL   - INFO  - SplitLDIF processing complete.
  Processed 156 entries.
$ ls /tmp/*ldif
/tmp/a-m view.ldif    /tmp/base view.ldif   /tmp/n-z view.ldif

此步骤还需要在导入之前添加到 LDIF 中的顶级条目。


$ cp /local/ds6/ldif/Example.ldif /tmp/top.ldif
$ vi /tmp/top.ldif 
$ cat /tmp/top.ldif  
dn: dc=example,dc=com
objectclass: top
objectclass: domain
dc: example
aci: (target ="ldap:///dc=example,dc=com")(targetattr !=
 "userPassword")(version 3.0;acl "Anonymous read-search access";
 allow (read, search, compare)(userdn = "ldap:///anyone");)
aci: (target="ldap:///dc=example,dc=com") (targetattr =
  "*")(version 3.0; acl "allow all Admin group"; allow(all) groupdn =
  "ldap:///cn=Directory Administrators,ou=Groups,dc=example,dc=com";)

$ cat /tmp/top.ldif /tmp/base\ view.ldif > /tmp/top\ and\ base\ view.ldif
$ cat /tmp/top.ldif /tmp/a-m\ view.ldif > /tmp/top\ and\ a-m\ view.ldif
$ cat /tmp/top.ldif /tmp/n-z\ view.ldif > /tmp/top\ and\ n-z\ view.ldif

第五步是将拆分的 LDIF 导入到相应的数据源中。此处,处理基本条目的目录侦听端口 3389。处理 A-M 的目录侦听端口 1389。处理 N-Z 的目录侦听端口 2389。


$ dsconf import -p 1389 /tmp/top\ and\ a-m\ view.ldif dc=example,dc=com
...
Task completed (slapd exit code: 0).

$ dsconf import -p 2389 /tmp/top\ and\ n-z\ view.ldif dc=example,dc=com
...
Task completed (slapd exit code: 0).
$ dsconf import -p 3389 /tmp/top\ and\ base\ view.ldif dc=example,dc=com
...
Task completed (slapd exit code: 0).

第六步是为连接到相应数据池的数据源调整基于操作的权重。如果客户端应用程序执行搜索以外的操作,还必须为这些操作设置权重。


$ dpconf set-attached-ldap-data-source-prop -p 9389 "Base Pool" dsBase search-weight:1
$ dpconf set-attached-ldap-data-source-prop -p 9389 "A-M Pool" dsA-M search-weight:1
$ dpconf set-attached-ldap-data-source-prop -p 9389 "N-Z Pool" dsN-Z search-weight:1

设置基于操作的权重后,客户端应用程序可以通过目录代理服务器进行搜索,就好像没有实际分配数据一样。

下面的搜索查找 UID 以 R 开头的用户。


$ ldapsearch -p 9389 -b dc=example,dc=com uid=rfisher
version: 1
dn: uid=rfisher, ou=People, dc=example,dc=com
cn: Randy Fisher
sn: Fisher
givenName: Randy
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
ou: Human Resources
ou: People
l: Cupertino
uid: rfisher
mail: rfisher@example.com
telephoneNumber: +1 408 555 1506
facsimileTelephoneNumber: +1 408 555 1992
roomNumber: 1579

下一个搜索查找一个基本条目。


$ ldapsearch -p 9389 -b ou=groups,dc=example,dc=com cn=hr\ managers
version: 1
dn: cn=HR Managers,ou=groups,dc=example,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: HR Managers
ou: groups
uniqueMember: uid=kvaughan, ou=People, dc=example,dc=com
uniqueMember: uid=cschmith, ou=People, dc=example,dc=com
description: People who can manage HR entries

为示例使用案例创建和配置数据视图

本部分包含以下有关数据视图以及如何创建和配置数据视图的信息:

本部分中的示例假定连接处理程序允许目录代理服务器处理所有客户端连接。

当子树的不同部分存储到不同数据源时提供单一访问点的数据视图

本部分介绍如何配置一个数据视图,以便为子树的不同部分提供单一访问点。此示例包含两个具有相同基 DN 的数据视图。可使用数字分配算法将条目分配到不同的数据视图中。每组数据相等的数据源都会配置一个数据源池。下图显示了示例部署。

有关此类部署的信息,请参见《Sun Java System Directory Server Enterprise Edition 6.3 Reference》中的“Data Views to Route Requests When Different Parts of a Subtree Are Stored in Different Data Sources”

图 22–1 当子树的不同部分存储到不同数据源时提供单一访问点的样例部署

图中显示的样例部署向存储到多个数据源的不同子树部分提供单一访问点。

Procedure配置当子树的不同部分存储到不同数据源时提供单一访问点的数据视图

可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。

  1. 为每个 LDAP 服务器创建数据源,如创建和配置 LDAP 数据源所述。

  2. 创建两个数据源池,如创建和配置 LDAP 数据源池所述。

  3. 将包含一部分子树的数据源连接到 data-source-pool-1,将包含另一部分子树的数据源连接到 data-source-pool-2,如将 LDAP 数据源连接到数据源池所述。

  4. (可选的)配置负载平衡。

    有关信息,请参见配置负载平衡

  5. 创建具有分配算法的数据视图,以选择 ou=people,dc=example,dc=comuid 介于 099 之间的条目,并将该数据视图配置为将请求指向 data-source-pool-1


    $ dpconf set-ldap-data-view-prop -h host1 -p 1389 dataview-1 \
     ldap-data-source-pool:data-source-pool-1 base-dn:ou=people,dc=example,dc=com \
     distribution-algorithm	:numeric numeric-attrs:uid numeric-lower-bound	:0 \
     numeric-upper-bound	:99
  6. 创建另一个具有分配算法的视图,以选择 ou=people,dc=example,dc=comuid 介于 100199 之间的条目,并将该数据视图配置为将请求指向 data-source-pool-2


    $ dpconf set-ldap-data-view-prop -h host1 -p 1389 dataview-2 \
     ldap-data-source-pool:data-source-pool-2 base-dn:ou=people,dc=example,dc=com \
     distribution-algorithm:numeric numeric-attrs:uid numeric-lower-bound:100
     numeric-upper-bound	:199

    数据视图的其他属性与默认数据视图中的默认数据视图相同。

  7. 重新启动目录代理服务器实例以使更改生效(如有必要)。

    有关重新启动目录代理服务器的信息,请参见重新启动目录代理服务器

具有分层结构和分配算法的数据视图

本部分介绍如何配置一个数据视图,以便将分层结构和分配算法合并在一起。有关此类部署的信息,请参见《Sun Java System Directory Server Enterprise Edition 6.3 Reference》中的“Data Views With Hierarchy and a Distribution Algorithm”

本部分中的示例包含四个数据视图。数据视图 1 的基 DN 级别高于其他数据视图的基 DN。数据视图 3 和数据视图 4 具有相同的基 DN,但数字分配算法将条目分配到不同的数据视图中。

将从属分支配置为单独数据视图的基 DN 时,目录代理服务器将自动从数据视图中排除子树的从属分支。数字分配算法可将相同子树中的条目分配到不同的数据视图中。每组数据相等的数据源都会配置一个数据源池。

下图显示了示例部署。

图 22–2 具有分层结构和分配算法的样例数据视图

图中显示了结合使用分层结构和分配算法的数据视图样例。

Procedure配置具有分层结构和分配算法的数据视图

无法使用 DSCC 执行此任务。请使用命令行,如以下过程所述。

  1. 为每个 LDAP 服务器创建数据源,如创建和配置 LDAP 数据源所述。

  2. 创建四个数据源池,如创建和配置 LDAP 数据源池所述。

  3. 按照将 LDAP 数据源连接到数据源池的说明将数据源连接到数据源池。

    • 将包含 dc=example,dc=com 的数据源连接到 data-source-pool-1

    • 将包含 ou=computer,dc=example,dc=com 的数据源连接到 data-source-pool-2

    • 将包含 ou=people,dc=example,dc=comuid 介于 099 之间的条目的数据源连接到 data-source-pool-3

    • 将包含 ou=people,dc=example,dc=comuid 介于 100199 之间的条目的数据源连接到 data-source-pool-4

  4. (可选的)配置负载平衡。

    有关信息,请参见配置负载平衡

  5. 创建基 DN 为 dc=example,dc=com 且指向 data-source-pool-1 的数据视图。


    $ dpconf create-ldap-data-view -h host1 -p 1389 dataview-1 \
     data-source-pool-1 dc=example,dc=com
  6. 创建基 DN 为 ou=computer,dc=example,dc=com 且指向 data-source-pool-2 的数据视图。


    $ dpconf create-ldap-data-view -h host1 -p 1389 dataview-2 \
     data-source-pool-2 ou=computer,dc=example,dc=com
  7. 创建基 DN 为 ou=people,dc=example,dc=com 且指向 data-source-pool-3 的数据视图。在数据视图上配置分配算法,以选择 uid 介于 099 之间的条目。


    $ dpconf create-ldap-data-view -h host1 -p 1389 dataview-3 \
     data-source-pool-3 ou=people,dc=example,dc=com
    $ dpconf set-ldap-data-view-prop dataview-3 distribution-algorithm:numeric \
     numeric-attrs:uid numeric-lower-bound:0 numeric-upper-bound:99
  8. 创建基 DN 为 ou=people,dc=example,dc=com 且指向 data-source-pool-4 的数据视图,并在该数据视图上配置分配算法,以选择 uid 介于 100199 之间的条目。


    $ dpconf create-ldap-data-view -h host1 -p 1389 dataview-4 \
     data-source-pool-4 ou=people,dc=example,dc=com
    $ dpconf set-ldap-data-view-prop dataview-4 distribution-algorithm:numeric \
     numeric-attrs:uid numeric-lower-bound:100 numeric-upper-bound:199
  9. 通过查看 excluded-subtrees 参数,验证子树 ou=computer,dc=example, dc=comou=people,dc=example, dc=com 是否已从 dataview-1 中排除。


    $ dpconf get-ldap-data-view-prop -h host1 -p 1389 dataview-1 excluded-subtrees

    将返回已排除的子树的列表。

  10. 重新启动目录代理服务器实例以使更改生效。

    有关重新启动目录代理服务器的信息,请参见重新启动目录代理服务器