Linux服務器具有低成本、性能卓越、代碼開放等特性。越來越多的企業正在准備或已經采用Linux擔起了企業應用服務器的重任。本文要介紹的是筆者在實際工作中,采用Linux和其它開放套件共同部署高可靠性LDAP認證服務的實例。 系統所要用到的軟件包括:◆ Red Hat 7.2;◆ OpenLDAP 2.1,www.openldap.org;◆ Heartbeat 1.04,www.linux-ha.org。 合理的流程提供高可靠性 OpenLDAP在該系統的網絡應用體系中用於對所有應用提供統一的身份認證服務,還包括如郵件路由、地址、聯系人信息等其它信息的查詢。LDAP作為一種特殊的數據庫,通過對讀取、查詢操作進行特別的優化和處理,以保證在查詢速度方面的優勢,所以特別適合用來統一企業的各種認證服務,從而規范各種業務系統的同一登錄身份和口令。當然,它的缺點和優點一樣明顯,比如不善於update、insert等操作,但是如果把它作為中央認證數據庫,則正好可以利用它的長處而回避它的弱點。 由於系統采用了LDAP作為所有應用的中央認證數據庫,一旦該LDAP服務器失效,則系統網絡環境中所有依賴於該數據庫的應用都會受到影響,甚至停止提供相應的服務。為了避免這種情況的發生,就要通過兩台LDAP服務器建立一個高可靠性的認證數據庫集群,同時對其它應用系統提供統一的數據庫訪問網絡接口。系統網絡結構圖如圖1。 圖1 系統網絡結構圖從圖1可以看到,整個系統分為三層:應用服務器、數據庫中間引擎和OpenLDAP數據庫集群。所有的應用服務器通過數據庫中間引擎(midd)來訪問192.168.1.200,並通過這一統一的數據庫網絡接口來訪問LDAP數據庫。對於系統的要求是,正常情況下master服務器(192.168.1.100)綁定在192.168.1.200上提供服務,slave服務器處於備機狀態,一旦master發生故障,slave 能夠自動接管任務,同時通過某種通信方式通知系統管理員(如郵件、手機短信)。 這裡,midd數據庫中間引擎是根據需要編寫的一個簡單工具,使用它要達到以下幾個目的:◆ 統一應用服務器上的應用程序訪問各種數據庫的接口。例如,以後有可能將後台的LDAP數據庫換為其它數據庫,如Oracle等,這時只需要更改midd的配置文件,而不需要對應用程序進行任何更改。◆ 通過采用進程池的方式來提供應用程序的查詢速度。midd能通過對前端應用程序的訪問負載,自動調節進程池的進程數量。同時進程池中的每個進程和後台的LDAP數據庫保持一個長連接,這樣可以避免一般條件下每次查詢都要開一個連接的資源浪費和延時。◆ 每個應用服務器上都部署一個midd。這樣應用程序每次請求的時候都是通過本地IPC與midd進行通信,避免了TCP方式連接的開銷。◆ midd在兩台LDAP數據庫active-active模式下的應用模式。midd根據啟動時的參數能夠自動區別讀、寫請求,會將寫請求分配到 Master LDAP數據庫上,這是由於Slave LDAP數據庫只能進行讀操作。在整個網絡負載大、兩台LDAP數據庫同時提供服務的情況下,使用midd的這一模式,可以避免Slave LDAP數據庫不能更改數據導致兩台服務器不能保持數據同步的問題。 根據以上流程的要求,系統必須解決兩個問題,首先是由於作為LDAP數據庫的兩台服務器並沒有實現存儲共享,因此要求 master和slave兩台數據庫服務器的數據必須實時同步,才能保證一旦slave接管任務後能夠提供完整的服務。其次,master和slave必須能夠實時檢測對方的健康狀態,一旦發現對方有故障,自己能夠接管各種任務,包括切換虛擬IP地址、LDAP服務(變為主LDAP服務,意味著其能對寫進行操作,從而要求master服務器恢復後必須先和slave進行一次數據同步),以及通過rsh方式來執行其它遠程應用服務器上的midd啟動模式(在 active-active模式下)。 下面就將解決以上數據同步和任務接管兩個問題。 主、從LDAP服務器的數據同步 OpenLDAP本身提供了一種復制機制來保證網絡上主、從節點之間的數據同步。slurpd守護程序實現了這一功能,它通過定期活動檢查主服務器master上的日志文件,檢查master上的數據是否有更新。如果有更新,那麼把更新的數據傳遞到各個從服務器。讀(查詢)請求可以由LDAP數據群中的任一服務器應答,但寫操作(update、insert)只能在主服務器master上進行,這就是為什麼midd數據庫中間引擎必須采用不同的啟動模式來處理讀寫的原因。 下面主要說明主、從LDAP服務器的配置過程。有關OpenLDAP的安裝過程可以查看http://www.openldap.org上的安裝文檔,本文不再贅述。將OpenLDAP安裝到兩台服務器上,並對它們分別進行主、從配置。 1.主LDAP服務器(master)上的配置文件如下,這是一個簡單的配置例子。配置文件名: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" # 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=test2.從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數據庫服務器已經達到了數據同步復制的效果。
Linux服務器具有低成本、性能卓越、代碼開放等特性。越來越多的企業正在准備或已經采用Linux擔起了企業應用服務器的重任。本文要介紹的是筆者在實際工作中,采用Linux和其它開放套件共同部署高可靠性LDAP認證服務的實例。 系統所要用到的軟件包括:◆ Red Hat 7.2;◆ OpenLDAP 2.1,www.openldap.org;◆ Heartbeat 1.04,www.linux-ha.org。 合理的流程提供高可靠性 OpenLDAP在該系統的網絡應用體系中用於對所有應用提供統一的身份認證服務,還包括如郵件路由、地址、聯系人信息等其它信息的查詢。LDAP作為一種特殊的數據庫,通過對讀取、查詢操作進行特別的優化和處理,以保證在查詢速度方面的優勢,所以特別適合用來統一企業的各種認證服務,從而規范各種業務系統的同一登錄身份和口令。當然,它的缺點和優點一樣明顯,比如不善於update、insert等操作,但是如果把它作為中央認證數據庫,則正好可以利用它的長處而回避它的弱點。 由於系統采用了LDAP作為所有應用的中央認證數據庫,一旦該LDAP服務器失效,則系統網絡環境中所有依賴於該數據庫的應用都會受到影響,甚至停止提供相應的服務。為了避免這種情況的發生,就要通過兩台LDAP服務器建立一個高可靠性的認證數據庫集群,同時對其它應用系統提供統一的數據庫訪問網絡接口。系統網絡結構圖如圖1。 圖1 系統網絡結構圖從圖1可以看到,整個系統分為三層:應用服務器、數據庫中間引擎和OpenLDAP數據庫集群。所有的應用服務器通過數據庫中間引擎(midd)來訪問192.168.1.200,並通過這一統一的數據庫網絡接口來訪問LDAP數據庫。對於系統的要求是,正常情況下master服務器(192.168.1.100)綁定在192.168.1.200上提供服務,slave服務器處於備機狀態,一旦master發生故障,slave 能夠自動接管任務,同時通過某種通信方式通知系統管理員(如郵件、手機短信)。 這裡,midd數據庫中間引擎是根據需要編寫的一個簡單工具,使用它要達到以下幾個目的:◆ 統一應用服務器上的應用程序訪問各種數據庫的接口。例如,以後有可能將後台的LDAP數據庫換為其它數據庫,如Oracle等,這時只需要更改midd的配置文件,而不需要對應用程序進行任何更改。◆ 通過采用進程池的方式來提供應用程序的查詢速度。midd能通過對前端應用程序的訪問負載,自動調節進程池的進程數量。同時進程池中的每個進程和後台的LDAP數據庫保持一個長連接,這樣可以避免一般條件下每次查詢都要開一個連接的資源浪費和延時。◆ 每個應用服務器上都部署一個midd。這樣應用程序每次請求的時候都是通過本地IPC與midd進行通信,避免了TCP方式連接的開銷。◆ midd在兩台LDAP數據庫active-active模式下的應用模式。midd根據啟動時的參數能夠自動區別讀、寫請求,會將寫請求分配到 Master LDAP數據庫上,這是由於Slave LDAP數據庫只能進行讀操作。在整個網絡負載大、兩台LDAP數據庫同時提供服務的情況下,使用midd的這一模式,可以避免Slave LDAP數據庫不能更改數據導致兩台服務器不能保持數據同步的問題。 根據以上流程的要求,系統必須解決兩個問題,首先是由於作為LDAP數據庫的兩台服務器並沒有實現存儲共享,因此要求 master和slave兩台數據庫服務器的數據必須實時同步,才能保證一旦slave接管任務後能夠提供完整的服務。其次,master和slave必須能夠實時檢測對方的健康狀態,一旦發現對方有故障,自己能夠接管各種任務,包括切換虛擬IP地址、LDAP服務(變為主LDAP服務,意味著其能對寫進行操作,從而要求master服務器恢復後必須先和slave進行一次數據同步),以及通過rsh方式來執行其它遠程應用服務器上的midd啟動模式(在 active-active模式下)。 下面就將解決以上數據同步和任務接管兩個問題。 主、從LDAP服務器的數據同步 OpenLDAP本身提供了一種復制機制來保證網絡上主、從節點之間的數據同步。slurpd守護程序實現了這一功能,它通過定期活動檢查主服務器master上的日志文件,檢查master上的數據是否有更新。如果有更新,那麼把更新的數據傳遞到各個從服務器。讀(查詢)請求可以由LDAP數據群中的任一服務器應答,但寫操作(update、insert)只能在主服務器master上進行,這就是為什麼midd數據庫中間引擎必須采用不同的啟動模式來處理讀寫的原因。 下面主要說明主、從LDAP服務器的配置過程。有關OpenLDAP的安裝過程可以查看http://www.openldap.org上的安裝文檔,本文不再贅述。將OpenLDAP安裝到兩台服務器上,並對它們分別進行主、從配置。 1.主LDAP服務器(master)上的配置文件如下,這是一個簡單的配置例子。配置文件名: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" # 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=test2.從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數據庫服務器已經達到了數據同步復制的效果。