include /Opt/LDAP/etc/openldap/schema/core.schema include /Opt/LDAP/etc/openldap/schema/corba.schema include /Opt/LDAP/etc/openldap/schema/cosine.schema include /Opt/LDAP/etc/openldap/schema/inetorgperson.schema include /Opt/LDAP/etc/openldap/schema/java.schema include /Opt/LDAP/etc/openldap/schema/nis.schema include /Opt/LDAP/etc/openldap/schema/misc.schema include /Opt/LDAP/etc/openldap/schema/mail.schema include /Opt/LDAP/etc/openldap/schema/openldap.schema access to * by self write by dn.base="cn=Manager,dc=yourdomain,dc=com" write by * read pidfile /Opt/LDAP/var/slapd.pid argsfile /Opt/LDAP/var/slapd.args # ldbm database definitions #database bdb database ldbm suffix "dc=yourdomain,dc=com" rootdn "cn=Manager,dc=yourdomain,dc=com" # Cleartext passwords, especially for the rootdn, should # be avoid. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. rootpw test # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd/tools. Mode 700 recommended. replogfile /Opt/LDAP/var/slapd.replog directory /Opt/LDAP/var/ldbm # Indices to maintain access to attr=userPassword by self write by anonymous auth by dn.base="cn=Manager,dc=yourdomain,dc=com" write by * none access to * by self write by dn.base="cn=Manager,dc=yourdomain,dc=com" write by * node index objectClass eq replica host=slave:389 binddn="cn=Manager,dc=yourdomain,dc=com" bindmethod=simple credentials=test |
2.从LDAP服务器(slave)上的配置文件。
配置文件名:slapd.conf
文件内容:
include /Opt/LDAP/etc/openldap/schema/core.schema include /Opt/LDAP/etc/openldap/schema/corba.schema include /Opt/LDAP/etc/openldap/schema/cosine.schema include /Opt/LDAP/etc/openldap/schema/inetorgperson.schema include /Opt/LDAP/etc/openldap/schema/java.schema include /Opt/LDAP/etc/openldap/schema/nis.schema include /Opt/LDAP/etc/openldap/schema/misc.schema include /Opt/LDAP/etc/openldap/schema/mail.schema include /Opt/LDAP/etc/openldap/schema/openldap.schema access to * by self write by dn.base="cn=Manager,dc=yourdomain,dc=com" write by * read pidfile /Opt/LDAP/var/slapd.pid argsfile /Opt/LDAP/var/slapd.args # ldbm database definitions #database bdb database ldbm suffix "dc=yourdomain,dc=com" rootdn "cn=Manager,dc=yourdomain,dc=com" rootpw test #replogfile /Opt/LDAP/var/slapd.replog directory /Opt/LDAP/var/ldbm access to attr=userPassword by self write by anonymous auth by dn.base="cn=Manager,dc=yourdomain,dc=com" write by * none access to * by self write by dn.base="cn=Manager,dc=yourdomain,dc=com" write by * read index objectClass eq access to * by self read by dn="cn=Manager,dc=yourdomain,dc=com" write by * none updatedn "cn=Manager,dc=yourdomain,dc=com" |
分别对主、从LDAP数据库进行配置后,初始化主LDAP数据库中的数据,可以利用OpenLDAP本身提供的工具完成。
3.数据同步。
在运行主、从模式前,必须先将主、从LDAP服务器上的数据同步。可以通过把master上的数据文件(本例中是ldbm目录下的所有文件)直接拷贝到从LDAP服务器上,实现节点数据的完全一致。
4.启动服务
分别启动服务,测试数据的同步是否有效。先启动主LDAP服务器上的两个进程:
#/opt/LDAP/libexec/slapd -f /opt/LDAP/etc/openldap/slapd.conf -d 5 > /dev/null 2>&1 &
#/opt/LDAP/libexec/slurpd -f /opt/LDAP/etc/openldap/slapd.conf -d 5 > /dev/null 2>&1 &
然后启动从LDAP服务器上的进程:
#/opt/LDAP/libexec/slapd -f /opt/LDAP/etc/openldap/slapd.conf -d 5 > /dev/null 2>&1 &
对主LDAP服务器上的数据进行各种更新操作,包括增加、删除、修改等动作,然后在从LDAP服务器上查看数据是否保持与主LDAP服务器同步更新。通过以上测试,主、从LDAP数据库服务器已经达到了数据同步复制的效果。
使用Heartbeat实现自动检测和任务接管
1.Linux下HA软件简要介绍
(1)The High Availability Linux Project
其Heartbeat软件不仅可以作为高可靠性的HA软件独立使用,也可以配合其它IP分发器做Balancing Cluster应用。参见http://www.linux-ha.org。
(2)Lifekeeper
Lifekeeper是一款著名的高可靠性软件,能支持32个节点的应用,支持Linux、x86 Solaris和Windows等操作系统。参见http://oss.missioncriticallinux.com/projects/kimberlite。
(3)SRRD
SRRD(Service Routing Redundancy Daemon),支持PKI、SSL的通信认证。参见http://srrd.org/。
这里选择Linux-HA提供的Heartbeat HA软件来实现该系统的高可靠性,软件名Heartbeat,当前最新版本为1.2。Heartbeat通过监控几个节点的状态来进行管理操作,监控方式支持串行线和以太网作为媒介的通信,这里使用以太网链路。在集群中的每个节点运行一个守护程序进程,名为heartbeat。主守护程序派生子进程,以对每个heartbeat媒介进行读写,并派生状态进程。当检测到节点终止时,heartbeat运行Shell脚本实现资源任务的切换和接管,从而保证了整个系统的高可靠性。
2.下载安装Heartbeat
可以从http://www.linux-ha.org/download/下载最新的安装包,包括src和rpm。本例下载了heartbeat-1.0.4.tar.gz包进行安装,具体操作如下:
#./configure -prefix=/opt/ha #make #make install |
在此过程中,系统可能会提醒安装其它依赖软件包,比如libnet等,按照提示进行下载安装即可。安装完成后在/opt/ha目录下将产生相关子目录。进入/opt/ha/etc/ha.d,在该目录下创建以下文件:ha.cf、authkeys、haresources、myexec。
3.master配置说明:
(1)ha.cf
logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 warntime 10 initdead 120 ucast eth0 192.168.1.101 nice_failback on//保证slave变为master后, 即使master恢复启动服务也不转移,从而保证LDAP数据同步。 node master node slave |
(2)authkeys
auth 3
3 md5 test
(3)haresources
master 192.168.1.200 myexec
(4)进入/opt/ha/etc/ha.d/resource.d,创建执行脚本myexec。
当Heartbeat软件监控到其它节点出现故障时,会执行该脚本并完成以下工作:如果本机是主LDAP服务器,则必须以某种方式(邮件或手机短信)来通知系统管理员,备用服务器出现故障;如果是从服务器监控到主服务器不可用状态,则必须以主LDAP模式启动LDAP服务,并通过rsh重新启动远程midd启动模式。
主LDAP服务器上的myexec文件内容如下:
MASNODE='master' PIDFILE=/Opt/LDAP/var/slapd.pid APP=/Opt/LDAP/libexec/slapd SLURP=/Opt/LDAP/libexec/slurpd MASTER=/Opt/LDAP/etc/openldap/slapd.master.conf SLAVE=/Opt/LDAP/etc/openldap/slapd.slave.conf . /opt/ha/etc/ha.d/shellfuncs test_start () { # first we kill everything possible ha_log "info: $0: Starting" if [ -f $PIDFILE ]; then PID=`head -1 $PIDFILE` ha_log "info: $0: Appears to already be running, killing [$PID]" kill -9 $PID > /dev/null rm $PIDFILE fi # slurpd should die when the slapd process does, but just in case: for i in `ps -ef | grep slurp | grep -v grep | awk '{print $2}' ` do kill -9 $i done # slight delay to allow for stability sleep 2 # now we will attempt to start as a master $APP -f $MASTER //启动slapd if [ ! -f $PIDFILE ]; then ha_log "warn: $0: Slapd did not start properly" #exit 1 fi # Now we determine if this is the primary or secondary node # first wait a bit for stability sleep 10 # if we are secondary, do nothing: otherwise if [ $HA_CURHOST == $MASNODE ]; then /usr/bin/rsh slave '/opt/ha/etc/ha.d/resource.d/slapd.slave ' &//启动从服务器上的LDAP /usr/bin/rsh mailserver '/opt/sbin/midd -m master -s slave' & //启动midd $SLURP -f $MASTER //启动主服务器上的复制进程 else ha_log "warn: $0: slave node is not responding" fi } test_stop () { ha_log "info: $0: Shutting down" if [ -f $PIDFILE ]; then PID=`head -1 $PIDFILE` kill -9 $PID > /dev/null rm $PIDFILE fi # Let's be sure it's dead, Jim for i in `ps -ef | grep slap | grep -v grep | awk '{print $2}' ` do kill -9 $i done for i in `ps -ef | grep slurp | grep -v grep | awk '{print $2}' ` do kill -9 $i done } # See how we were called. case "$1" in start) test_start ;; stop) test_stop ;; restart) $0 stop $0 start ;; status) if [ -f $PIDFILE ]; then echo running else echo stopped fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0 |
(5)创建/opt/ha/etc/ha.d/resource.d/slapd.slave文件。
#/bin/sh /opt/LDAP/libexec/slapd -f /opt/LDAP/etc/openldap/ slapd.slave.conf -d 5 > /dev/null 2>&1 & |
至此,主服务器配置完成。
slave服务器上的配置和master服务器的完全一样,差别仅在于将“master”改为“slave”。同时要注意,一是两台服务器上必须能够执行rsh;二是在几个节点中,能通过设置的主机名互相解析到对方的IP地址。这样,整个系统的HA就配置完成。
(6)启动heartbeat
首先执行#kill slapd,再启动master上的heartbeat:
#/etc/init.d/heartbeat start
然后启动slave上的heartbeat:
#/etc/init.d/heartbeat start
执行#tail -f /var/log/ha-log,确定服务是否正常启动。如果正常运行,那么当前的状态是master提供主LDAP服务;slave提供从LDAP服务。
测试
1.假设master服务器上的heartbeat停止服务
执行#/etc/init.d/heartbeat stop。该测试期望的状态是,由slave接替master的服务,变为主LDAP服务。可以通过查看日志来确定是否发生了预期的结果。
在这种情况下,由于master本身没断线,只是heartbeat服务停止,所以当slave变为主LDAP服务时,会同时通过rsh命令把master作为从LDAP服务启动。这时即使master重新启动heartbeat,当前的主、从模式也不会改变,即slave服务器还是作为主LDAP服务运行,而master服务器作为从LDAP服务运行,从而保证了两台服务器的数据同步不会因此发生混乱。
2.假设master系统的网络出现故障(拔掉网线)
测试中将master的网线拔掉,但是各种进程依然在运行。当slave变为主LDAP服务时,由于slave检测到master死去,所以在变为主LDAP服务的时候没有启动slurpd数据同步进程。这时更新slave上的数据,然后恢复master的网络(插上网线),观察发现master重新变为主LDAP服务器,slave重新变为从LDAP服务器。这会导致数据同步出现问题,当slave是主服务时更新的数据,没有在master中更新。
3.假设master系统完全崩溃(断掉电源)
两台服务器正常启动后,reboot主服务器master。这时的slave会和第2种情况一样,变为主LDAP服务器,也没有启动slurpd进程。更新此时的LDAP数据库,当master重新启动后,在没有启动heartbeat进程的情况下,slave服务没有任何变化。启动master上的beartbeat服务,仍然没有变化。这时,只能在保持slave为主LDAP服务的前提下,手工启动两个LDAP进程来恢复数据同步。具体做法是,在slave服务器上启动slurpd,在master服务器上启动slapd slave模式的服务,以达到数据同步的目的。
同步后,停止启动master上的heartbeat,对slave上的heartbeat服务实行restart。这时的结果是满意的,master又重新获得了主LDAP服务的控制权,slave作为从LDAP服务进程启动,同时不间断LDAP服务。
通过以上测试可知,要解决的问题是第2种情况下怎样才能保证数据同步,以及第3种情况下master服务器启动后slave能够自动启动slurpd服务。
对于第2种情况,由于两个节点间通信的失败导致两台机器都以为对方出现故障,从而试图由自己充当主节点,最终导致资源出现竞争状态和数据同步发生混乱。解决这个问题的一个办法是,通过多种通信手段来实现网络检测,从而避免由于暂时的网络问题导致这种情况的出现。
对于第3种情况,可以不管master是否存在,只要服务器作为主LDAP启动时启动slurpd进程,就可以保证slurpd进程的存在(修改slapd脚本)。对于从故障中恢复的服务器,可以手工启动从LDAP服务模式,也可以放在系统启动脚本中,来保证恢复后LDAP服务的存在。