そろそろLDAPにしてみないか?

第21回(最終回) OpenLDAPの冗長化対策【3】

この記事を読むのに必要な時間:およそ 6 分

ミラーモードのマルチマスター的使用方法

前述のように,OpenLDAPのミラーモードは一般的なマルチマスターを意味するわけではありません。

したがって,ロードバランサ配下のWebサーバを追加する時のように,同構成のLDAPサーバを手軽に増やすことはできません。なぜなら,ロードバランサによって更新用トラフィックが両ノードに振り分けられ,運悪くまったく同じタイミングで更新処理が発生した場合,全体の整合性がとれなくなってしまう可能性があるためです。

しかし,言い換えれば,同時更新が発生しないなど,更新処理の頻度が多くない条件下であれば,ミラーモードをあたかもマルチマスターのような形で使用することができます。

重要なのは,この同時更新のタイミングについてなのですが,実際に複数のサーバで同時更新を行い,どれくらいの更新頻度があれば不整合が発生するのか実験してみました.

まず,ミラーモード用の設定は次のようになります。前回のsyncrepl設定に似ていますが,CentOS-5.3に含まれるOpenLDAPは2.3系であるため,ミラーモードがサポートされていません。そこで今回はVMware上にFedora Core 11を準備して実験を行いました。ノード名はcl1,cl2としました。

リスト1 cl1というノードのslapd.conf

include		/etc/openldap/schema/corba.schema 
include		/etc/openldap/schema/core.schema 
include		/etc/openldap/schema/cosine.schema 
include		/etc/openldap/schema/duaconf.schema 
include		/etc/openldap/schema/dyngroup.schema 
include		/etc/openldap/schema/inetorgperson.schema 
include		/etc/openldap/schema/java.schema 
include		/etc/openldap/schema/misc.schema 
include		/etc/openldap/schema/nis.schema 
include		/etc/openldap/schema/openldap.schema 
include		/etc/openldap/schema/ppolicy.schema 
include		/etc/openldap/schema/collective.schema 

allow		bind_v2 
database	monitor 
database	bdb 
suffix		"dc=example,dc=com" 
rootdn		"cn=Manager,dc=example,dc=com" 
rootpw		secret 
directory	/var/lib/ldap 
loglevel	256 
moduleload	syncprov.la 

# Indices to maintain for this database 
index objectClass                       eq,pres 
index ou,cn,mail,surname,givenname      eq,pres,sub 
index uidNumber,gidNumber,loginShell    eq,pres 
index uid,memberUid                     eq,pres,sub 
index nisMapName,nisMapEntry            eq,pres,sub 
index entryUUID                         eq,pres 

overlay syncprov 

# それぞれのノードでユニークなサーバIDをつけること 
serverID 1 

# 1台目のサーバ情報 
syncrepl rid=001 
  provider=ldap://10.0.0.62 
  bindmethod=simple 
  binddn="cn=Manager,dc=example,dc=com" 
  credentials=secret 
  searchbase="dc=example,dc=com" 
  schemachecking=on 
  type=refreshAndPersist 
  retry="10 +" 

# 2台目のサーバ情報 
syncrepl rid=002 
  provider=ldap://10.0.0.63 
  bindmethod=simple 
  binddn="cn=Manager,dc=example,dc=com" 
  credentials=secret 
  searchbase="dc=example,dc=com" 
  schemachecking=on 
  type=refreshAndPersist 
  retry="10 +" 

# ミラーモードを有効化 
mirrormode on

リスト2 cl2というノードのslapd.conf

include		/etc/openldap/schema/corba.schema 
include		/etc/openldap/schema/core.schema 
include		/etc/openldap/schema/cosine.schema 
include		/etc/openldap/schema/duaconf.schema 
include		/etc/openldap/schema/dyngroup.schema 
include		/etc/openldap/schema/inetorgperson.schema 
include		/etc/openldap/schema/java.schema 
include		/etc/openldap/schema/misc.schema 
include		/etc/openldap/schema/nis.schema 
include		/etc/openldap/schema/openldap.schema 
include		/etc/openldap/schema/ppolicy.schema 
include		/etc/openldap/schema/collective.schema 

allow		bind_v2 
database	monitor 
database	bdb 
suffix		"dc=example,dc=com" 
rootdn		"cn=Manager,dc=example,dc=com" 
rootpw		secret 
directory	/var/lib/ldap 
loglevel	256 
moduleload	syncprov.la 

# Indices to maintain for this database 
index objectClass                       eq,pres 
index ou,cn,mail,surname,givenname      eq,pres,sub 
index uidNumber,gidNumber,loginShell    eq,pres 
index uid,memberUid                     eq,pres,sub 
index nisMapName,nisMapEntry            eq,pres,sub 
index entryUUID                         eq,pres 

overlay syncprov 

# それぞれのノードでユニークなサーバIDをつけること 
serverID 2

# 1台目のサーバ情報 
syncrepl rid=001 
  provider=ldap://10.0.0.62 
  bindmethod=simple 
  binddn="cn=Manager,dc=example,dc=com" 
  credentials=secret 
  searchbase="dc=example,dc=com" 
  schemachecking=on 
  type=refreshAndPersist 
  retry="10 +" 

# 2台目のサーバ情報 
syncrepl rid=002 
  provider=ldap://10.0.0.63 
  bindmethod=simple 
  binddn="cn=Manager,dc=example,dc=com" 
  credentials=secret 
  searchbase="dc=example,dc=com" 
  schemachecking=on 
  type=refreshAndPersist 
  retry="10 +" 

# ミラーモードを有効化 
mirrormode on

ミラーモードを設定する上での主なポイントは次の通りです。

  • 両ノードのsyncrepl設定を行う
  • mirrormode onを指定する
  • それぞれのノードでserverIDを指定する(これ以外の設定は同じ!)

次に,同時更新テストのため,リスト3のようなスクリプトを用いました。ごらんの通り,このスクリプトは1万件のエントリを表示しますので,パイプを使ってldapaddコマンドに渡します。

リスト3 add_many1.sh

#!/bin/sh 
i=0 
host=`hostname --short` 
while [ $i -lt 10000 ]; do 
  echo "dn: cn=${host}_${i},ou=people,dc=example,dc=com" 
  echo "objectClass: person" 
  echo "cn: ${host}_${i}" 
  echo "sn: ${host}_${i}" 
  echo "" 
  i=`expr $i + 1` 
done

では,このスクリプトを2ノード上で,次のようにほぼ同時に実行してみます。

cl1というノードで実行

./add_many1.sh | ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret

cl2というノードで実行

./add_many1.sh | ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret

筆者の環境では,処理が完了するのに,それぞれ約210秒ほどかかりましたので,追加処理のスループットとしては約47件/秒となりました。さらに,それぞれのノードでデータの件数を確認してみると,次のようになっていました。

cl1というノードで実行

# slapcat | grep '^dn: cn=c' | wc -l 
19622

cl2というノードで実行

# slapcat | grep '^dn: cn=c' | wc -l 
19954

このように,両サーバで合計2万件のデータを登録したはずが,何件かの同時書き込みにより100件以上が不整合となってしまっています.つまり,複数のクライアントからの更新処理が47件/秒の割合で発生するような環境では,同時書き込みによる不整合が発生してしまう可能性が考えられることになります。

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。

コメント

コメントの記入