目錄
一、 OpenLdap簡介 1
二、 項目描述 1
三、 數據庫結構圖 2
四、 平台環境 2
1. 硬件 2
2. 軟件 2
五、 數據庫構建的過程 3
1. 安裝OS和應用軟件 3
2. 系統配置 3
3. 數據庫配置 3
4. 數據導入 7
5. 檢查LDAP上的操作和主從同步是否正確: 9
一、 OpenLdap簡介
LDAP 的英文全稱是Lightweight Directory Access Protocol(輕量級的目錄訪問協議),它基於X.500標准的,支持TCP/IP。簡單地說,LDAP其實就是數據庫三種模型中的層次型數據庫,按照樹型結構組織,由entry(條目)這種相當於關系型數據庫中記錄的數據結構組成。每個條目由多個屬性-值對組成,其中DN(區別名)屬性是標識這條記錄的關鍵字,還由一個特殊的屬性ObjectClass(對象類別)來實現的決定了該條目必須遵循的一些規則,規定了該條目必須和可選包含哪些屬性。每個屬性都可以有多個值。LDAP的數據類型不用申明默認都為字符型,除了個別還定義了一些如BIN(二進制數據)、CIS(忽略大小寫)、CES(大小寫敏感)、TEL(電話型)等。LDAP的一個很大的特點就是適合於大型OLTP的數據查詢服務,但不適合需要經常改變數據的情況。
二、 項目描述
本項目目的在於提供用戶購買會員卡進行網上信息查詢,考慮到LDAP讀快寫慢的特點,而本項目的特點就在於不頻繁地導入更新數據庫,決定采用 Openldap構建用戶信息驗證數據庫。該數據庫有兩個子樹(相當於兩個表),用戶信息樹和會員帳號樹。由於會員卡是事先批量制作流入市場,與用戶沒有固定的對應關系,只有當用戶購買會員卡並注冊一個用戶名後才能通過網絡告知系統用戶信息和會員卡號之間的這種關聯關系。於是在後台數據庫中用戶信息樹和會員帳號樹之間就通過會員卡號作為關聯關鍵字。
三、 數據庫結構圖
該數據庫的構建更能體現邏輯和功能上的模塊化。以域名info.net作為樹根,有一個系統管理員admin(DN:cn=admin,dc=info,dc=net),該庫中包括兩大子樹: people組(DN:ou=people,dc=info,dc=net),用於存放用戶信息;Account組(DN:ou=Account,dc= info,dc=net),用於存放會員卡信息。
四、 平台環境
1. 硬件
SUN sparc主機(主從同步結構)
四層交換機(SLB負載均衡)
2. 軟件
OS: solaris 8(sparc)
BerkeleyDB2.7.7(www.sleepycat.com)
Openldap1.2.11(www.openldap.org)
五、 數據庫構建的過程
1. 安裝OS和應用軟件
安裝Solaris8,BerkeleyDB2.7.7和Openldap1.2.11
Openldap1.2.11基於BerkeleyDB2.7.7之上
2. 系統配置
修改系統核心參數文件/etc/system:
加入文件句柄的軟限制和硬限制:
* set hard limit on file descriptors
set rlim_fd_max = 4096
* set soft limit on file descriptors
set rlim_fd_cur = 1024
修改核心參數需要重啟機器
3. 數據庫配置
主LDAP服務器:
Slapd.conf
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /opt/openldap/etc/openldap/slapd.at.conf
include /opt/openldap/etc/openldap/slapd.oc.conf
include /opt/openldap/etc/openldap/slapd.info.oc.conf
include /opt/openldap/etc/openldap/slapd.account.oc.conf
schemacheck on
pidfile /opt/openldap/var/slapd.pid
argsfile /opt/openldap/var/slapd.args
loglevel 8
########################################
# ldbm database definitions
########################################
database ldbm
cachesize 3000000
dbcachesize 500000000
#dbcachenowsync
timelimit 30
suffix "dc=info, dc=net"
rootdn "cn=root, dc=info, dc=net"
rootpw root
# cleartext passWords, especially for the rootdn, should
# be avoid. See slapd.conf(5) for details.
replogfile /opt/openldap/log/slapd.replog
directory /opt/openldap/data
index id,card_id,email
index default none
replica host=n.n.n..n binddn="cn=root, dc=info, dc=net" bindmethod=simple credentials=root
defaultaccess none
access to dn=".*,dc=root,dc=net"
by self read
by dn="cn=Admin,dc=root,dc=net" write
by * none
access to *
by self read
by dn="cn=Admin,dc=root,dc=net" write
by * none
該配置指定了兩個自定義schema:slapd.info.oc.conf slapd..account.oc.conf,同步的輔助服務器和一些ACL用於安全限制
輔LDAP服務器:
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /opt/openldap/etc/openldap/slapd.at.conf
include /opt/openldap/etc/openldap/slapd.oc.conf
include /opt/openldap/etc/openldap/slapd.info.oc.conf
include /opt/openldap/etc/openldap/slapd.account.oc.conf
schemacheck on
pidfile /opt/openldap/var/slapd.pid
argsfile /opt/openldap/var/slapd.args
loglevel 8
########################################
# ldbm database definitions
########################################
database ldbm
#cachesize 4000000
#dbcachesize 500000000
#dbcachenowsync
timelimit 30
suffix "dc=info, dc=net"
rootdn "cn=root, dc=info, dc=net"
rootpw root
# cleartext passwords, especially for the rootdn, should
# be avoid. See slapd.conf(5) for details.
replogfile /opt/openldap/log/slapd.replog
directory /opt/openldap/data
index id,card_id,email
index default none
updatedn "cn=root,dc=info,dc=net"
defaultaccess none
access to dn=".*,dc=info,dc=net"
by self read
by dn="cn=Admin,dc=info,dc=net" write
by * none
access to *
by self read
by dn="cn=Admin,dc=info,dc=net" write
by * none
該配置指定了主LDAP同步過來修改本機信息的權限
增加slapd.info.oc.conf:(用戶信息的配置文件)
objectclass InfoPerson
requires
objectClass,
id
allows
username,
pass,
uid,
addr,
shenfenno,
tel,
card_id
指定id字段是比不可少的,其他都為可選
增加slapd.account.oc.conf:(賬號信息配置文件)
objectclass AccountPerson
requires
objectClass,
card_id
allows
card_pass
指定了卡號和卡密碼
重新啟動LDAP SERVER:
這裡主LDAP服務器的啟動腳本如下
/etc/rc2.d/S94slapd
#!/bin/sh
#
#ident LDAP Service
case "$1" in
'start')
if [ -f /opt/openldap/etc/openldap/slapd.conf -a -f /opt/openldap/libexec/slapd ]; then
echo "LDAP service starting."
/opt/openldap/libexec/slapd -f /opt/openldap/etc/openldap/slapd.conf 1>/dev/console 2>&1 &
fi
if [ -f /opt/openldap/etc/openldap/slapd.conf -a -f /opt/openldap/libexec/slurpd ]; then
echo "LDAP sync service starting."
/opt/openldap/libexec/slurpd -f /opt/openldap/etc/openldap/slapd.conf -t /opt/openldap/log >/tmp/slurpd.log 2>&1 &
fi
;;
'stop')
[ ! -f /opt/openldap/var/slapd.pid ] && exit 0
slappid=`cat /opt/openldap/var/slapd.pid`
if [ "$slappid" -gt 0 ]; then
echo "Stopping the LDAP service."
kill -15 $slappid 2>&1 /usr/bin/grep -v "no sUCh process"
fi
slurpdpid=`/usr/bin/ps -e grep slurpd awk '{print $1}'`
if [ "$slurpdpid" -gt 0 ]; then
echo "Stopping the LDAP SYNC service."
kill -15 $slurpdpid 2>&1 /usr/bin/grep -v "no such process"
fi
;;
*)
echo "Usage: /etc/init.d/syslog { start stop }"
;;
esac
exit 0
注意:主LDAP服務器比輔LDAP服務器多啟動了一個slurpd的同步進程,而輔助服務器只需要啟動一個slapd的LDAP進程就可以了。
配置syslog:
為了記錄LDAP的日志,在slapd.conf中設置了loglevel的級別設置了8,所以可以配合操作系統的syslog做ldap的日志記錄。/etc/syslog.conf文件增加:
#log for slapd
local4.emerg;local4.alert;local4.crit;local4.err;local4.warning;local4.notice;local4.info;local4.debug /opt/openldap/log/openldap.log
注意用TAB鍵做分割,這樣重新啟動syslog進程就可以了,LDAP的日志文件在/opt/opendlap.log/openldap.log
4. 數據導入
首先用LDIF文件建立一個層次數據庫的框架:
global.ldif文件:
dn: dc=info, dc=net
objectClass: top
objectClass: organization
o: info.net
dn: ou=People, dc=info, dc=net
objectClass: top
objectClass: organizationalUnit
ou: People
description: User Info
dn: cn=Admin, dc=info, dc=net
objectClass: top
objectClass: person
objectClass: organizationalPerson
cn: Admin
sn: Admin
userPassword: Admin
description: Administrator for info.net
dn: ou=Account, dc=info, dc=net
objectClass: top
objectClass: organizationalUnit
ou: Account
description: Card Account
用在線命令(即LDAP服務開啟的狀態下)
/opt/openldap/bin/ldapadd -D "cn=root,dc=info,dc=net" -w root –f global.ldif
可以建立該數據庫的框架。
接下來可以加入數據庫的數據:
data.ldif文件:
dn: id=1, ou=people, dc=info, dc=net
objectclass: top
objectclass: InfoPerson
id: 1
username: 張三
tel:021-63138990
card_id:ABC001
dn: card_id=ABC001, ou=Account, dc=info, dc=net
objectclass: top
objectclass: AccountPerson
card_id: ABC001
card_pass ABC123
加入了用戶id為1的用戶和卡號為ABC001的會員卡,並且該用戶和該卡通過卡號ABC001相關聯
如果導入的數據量大,並且要求實效性很強,用在線命令導入就會占用很長的時間,為了快速批量導入,可以在LDAP服務關閉的狀態下使用非在線命令導入數據:
cp global.ldif /tmp/info.ldif
cat data.ldif >> /tmp/info.ldif //現在info.ldif為全部信息的LDIF文件
/etc/rc2.d/S94slapd stop 應該在LDAP進程關閉的情況下導入:
/opt/openldap/sbin/ldif2ldbm -i /tmp/info.ldif -f /opt/openldap/etc/openldap/slapd.conf //將文本LDIF文件轉換成LDBM的二進制文件
/etc/rc2.d/S94slapd start
有時為了在原數據庫的基礎上繼續追加數據,可以:
1./opt/openldap/sbin/ldbmcat -n /opt/openldap/data/id2entry.dbb > n_id2entry(先將LDBM庫導出無序號的LDIF文件,LDIF文件是一種有格式的文本文件)
2.追加LDIF文件
3//opt/openldap/sbin/ldif2ldbm -i n_id2entry -f /opt/openldap/etc/openldap/slapd.conf(在LDAP服務關閉的情況下批量導入)
有時可能會發覺索引比較紊亂,以至於在LDAP下無法查詢到相關FILTER的記錄,為了重建索引,可以:
1./opt/openldap/sbin/ldbmcat /opt/openldap/data/id2entry.dbb > id2entry (導出有序號的LDIF文件)
2./opt/openldap/sbin/ldif2index -i id2entry -f /opt/openldap/etc/openldap/slapd.conf <索引關鍵字> (重建索引,索引關鍵字在slapd.conf文件中用index指定)
具體這些二進制數據的存放都在openldap/data下
5. 檢查LDAP上的操作和主從同步是否正確:
可用以下命令來測試數據庫的增加、刪除、修改和查詢:
1.查詢命令
/opt/openldap/bin/ldapsearch -D "cn=Admin,dc=info,dc=net" -w Admin id=”1”
/opt/openldap/bin/ldapsearch -D "cn=Admin, dc=info, dc=net" -w Admin -b "ou= Account,dc=info,dc=net" "card_id=ABC001"
2.增加命令
/opt/openldap/bin/ldapadd -D "cn=root,dc=info,dc=net" -w root -f add.ldif
3.刪除命令
/opt/openldap/bin/ldapdelete -D "cn=root,dc=info,dc=net" -w root "id=1,ou=People,dc=info,dc=net"
4.修改命令
/opt/openldap/bin/ldapmodify -D "cn=Admin,dc=info,dc=net" -w Admin -f modfile
modfile的格式如下:
dn: id=1, ou=People, dc=info, dc=net
add: shenfenno
shenfenno: 3101037108002
dn: card_id=ABC001, ou=Account, dc=info, dc=net
replace: card_pass
card_pass: DEF001
5.同步測試
在主LDAP服務器上做了增加、刪除或修改的操作,用查詢命令查看主從LDAP服務器的信息是否一致(自動同步)
同步日志在/opt/openldap/log/replica下,不同步的出錯日志在/opt/openldap/log/replica下的以輔助IP 地址開頭的.rej文件。而/opt/openldap/log/replica下的slurpd.status反應的是同步時間戳,如果你有多台輔助 LDAP服務器,通過查看該文件的時間戳是否一致也可以判斷哪台服務器沒有同步成功
有時可能會發覺索引比較紊亂,以至於在LDAP下無法查詢到相關FILTER的記錄,為了重建索引,可以:
1./opt/openldap/sbin/ldbmcat /opt/openldap/data/id2entry.dbb > id2entry (導出有序號的LDIF文件)
2./opt/openldap/sbin/ldif2index -i id2entry -f /opt/openldap/etc/openldap/slapd.conf <索引關鍵字> (重建索引,索引關鍵字在slapd.conf文件中用index指定)
具體這些二進制數據的存放都在openldap/data下
5. 檢查LDAP上的操作和主從同步是否正確:
可用以下命令來測試數據庫的增加、刪除、修改和查詢:
1.查詢命令
/opt/openldap/bin/ldapsearch -D "cn=Admin,dc=info,dc=net" -w Admin id=”1”
/opt/openldap/bin/ldapsearch -D "cn=Admin, dc=info, dc=net" -w Admin -b "ou= Account,dc=info,dc=net" "card_id=ABC001"
2.增加命令
/opt/openldap/bin/ldapadd -D "cn=root,dc=info,dc=net" -w root -f add.ldif
3.刪除命令
/opt/openldap/bin/ldapdelete -D "cn=root,dc=info,dc=net" -w root "id=1,ou=People,dc=info,dc=net"
4.修改命令
/opt/openldap/bin/ldapmodify -D "cn=Admin,dc=info,dc=net" -w Admin -f modfile
modfile的格式如下:
dn: id=1, ou=People, dc=info, dc=net
add: shenfenno
shenfenno: 3101037108002
dn: card_id=ABC001, ou=Account, dc=info, dc=net
replace: card_pass
card_pass: DEF001
5.同步測試
在主LDAP服務器上做了增加、刪除或修改的操作,用查詢命令查看主從LDAP服務器的信息是否一致(自動同步)
同步日志在/opt/openldap/log/replica下,不同步的出錯日志在/opt/openldap/log/replica下的以輔助IP 地址開頭的.rej文件。而/opt/openldap/log/replica下的slurpd.status反應的是同步時間戳,如果你有多台輔助 LDAP服務器,通過查看該文件的時間戳是否一致也可以判斷哪台服務器沒有同步成功
有時可能會發覺索引比較紊亂,以至於在LDAP下無法查詢到相關FILTER的記錄,為了重建索引,可以:
1./opt/openldap/sbin/ldbmcat /opt/openldap/data/id2entry.dbb > id2entry (導出有序號的LDIF文件)
2./opt/openldap/sbin/ldif2index -i id2entry -f /opt/openldap/etc/openldap/slapd.conf <索引關鍵字> (重建索引,索引關鍵字在slapd.conf文件中用index指定)
具體這些二進制數據的存放都在openldap/data下
5. 檢查LDAP上的操作和主從同步是否正確:
可用以下命令來測試數據庫的增加、刪除、修改和查詢:
1.查詢命令
/opt/openldap/bin/ldapsearch -D "cn=Admin,dc=info,dc=net" -w Admin id=”1”
/opt/openldap/bin/ldapsearch -D "cn=Admin, dc=info, dc=net" -w Admin -b "ou= Account,dc=info,dc=net" "card_id=ABC001"
2.增加命令
/opt/openldap/bin/ldapadd -D "cn=root,dc=info,dc=net" -w root -f add.ldif
3.刪除命令
/opt/openldap/bin/ldapdelete -D "cn=root,dc=info,dc=net" -w root "id=1,ou=People,dc=info,dc=net"
4.修改命令
/opt/openldap/bin/ldapmodify -D "cn=Admin,dc=info,dc=net" -w Admin -f modfile
modfile的格式如下:
dn: id=1, ou=People, dc=info, dc=net
add: shenfenno
shenfenno: 3101037108002
dn: card_id=ABC001, ou=Account, dc=info, dc=net
replace: card_pass
card_pass: DEF001
5.同步測試
在主LDAP服務器上做了增加、刪除或修改的操作,用查詢命令查看主從LDAP服務器的信息是否一致(自動同步)
同步日志在/opt/openldap/log/replica下,不同步的出錯日志在/opt/openldap/log/replica下的以輔助IP 地址開頭的.rej文件。而/opt/openldap/log/replica下的slurpd.status反應的是同步時間戳,如果你有多台輔助 LDAP服務器,通過查看該文件的時間戳是否一致也可以判斷哪台服務器沒有同步成功