原文:http://prefetch.net/articles/monitoringldap.html
LDAP已经成为互联网标准的目录访问协议,并且用于访问一切从DNS区域文件到用户帐户信息。随着企业和软件供应商更多地依赖于LDAP目录服务器,需要测量服务器的吞吐量和性能变得势在必行。本文将介绍可用于监视LDAP目录服务器的运行状况和性能优化的工具,并且将解释随着时间的推移ORCA如何越来越多地应用到目录服务器的性能监测中。
在诊断一个LDAP服务器性能的时候,一开始通常是查看日志文件。 OpenLDAP服务器提供了一个灵活的日志子系统,并定义了几种日志级别来控制日志文件的详细程度:
级别 描述
-1 启动所有调试
0 不输出调试
1 跟踪功能调用
2 调试数据包处理
4 深度跟踪调试
8 连接管理
16 打印数据包发送和接收
32 查询过滤器处理
64 配置文件处理
128 访问控制列表处理
256 统计日志连接/操作/结果
512 发送统计日志条目
1024 打印与shell后端的通信
2048 打印条目解析调试
每个日志级别都可以附加,并且可以通过slapd.conf的“loglevel”指令进行配置,或者作为参数“-d”选项传递给slapd。下面的示例演示如何记录访问控制列表和搜索过滤器处理的详细信息:
$ slapd -4 -f /etc/slapd.conf -u openldap -g openldap \
-h "ldap://ldap.prefetch.net ldaps://ldap.prefetch.net" -d 160
OpenLDAP将默认记录所有信息到syslog的LOCAL4设备。如果你想使用一个不同的设备,你可以通过slapd的“-l”选项配置设备名。
当LDAP客户机和服务器通过路由器和防火墙分隔时,偶尔发生的网络问题(例如,丢失的TCP段或损坏的CRC)可能会导致应用程序意外的行为。为了帮助衡量一个LDAP客户机和服务器之间的延迟,我们开发了ldap-ping.pl。ldap-ping.pl是用Perl编写的,并且依赖于Time::HiRes, Getopt::Std, Net::LDAP 和Net::LDAPS模块。
ldap-ping.pl的工作原理是打开一个TCP连接到目录服务器,发出匿名绑定,搜索RootDSE,并从服务器取消绑定。这些操作使用Perl的高分辨率计时器进行测量,并以“ping”的格式进行显示:
$ ldap-ping.pl -s ldap.prefetch.net -p 389 -d 10
Querying LDAP server ldap.prefetch.net:389 every 10 seconds (Ctrl-C to stop):
Fri Nov 12 16:42:14 2004: new=0.025s, = bind=0.008s, search=0.067s, unbind=0.003s [local port=50377] [Normal Delay]
Fri Nov 12 16:42:25 2004: new=0.011s, = bind=0.001s, search=0.015s, unbind=0.001s [local port=50378] [Normal Delay]
Fri Nov 12 16:42:35 2004: new=0.010s, = bind=0.002s, search=0.015s, unbind=0.001s [local port=50379] [Normal Delay]
Fri Nov 12 16:42:45 2004: new=0.009s, = bind=0.002s, search=0.015s, unbind=0.001s [local port=50380] [Normal Delay]
ldap-ping.pl脚本接受三个参数; “-s”选项表示连接到的服务器,“-p”选项指定目录服务器监听的TCP端口,而“-d”选项允许管理员指定探测之间的延迟。如果存在二进制pfiles文件,脚本也将打印本地端口号。
OpenLDAP服务器可以被配置为通过monitor branch的指令提供实时的性能统计数据。目前可用的统计信息包括:发送的字节数,返回到客户机的条目,连接到服务器的总数,当前活动的连接,读写等待者,和个别的操作(例如,读取、搜索、修改)故障。下面的例子展示了slapd.conf中设置monitor branch的指令,并限制读取访问的IP地址为192.168.1.8:
database monitor
access to dn="cn=monitor"
by peername=192.168.1.8 read
by * none
一旦配置了monitor branch,我们可以使用“ldapsearch”工具查看所有可用的统计数据:
$ ldapsearch -x -b "cn=monitor"-H ldaps://ldap.prefetch.net objectclass=*
我们可以也通过调整search base 获取个别统计信息:
$ ldapsearch -LLL -x -b "cn=Current,cn=Connections,cn=Monitor" -H ldaps://ldap.prefetch.net objectclass=*
dn: cn=Current,cn=Connections,cn=Monitor
objectClass: top
objectClass: monitor
objectClass: extensibleObject
cn: Current
description: 46
使用ldapsearch实用程序可以让我们收集到某个时间点的性能指标快照,但是我们怎样才能利用历史数据呢?为了解决这个问题,我开发了ldap-gather.pl。ldap-gather.pl脚本从monitor branch收集统计信息,并将其写入到传递的目录参数中:
$ ldap-gather.pl -s ldap.prefetch.net -p 389 -d /usr/local/orca/var/orca/ldapallator/ldap.prefetch.net:389
初始调用ldap-gather.pl将产生一个文本文件,包含一行描述数据头,及一行实际数据:
TIMESTAMP TOTAL_CONNECTIONS BYTES_SENT COMPLETED_OPERATIONS REFERRALS_SENT ENTRIES_SENT BIND_OPERATIONS UNBIND_OPERATIONS ADD_OPERATIONS DELETE_OPERATIONS MODIFY_OPERATIONS COMPARE_OPERATIONS SEARCH_OPERATIONS
1100656501 118 649271 165 0 4620 24 24 0 0 0 0 117
如果数据文件不存在,ldap-gather.pl脚本将创建一个新的数据文件,如果该文件存在,将追加新的数据。该文件名包含单词“ldapallator”和一个日期戳(例如,filename -YYYY-MO-DD-INDEX):
$ ls -la | tail -1
-rw-r--r-- 1 orca other 6424 Nov 29 17:25 ldapallator-2004-10-29-000
若要自动在相同的时间间隔采集数据,我们可以设置一个cron作业运行ldap -gather.pl:
5,15,25,35,45,55 * * * * sh -c "/usr/local/etc/ldap-gather.pl
-s ldap.prefetch.net
-p 389 -d /usr/local/orca/var/orca/ldapallator/ldap.prefetch.net:389"
这将使ldap-gather.pl每十分钟收集一次性能数据。一旦数据被捕获,我们可以使用ORCA来生成图表性能报告。
该ORCA包中包含了一组Perl脚本和配置文件来绘制任意数据。 ORCA使用RRD存储数据,并配置了一个配置文件。 ORCA采用了典型的“configure”,“make”和“make install”步骤构建软件包。 ORCA的Perl脚本使用Data::Dumper、Digest::MD5、Math::IntervalSearch、 RRD和Storable模块,使用“makemodules_install”选项与现有的Perl安装整合。一旦安装完成,可以执行“orca”,以确保成功地完成了构建过程:
$ /usr/local/orca/bin/orca
/usr/local/orca/bin/orca: no configuration file specified
usage: /usr/local/orca/bin/orca [options] configuration_file
Options:
-daemon Run Orca in daemon mode
-gifs Output GIFs instead of PNGs
-logfile filename Output all messages
-no-html Update RRD files and images but not HTML files
-no-images Update RRD files but not image and HTML files
-once Run only once and do not continue to monitor input files
-verbose Verbose; list multiple times for increased verbosity
Orca understands the first unique command line option, i.e. -d for -daemon.
如果Perl解释器无法找到所需的模块之一,你会看到各种各样的控制台上的错误,并且进程将退出。一旦Perl解释器执行正常,我们可以创建一个ORCA配置文件,并开始收集ldap-gather.pl的数据以便进一步分析。
ORCA配置文件包含需要找到和生成图形数据的指令。该配置文件包含三个主要部分,第一部分定义了几个变量(例如,base_dir,rrd_dir,html_dir),用于控制RRD和图像文件的存储位置。本节还包含几个变量来定义ORCA生成的网页格式。
第二部分包含了一系列的“group”条目,它定义了生成图表的数据。匹配由ldap-gather.pl收集到的文件的样本组条目如下图所示:
group ldapallator {
find_files /usr/local/orca/var/orca/ldapallator/(.*)/(?:ldapallator)-\d{4}-\d{2}-\d{2}(?:-\d{3,})?(?:\.(?:Z|gz
|bz2))?
column_description first_line
date_source column_name TIMESTAMP
interval 600
filename_compare sub {
my ($ay, $am, $ad) = $a =~ /-(\d{4})-(\d\d)-(\d\d)/;
my ($by, $bm, $bd) = $b =~ /-(\d{4})-(\d\d)-(\d\d)/;
if (my $c = (( $ay <=> $by) ||
( $am <=> $bm) ||
(($ad >> 3) <=> ($bd >> 3)))) {
return 2*$c;
}
$ad <=> $bd;
}
}
在这个例子中,“find_files”关键字告诉ORCA什么文件作为输入使用(该文件与一个正则表达式匹配)。“interval”关键字定义的秒数表示在这组数据文件更新之间的间隔时间,而“column_description”描述的是列描述的位置。“column_description”值“first_line”表示该栏位说明将位于每个文件的第一行。
第三部分包含了一组plot表示图表的各条目。下面的例子显示了需要绘制目录服务器的连接数的指令:
plot {
title %g Total Connections
source ldapallator
data TOTAL_CONNECTIONS
data_type derive
line_type line2
legend Connections
y_legend Connections
data_min 0
}
“plot”关键字定义一个新的图,其中包含指定的标题“title”,“source”关键字表示此图来源的“group”条目。每个图形使用“data”关键字按名称来引用数据的特定列(例如,TOTAL_CONNECTIONS是ldap-gather.pl收集的每个数据文件的列);“data_type”关键字指定数据是否会被绘制为绝对值,以前的值的衍生物,或一个计数器。曲线图的X轴的值可以用“data_min”和 “data_max”控制;最后在ORCA创建的PNG文件中可读的图例描述。
可以调用ORCA来一次性处理数据并退出,或设置以一个守护进程运行,不断检查是否有新的数据。下面的示例运行ORCA一次性处理自上次调用以来所有的数据:
$ /bin/sh -c "cd /usr/local/orca &&/usr/local/orca/bin/orca -once /usr/local/orca/lib/ldapallator.cfg"
如果ORCA成功运行,会在“html_dir”目录中生成HTML和PNG文件。如果您不想以守护进程运行ORCA,你需要添加一个cron作业以便在相同的时间间隔内循环来处理的文件:
0 0 * * * /bin/sh -c "cd /usr/local/orca &&/usr/local/orca/bin/orca -once
/usr/local/orca/lib/ldapallator.cfg" > /dev/null 2>&1
该命令执行将在半夜运行ORCA的日常作业,并处理前一天的数据。图3包含了一个完整的ORCA配置文件,图4,图5和6包含ORCA的连接总数、总运行数和返回的条目数的图表。
图4连接总数
图5 运行总数
图6 返回的条目数
本文提供的几种监视LDAP服务器技术的概述。在我们的例子中我们用的是OpenLDAP服务器,但这些技术也适用于商业目录服务器。有关ORCA的其他信息,它可以被用来绘制任意数据,以及其它的方面,请参见参考资料。如果您对本文章存在疑问或意见,请随时给作者发E-mail。
这篇文章参考了下面的内容:
感谢克莱麦克卢尔的ldap-ping.pl原创作品,还要感谢ORCA和OpenLDAP团队成员的卓越贡献!