OpenLDAPサーバーの二重化

OpenLDAP のsyncrepl と keepalived を使って、OpenLDAPのフェイルオーバーを実現するときのメモ。OSは、CentOS4.5。

マシンは2台で以下のとおり。

ldap01 eth0: 192.168.244.101/24

ldap02 eth0: 192.168.244.102/24

virtual ip は、 192.168.244.100/24

# yum -y install keepalived
  • 設定

/etc/keepalived/keepalived.conf は以下のとおり
2台とも同じ設定ファイルにしてOK。先に起動した方がマスターになる。

! Configuration File for keepalived

global_defs {
   notification_email {
     foo@foo.bar
   }
   notification_email_from foo@foo.bar
   smtp_server localhost
   smtp_connect_timeout 30
   router_id MY_LDAP
}

vrrp_instance my_ldap {
    state BACKUP
    interface eth0
    garp_master_delay 5
    virtual_router_id 1
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.244.100/24 dev eth0
    }
    notify_master "/etc/keepalived/ldap.sh active"
    notify_backup "/etc/keepalived/ldap.sh backup"
    notify_fault  "/etc/keepalived/ldap.sh fault"
    notify        "/etc/keepalived/ldap.sh status"
}


サーバーの状態が変わったときに呼び出されるスクリプトは任意のものを指定できる。
/etc/keepalived/ldap.sh は以下のとおり。

#!/bin/bash

case "$1" in
  active)
    logger ">>active"
    cd /etc/openldap
    ln -sf slapd.conf.master slapd.conf
    logger "result $?"
    service ldap stop
    service ldap start
    logger "<<active"
    ;;
  backup)
    logger ">>backup"
    cd /etc/openldap
    ln -sf slapd.conf.slave slapd.conf
    logger "result $?"
    service ldap stop
    service ldap start
    logger "<<backup"
    ;;
  status)
    logger ">>status"
    logger "<<status"
    ;;
  fault)
    logger ">>fault"
    logger "<<fault"
    ;;
esac

あらかじめ、OpenLDAPのマスター用の設定ファイルと、スレーブ用の設定ファイルを、

/etc/openldap/slapd.conf.master
/etc/openldap/slapd.conf.slave

という名前で用意しておき、slapd.conf はシンボリックリンクにして切り替える方法を考えてみた。

/etc/openldap/slapd.conf.master の内容は以下。

前略
# For master
index entryCSN,entryUUID                eq

設定の最後に追加するだけ。

/etc/openldap/slapd.conf.slave の内容は以下。
設定の最後に以下を追加するだけ。

前略

# For slave
index entryCSN,entryUUID                eq
syncrepl rid=137
    provider=ldap://master.rukatan.com:389
    type=refreshOnly
    searchbase="dc=rukatan,dc=com"
    schemachecking=off
    bindmethod=simple
    binddn="cn=root,dc=rukatan,dc=com"
    credentials=********

設定は、syncrepl を利用している。